freesolo-flash-dev 1.2.119__tar.gz → 1.2.120__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.119 → freesolo_flash_dev-1.2.120}/CHANGELOG.md +14 -4
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/PKG-INFO +16 -10
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/README.md +15 -9
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/SELF_HOSTING.md +25 -32
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docs/serving-contract.md +17 -4
- freesolo_flash_dev-1.2.120/flash/cli/commands/serving/deploy.py +284 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/serving/identity.py +28 -57
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/serving/status.py +16 -29
- freesolo_flash_dev-1.2.120/flash/cli/commands/serving/undeploy.py +103 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/serve_parser.py +10 -27
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/core/catalog.py +24 -2
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/__main__.py +3 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/bootstrap.py +4 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/launch.py +2 -2
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/materialize.py +3 -3
- freesolo_flash_dev-1.2.120/flash/serve/app/progress.py +113 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/__init__.py +1 -6
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/_serialization.py +10 -20
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/_urls.py +0 -26
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/credentials.py +1 -25
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/planning.py +1 -1
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/types.py +18 -147
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/profiles.py +213 -135
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/common/records.py +7 -16
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/execution/lifecycle.py +2 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/execution/operations.py +2 -2
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/planning/plan.py +1 -1
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/readiness_checks/readiness.py +3 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/ops/serving_resources.py +20 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/pyproject.toml +2 -2
- freesolo_flash_dev-1.2.120/scripts/qualify_serving_profile.py +57 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_catalog_consistency.py +27 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_serve_deploy.py +278 -422
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_serve_status.py +39 -89
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_serve_undeploy.py +64 -152
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lora_rank_preflight.py +24 -12
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_app_bootstrap_http.py +86 -1
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_app_launch.py +17 -1
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_app_manifest.py +51 -0
- freesolo_flash_dev-1.2.120/tests/test_serve_app_progress.py +187 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_control.py +195 -326
- freesolo_flash_dev-1.2.120/tests/test_serve_docs.py +69 -0
- freesolo_flash_dev-1.2.120/tests/test_serve_modal_contract_lock.py +167 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_modal_sdk.py +49 -0
- freesolo_flash_dev-1.2.120/tests/test_serve_profile_qualification.py +77 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_profiles.py +148 -104
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_provisioning_common.py +2 -2
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_provisioning_modal.py +43 -1
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_serving_resources.py +48 -40
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serving_context_preflight.py +13 -3
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_spec_and_validation.py +19 -4
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_train_context_preflight.py +23 -6
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/uv.lock +1 -1
- freesolo_flash_dev-1.2.119/flash/cli/commands/serving/deploy.py +0 -332
- freesolo_flash_dev-1.2.119/flash/cli/commands/serving/undeploy.py +0 -177
- freesolo_flash_dev-1.2.119/flash/serve/app/progress.py +0 -18
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/lifecycle.py +0 -83
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/mutations.py +0 -46
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/operations.py +0 -992
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/plan.py +0 -221
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/probe.py +0 -74
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/protocol.py +0 -451
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/readiness.py +0 -683
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/resources.py +0 -316
- freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod/transport.py +0 -295
- freesolo_flash_dev-1.2.119/tests/serving_conformance/__init__.py +0 -0
- freesolo_flash_dev-1.2.119/tests/test_serve_provisioning_runpod.py +0 -4630
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.env.example +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/imports.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/push.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/support/verl_policy.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/entry/worker.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/instance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/provider.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/_lifecycle/net/worker.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/base.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/realized.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/cost.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/jobs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/polling.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/execution/resources.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/client/api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/accounting/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/status.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/http.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/deploy.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serve/provisioning/runpod → freesolo_flash_dev-1.2.120/flash/serve/request}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serve/request → freesolo_flash_dev-1.2.120/flash/server/asgi}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/asgi/app.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/asgi → freesolo_flash_dev-1.2.120/flash/server/billing}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/billing → freesolo_flash_dev-1.2.120/flash/server/domain}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/domain → freesolo_flash_dev-1.2.120/flash/server/domain/ops}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/ops/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/domain/ops → freesolo_flash_dev-1.2.120/flash/server/domain/registry}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/registry/envs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/domain/registry → freesolo_flash_dev-1.2.120/flash/server/domain/teacher}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/teacher/broker.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/teacher/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/domain/teacher/requests.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/domain/teacher → freesolo_flash_dev-1.2.120/flash/server/platform}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/server/platform → freesolo_flash_dev-1.2.120/flash/serving}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/app/README.md +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/app/modal_app.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving → freesolo_flash_dev-1.2.120/flash/serving/src/accounting}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/accounting/usage_facts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/accounting/usage_outbox.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving/src/accounting → freesolo_flash_dev-1.2.120/flash/serving/src/engine}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/boot.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/generation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/lora_engine.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/model_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving/src/engine → freesolo_flash_dev-1.2.120/flash/serving/src/http}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/context.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/headers.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/router.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving/src/http → freesolo_flash_dev-1.2.120/flash/serving/src/io}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/responses.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving/src/io → freesolo_flash_dev-1.2.120/flash/serving/src/store}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.2.119/flash/serving/src/store → freesolo_flash_dev-1.2.120/flash/teacher}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.2.119/flash/teacher → freesolo_flash_dev-1.2.120/tests/live}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_base_model_serving.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_chat_auth.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_chat_authorizer.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_checkpoint_model_validation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_model_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_multimodal.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_per_model_gpu.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_router.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_router_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_router_edge_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_serve_reasoning_split.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_serve_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_usage_outbox.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving/test_usage_reporter.py +0 -0
- {freesolo_flash_dev-1.2.119/tests/live → freesolo_flash_dev-1.2.120/tests/serving_conformance}/__init__.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_managed_chat_revisions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -25,13 +25,23 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
25
25
|
|
|
26
26
|
### Changed
|
|
27
27
|
|
|
28
|
-
- Active training
|
|
29
|
-
`Qwen/Qwen3.
|
|
28
|
+
- Active training now exposes exactly `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
|
|
29
|
+
`Qwen/Qwen3.6-35B-A3B`. Hosted serving remains active for 9B and 35B-A3B; hosted Qwen3.8 27B
|
|
30
|
+
remains inactive. Qwen3.8 uses the immutable BF16 revision
|
|
30
31
|
`1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0` and official native block-FP8 serving revision
|
|
31
|
-
`017b9c7af6b5689d5dd426a76e0bc077eb5ca20a
|
|
32
|
+
`017b9c7af6b5689d5dd426a76e0bc077eb5ca20a`, with the logical base and tokenizer provenance kept
|
|
33
|
+
distinct from the served checkpoint. The Qwen3.5 0.8B, 2B, and 4B tiers and
|
|
32
34
|
`Qwen/Qwen3.6-27B` cannot activate, while historical status, accepted billing retry,
|
|
33
35
|
cancellation, cleanup, hosted revocation, and exact identity-based undeploy remain available.
|
|
34
|
-
Qwen3.6 27B adapters are not compatible with Qwen3.8.
|
|
36
|
+
Qwen3.6 27B adapters are not compatible with Qwen3.8.
|
|
37
|
+
- Customer-owned serving is now Modal-only and requires explicit `--provider modal`. Modal remains
|
|
38
|
+
live-qualified for all three active models. The 27B and 35B-A3B qualifications stay bound to the
|
|
39
|
+
exact certified serving image digest. Each deployment still serves one exact base model. The 27B
|
|
40
|
+
engine keeps its `H100!` placement and distinct served checkpoint and tokenizer provenance. The
|
|
41
|
+
35B-A3B engine keeps its H200, BF16, FP8 KV, 32K context, eight-sequence, 4096 batched-token, and
|
|
42
|
+
six rank-64 LoRA-slot contract. Customer-serving RunPod commands, profiles, identities, and
|
|
43
|
+
lifecycle code are removed without a compatibility or teardown shim. Managed RunPod training,
|
|
44
|
+
serverless workers, dependencies, provider routing, artifacts, and caching are unchanged.
|
|
35
45
|
- `[train] init_from_adapter` now works for every source/target algorithm pair. SFT was rejected as
|
|
36
46
|
a warm-start target, so an adapter could be continued only by GRPO or OPD; that restriction
|
|
37
47
|
described the retired trl SFT backend, and the verl backend that replaced it loads a warm-start
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.120
|
|
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
|
|
@@ -116,10 +116,10 @@ point of use; install it with `pip install freesolo`.
|
|
|
116
116
|
|
|
117
117
|
Two components stay Freesolo-operated and are **not** in this repository:
|
|
118
118
|
|
|
119
|
-
| Component | Where it lives | Self-hosted equivalent
|
|
120
|
-
| ------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
121
|
-
| Multi-tenant identity | `api.freesolo.co`; verifies keys and owns projects/orgs | `FLASH_STANDALONE=1` runs single-tenant on your own key
|
|
122
|
-
| Hosted Multi-LoRA serving | `serve.freesolo.co`, deployed from `flash/serving/`; `flash/serve/` owns the client and shared runtime | `flash serve deploy` provisions serving in your own Modal
|
|
119
|
+
| Component | Where it lives | Self-hosted equivalent |
|
|
120
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- |
|
|
121
|
+
| Multi-tenant identity | `api.freesolo.co`; verifies keys and owns projects/orgs | `FLASH_STANDALONE=1` runs single-tenant on your own key |
|
|
122
|
+
| Hosted Multi-LoRA serving | `serve.freesolo.co`, deployed from `flash/serving/`; `flash/serve/` owns the client and shared runtime | `flash serve deploy` provisions serving in your own Modal account |
|
|
123
123
|
|
|
124
124
|
So there are three ways to use Flash: against the **hosted service**, **self-hosted** against
|
|
125
125
|
your own GPU accounts, or as **training and provider code to read and modify**. The training
|
|
@@ -127,9 +127,13 @@ path is self-hostable end to end — see **[SELF_HOSTING.md](SELF_HOSTING.md)**.
|
|
|
127
127
|
|
|
128
128
|
## Using the hosted service
|
|
129
129
|
|
|
130
|
-
The active training
|
|
131
|
-
`Qwen/Qwen3.6-35B-A3B`.
|
|
132
|
-
|
|
130
|
+
The active training catalog is `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
|
|
131
|
+
`Qwen/Qwen3.6-35B-A3B`. Hosted serving is active for 9B and 35B-A3B; hosted Qwen3.8 27B remains
|
|
132
|
+
inactive. The retired dense Qwen3.6 27B identity is never translated into Qwen3.8. Customer-owned
|
|
133
|
+
Modal supports all three active models; 27B and 35B-A3B are bound to the certified serving image
|
|
134
|
+
digest. Customer-owned `flash serve` requires explicit `--provider modal`. Customer-serving RunPod
|
|
135
|
+
commands and deployment identities are unsupported, with no migration or teardown shim. Managed
|
|
136
|
+
RunPod training remains supported and unchanged.
|
|
133
137
|
|
|
134
138
|
`flash login` is not interactive. Export `FREESOLO_API_KEY` first so the key does not appear in process listings:
|
|
135
139
|
|
|
@@ -305,8 +309,10 @@ External bearer tokens are rejected rather than accepted unverified. A standalon
|
|
|
305
309
|
**single-tenant** — whoever holds that key can spend your GPU budget, so keep it off
|
|
306
310
|
untrusted networks. See [the security model](SELF_HOSTING.md#the-security-model).
|
|
307
311
|
|
|
308
|
-
`flash serve deploy` provisions serving in your own Modal
|
|
309
|
-
|
|
312
|
+
`flash serve deploy` provisions serving in your own Modal account and requires explicit
|
|
313
|
+
`--provider modal`. Each deployment owns one exact base model and its compatible adapters; another
|
|
314
|
+
base model requires another deployment. Customer-serving RunPod identities are unsupported.
|
|
315
|
+
It implements the same contract `flash/serve/` speaks; [docs/serving-contract.md](docs/serving-contract.md)
|
|
310
316
|
documents it if you would rather write your own.
|
|
311
317
|
|
|
312
318
|
The GPU worker image is public and published under an explicit CUDA tag, not `latest`:
|
|
@@ -33,10 +33,10 @@ point of use; install it with `pip install freesolo`.
|
|
|
33
33
|
|
|
34
34
|
Two components stay Freesolo-operated and are **not** in this repository:
|
|
35
35
|
|
|
36
|
-
| Component | Where it lives | Self-hosted equivalent
|
|
37
|
-
| ------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
38
|
-
| Multi-tenant identity | `api.freesolo.co`; verifies keys and owns projects/orgs | `FLASH_STANDALONE=1` runs single-tenant on your own key
|
|
39
|
-
| Hosted Multi-LoRA serving | `serve.freesolo.co`, deployed from `flash/serving/`; `flash/serve/` owns the client and shared runtime | `flash serve deploy` provisions serving in your own Modal
|
|
36
|
+
| Component | Where it lives | Self-hosted equivalent |
|
|
37
|
+
| ------------------------- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- |
|
|
38
|
+
| Multi-tenant identity | `api.freesolo.co`; verifies keys and owns projects/orgs | `FLASH_STANDALONE=1` runs single-tenant on your own key |
|
|
39
|
+
| Hosted Multi-LoRA serving | `serve.freesolo.co`, deployed from `flash/serving/`; `flash/serve/` owns the client and shared runtime | `flash serve deploy` provisions serving in your own Modal account |
|
|
40
40
|
|
|
41
41
|
So there are three ways to use Flash: against the **hosted service**, **self-hosted** against
|
|
42
42
|
your own GPU accounts, or as **training and provider code to read and modify**. The training
|
|
@@ -44,9 +44,13 @@ path is self-hostable end to end — see **[SELF_HOSTING.md](SELF_HOSTING.md)**.
|
|
|
44
44
|
|
|
45
45
|
## Using the hosted service
|
|
46
46
|
|
|
47
|
-
The active training
|
|
48
|
-
`Qwen/Qwen3.6-35B-A3B`.
|
|
49
|
-
|
|
47
|
+
The active training catalog is `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
|
|
48
|
+
`Qwen/Qwen3.6-35B-A3B`. Hosted serving is active for 9B and 35B-A3B; hosted Qwen3.8 27B remains
|
|
49
|
+
inactive. The retired dense Qwen3.6 27B identity is never translated into Qwen3.8. Customer-owned
|
|
50
|
+
Modal supports all three active models; 27B and 35B-A3B are bound to the certified serving image
|
|
51
|
+
digest. Customer-owned `flash serve` requires explicit `--provider modal`. Customer-serving RunPod
|
|
52
|
+
commands and deployment identities are unsupported, with no migration or teardown shim. Managed
|
|
53
|
+
RunPod training remains supported and unchanged.
|
|
50
54
|
|
|
51
55
|
`flash login` is not interactive. Export `FREESOLO_API_KEY` first so the key does not appear in process listings:
|
|
52
56
|
|
|
@@ -222,8 +226,10 @@ External bearer tokens are rejected rather than accepted unverified. A standalon
|
|
|
222
226
|
**single-tenant** — whoever holds that key can spend your GPU budget, so keep it off
|
|
223
227
|
untrusted networks. See [the security model](SELF_HOSTING.md#the-security-model).
|
|
224
228
|
|
|
225
|
-
`flash serve deploy` provisions serving in your own Modal
|
|
226
|
-
|
|
229
|
+
`flash serve deploy` provisions serving in your own Modal account and requires explicit
|
|
230
|
+
`--provider modal`. Each deployment owns one exact base model and its compatible adapters; another
|
|
231
|
+
base model requires another deployment. Customer-serving RunPod identities are unsupported.
|
|
232
|
+
It implements the same contract `flash/serve/` speaks; [docs/serving-contract.md](docs/serving-contract.md)
|
|
227
233
|
documents it if you would rather write your own.
|
|
228
234
|
|
|
229
235
|
The GPU worker image is public and published under an explicit CUDA tag, not `latest`:
|
|
@@ -22,9 +22,11 @@ Two credentials and at least one GPU account:
|
|
|
22
22
|
|
|
23
23
|
Everything else is optional.
|
|
24
24
|
|
|
25
|
-
The active training catalog is Qwen3.5 9B, Qwen3.8 27B, and Qwen3.6 35B-A3B.
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
The active training catalog is Qwen3.5 9B, Qwen3.8 27B, and Qwen3.6 35B-A3B. Hosted Qwen3.8
|
|
26
|
+
27B remains inactive. Customer-owned Modal supports all three models; 27B and 35B-A3B are bound to
|
|
27
|
+
the certified serving image digest. Customer-owned `flash serve` requires explicit
|
|
28
|
+
`--provider modal`. Customer-serving RunPod commands and identities are unsupported, with no
|
|
29
|
+
migration or teardown shim. Managed RunPod training remains supported and unchanged.
|
|
28
30
|
|
|
29
31
|
## Quickstart
|
|
30
32
|
|
|
@@ -363,10 +365,23 @@ without `FLASH_STANDALONE` and set `FREESOLO_BASE_URL` to point at it.
|
|
|
363
365
|
|
|
364
366
|
## Serving
|
|
365
367
|
|
|
366
|
-
`flash serve deploy` provisions serving in **your own** Modal
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
368
|
+
`flash serve deploy` provisions serving in **your own** Modal account, running the published worker
|
|
369
|
+
image against one exact base model and that model's compatible adapters. A separate deployment is
|
|
370
|
+
required for each base model. Training and export remain independent of serving. The required
|
|
371
|
+
provider argument has the sole accepted value `--provider modal`.
|
|
372
|
+
Catalog serving checkpoint repositories are informational only and are never resolved by the
|
|
373
|
+
training path.
|
|
374
|
+
|
|
375
|
+
Customer-owned Modal is live-qualified for Qwen3.5 9B, Qwen3.8 27B, and Qwen3.6 35B-A3B. The 27B
|
|
376
|
+
and 35B-A3B qualifications are bound to the certified serving image digest. The 27B engine runs on
|
|
377
|
+
`H100!` and serves the pinned `Qwen/Qwen3.8-27B-FP8` checkpoint while retaining
|
|
378
|
+
`Qwen/Qwen3.8-27B` as its logical base and tokenizer provenance. The 35B-A3B engine serves the BF16
|
|
379
|
+
model on one H200 with FP8 KV cache, a 32K context, eight sequences, a 4096 batched-token cap, and
|
|
380
|
+
six rank-64 LoRA slots.
|
|
381
|
+
Customer-serving RunPod lifecycle commands and deployment identities are unsupported. There is no
|
|
382
|
+
migration, status, undeploy, or teardown shim for an old RunPod identity. This does not affect the
|
|
383
|
+
managed RunPod training provider, serverless workers, artifact caching, or `RUNPOD_API_KEY` used by
|
|
384
|
+
the training control plane.
|
|
370
385
|
|
|
371
386
|
```bash
|
|
372
387
|
# the `server` extra, not the bare install: `serve deploy` resolves the adapter through
|
|
@@ -392,31 +407,9 @@ flash serve deploy \
|
|
|
392
407
|
--modal-region us-east
|
|
393
408
|
```
|
|
394
409
|
|
|
395
|
-
The three `--modal-*` placement flags are required for `--provider modal
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
`modal placement requires environment, region, workspace_name`.
|
|
399
|
-
|
|
400
|
-
For RunPod, export `RUNPOD_API_KEY` instead and swap the placement flags rather than adding to
|
|
401
|
-
them -- `placement_for` rejects the other provider's inputs instead of ignoring them, so keeping
|
|
402
|
-
`--modal-*` alongside `--provider runpod` fails before anything is created:
|
|
403
|
-
|
|
404
|
-
```bash
|
|
405
|
-
flash serve deploy \
|
|
406
|
-
--provider runpod \
|
|
407
|
-
--model Qwen/Qwen3.5-9B \
|
|
408
|
-
--run <run-id> \
|
|
409
|
-
--deployment-id my-9b-serving \
|
|
410
|
-
--image ghcr.io/freesolo-co/freesolo-flash-serve@sha256:<digest> \
|
|
411
|
-
--artifact-repo <hub-repo> \
|
|
412
|
-
--artifact-subfolder <path-within-repo> \
|
|
413
|
-
--lora-rank 32 \
|
|
414
|
-
--runpod-account <your-account-id> \
|
|
415
|
-
--runpod-data-center <data-center-id>
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
Both `--runpod-*` flags are required and must be nonempty, for the same reason the `--modal-*`
|
|
419
|
-
trio is: `--help` lists them as optional only because each provider takes its own set.
|
|
410
|
+
The three `--modal-*` placement flags are required for `--provider modal`. Omitting them exits with
|
|
411
|
+
`modal placement requires environment, region, workspace_name`. Passing `--provider runpod` is
|
|
412
|
+
rejected by argument parsing before Hub resolution, credential reads, or provider access.
|
|
420
413
|
|
|
421
414
|
Provider credentials are read from the process environment for the duration of a single call and are
|
|
422
415
|
never written to the deployment record, logs, or command arguments — so any later resize or teardown
|
|
@@ -3,10 +3,23 @@
|
|
|
3
3
|
`flash models deploy`, `chat`, and `undeploy` use an HTTP serving backend. `flash/serve/` owns the
|
|
4
4
|
client, shared runtime, and customer-owned provider deployment. Freesolo's hosted backend
|
|
5
5
|
(`flash/serving/`) is another implementation of this contract.
|
|
6
|
-
A deployment serves one base model and its LoRA adapters.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
A deployment serves one exact base model and its compatible LoRA adapters. A different base model
|
|
7
|
+
requires a separate deployment. Use `flash serve deploy --provider modal` to provision one in your
|
|
8
|
+
own Modal account, or implement these endpoints and run the conformance suite below.
|
|
9
|
+
|
|
10
|
+
Customer-owned Modal is live-qualified for `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
|
|
11
|
+
`Qwen/Qwen3.6-35B-A3B`. The 27B and 35B-A3B qualifications are bound to the exact certified serving
|
|
12
|
+
image digest; another digest remains available for offline planning but cannot allocate Modal.
|
|
13
|
+
Hosted Qwen3.8 27B remains inactive. Its customer-owned engine runs on
|
|
14
|
+
`H100!` and serves the pinned `Qwen/Qwen3.8-27B-FP8` checkpoint while preserving
|
|
15
|
+
`Qwen/Qwen3.8-27B` as the distinct logical base and tokenizer provenance. The 35B-A3B engine serves
|
|
16
|
+
BF16 weights on one H200 with FP8 KV cache,
|
|
17
|
+
a 32K context, eight sequences, a 4096 batched-token cap, and six rank-64 LoRA slots.
|
|
18
|
+
|
|
19
|
+
Customer-owned `flash serve` is Modal-only and requires the explicit provider argument. Historical
|
|
20
|
+
customer-serving RunPod deployment identities are unsupported, with no migration, status, undeploy,
|
|
21
|
+
or teardown shim. Managed RunPod training remains supported and unchanged. Retired Qwen3.6 27B is
|
|
22
|
+
never translated into Qwen3.8 27B.
|
|
10
23
|
|
|
11
24
|
## Identity model
|
|
12
25
|
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""provision one exact deployment in the user's own modal account.
|
|
2
|
+
|
|
3
|
+
Provider credentials are read from the process environment for the duration of one call and wrapped
|
|
4
|
+
in the request-scoped credential boundary. They are never accepted as arguments, written anywhere,
|
|
5
|
+
or logged. Provider failures surface as sanitized codes rather than raw responses.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
import time
|
|
13
|
+
|
|
14
|
+
from flash.serve.control import ModalCredentials
|
|
15
|
+
from flash.serve.provisioning import (
|
|
16
|
+
FreshDeploymentArtifactTokenRequired,
|
|
17
|
+
InterruptedProvisioning,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
MODAL_TOKEN_ID_ENV = "MODAL_TOKEN_ID"
|
|
21
|
+
MODAL_TOKEN_SECRET_ENV = "MODAL_TOKEN_SECRET"
|
|
22
|
+
# the serving app authenticates callers with this. a provider endpoint url is public, so without
|
|
23
|
+
# it anyone who finds the url can load adapters and spend the customer's gpu budget.
|
|
24
|
+
INFERENCE_KEY_ENV = "FLASH_SERVING_KEY"
|
|
25
|
+
# the container hydrates its adapter from the hub itself, so it needs the same read token the
|
|
26
|
+
# control plane used to resolve that adapter. an artifact repo is private by default, and without
|
|
27
|
+
# this the launcher reaches `_prepare_cache` with nothing to authenticate as and dies after the
|
|
28
|
+
# provider has already created and started billing for every resource.
|
|
29
|
+
ARTIFACT_TOKEN_ENV = "HF_TOKEN"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _err(message: str) -> int:
|
|
33
|
+
print(f"error: {message}", file=sys.stderr)
|
|
34
|
+
return 1
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _required_env(name: str) -> str:
|
|
38
|
+
value = os.environ.get(name, "").strip()
|
|
39
|
+
if not value:
|
|
40
|
+
raise ValueError(f"{name} is not set")
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _optional_env(name: str) -> str | None:
|
|
45
|
+
"""read a token that is genuinely optional, mapping unset and blank alike to absence."""
|
|
46
|
+
|
|
47
|
+
return os.environ.get(name, "").strip() or None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _require_modal_provider(provider: object) -> None:
|
|
51
|
+
if provider != "modal":
|
|
52
|
+
raise ValueError("provider must be modal")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _credentials() -> ModalCredentials:
|
|
56
|
+
"""build request-scoped modal credentials from the environment."""
|
|
57
|
+
|
|
58
|
+
return ModalCredentials(
|
|
59
|
+
token_id=_required_env(MODAL_TOKEN_ID_ENV),
|
|
60
|
+
token_secret=_required_env(MODAL_TOKEN_SECRET_ENV),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _image(reference: str):
|
|
65
|
+
from flash.serve.provisioning import ServingImage
|
|
66
|
+
|
|
67
|
+
if "@" not in reference:
|
|
68
|
+
raise ValueError(
|
|
69
|
+
"the serving image must be digest-qualified (name@sha256:...). a tag can be moved "
|
|
70
|
+
"to different content after the deployment is recorded"
|
|
71
|
+
)
|
|
72
|
+
_, digest = reference.rsplit("@", 1)
|
|
73
|
+
return ServingImage(reference=reference, digest=digest)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _report_handle(handle, *, endpoint: bool = True) -> None:
|
|
77
|
+
"""print only sanitized provider identity, never request credentials."""
|
|
78
|
+
|
|
79
|
+
if endpoint:
|
|
80
|
+
print(f"endpoint {handle.public_url}")
|
|
81
|
+
print(f"app id {handle.app_id}")
|
|
82
|
+
print(f"volume id {handle.volume_id}")
|
|
83
|
+
print(f"secret id {handle.inference_secret_id}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _report(result, bundle) -> int:
|
|
87
|
+
print(f"deployment {result.deployment_id} generation {result.generation}")
|
|
88
|
+
print(f"provider {result.provider}")
|
|
89
|
+
print(f"engine {result.engine_id}")
|
|
90
|
+
print(f"image {result.image_digest}")
|
|
91
|
+
print(f"status {result.status}")
|
|
92
|
+
handle = result.handle
|
|
93
|
+
if handle is not None:
|
|
94
|
+
_report_handle(handle)
|
|
95
|
+
_report_identity(bundle)
|
|
96
|
+
if result.status == "ready":
|
|
97
|
+
return 0
|
|
98
|
+
if result.error_code:
|
|
99
|
+
print(f"error {result.error_code}", file=sys.stderr)
|
|
100
|
+
if result.error_reason:
|
|
101
|
+
print(f"reason {result.error_reason}", file=sys.stderr)
|
|
102
|
+
if str(result.error_reason or "").startswith("artifact_cleanup_") and handle is not None:
|
|
103
|
+
# every artifact-cleanup reason is raised after readiness proved, so the provider resource
|
|
104
|
+
# is live and billing whatever the status says.
|
|
105
|
+
print(
|
|
106
|
+
f"\nthe service reached readiness on app {handle.app_id}, but artifact cleanup did not "
|
|
107
|
+
"settle. the app is live and billing. run `flash serve status` to inspect the "
|
|
108
|
+
"deployment, then `flash serve undeploy` to stop it billing if you do not want it.",
|
|
109
|
+
file=sys.stderr,
|
|
110
|
+
)
|
|
111
|
+
elif result.status == "outcome_unknown":
|
|
112
|
+
# the provider may or may not hold live resources. saying "failed" here would invite a
|
|
113
|
+
# retry that double-provisions and bills twice.
|
|
114
|
+
print(
|
|
115
|
+
"\nthe provider outcome could not be confirmed. resources may exist; run `flash serve "
|
|
116
|
+
"status` to inspect them, then `flash serve undeploy` to stop them billing before "
|
|
117
|
+
"retrying rather than provisioning again.",
|
|
118
|
+
file=sys.stderr,
|
|
119
|
+
)
|
|
120
|
+
return 1
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _report_identity(bundle) -> None:
|
|
124
|
+
"""print recovery identity without replacing the reported outcome if encoding fails."""
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
from flash.cli.commands.serving.identity import encode_deployment_identity
|
|
128
|
+
|
|
129
|
+
print(f"identity {encode_deployment_identity(bundle)}")
|
|
130
|
+
except Exception:
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _build_provider_plan(bundle):
|
|
135
|
+
"""return the validated modal plan without contacting the provider."""
|
|
136
|
+
|
|
137
|
+
from flash.serve.provisioning.modal.planning.plan import build_modal_create_plan
|
|
138
|
+
|
|
139
|
+
return build_modal_create_plan(bundle, phase="finalized")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _runtime_secrets():
|
|
143
|
+
"""build request-scoped endpoint secrets from the environment."""
|
|
144
|
+
|
|
145
|
+
from flash.serve.provisioning import ServingRuntimeSecrets
|
|
146
|
+
|
|
147
|
+
return ServingRuntimeSecrets(
|
|
148
|
+
inference_token=_required_env(INFERENCE_KEY_ENV),
|
|
149
|
+
artifact_token=_optional_env(ARTIFACT_TOKEN_ENV),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _deployment_bundle(args):
|
|
154
|
+
"""build the exact immutable modal deployment input shared by lifecycle commands."""
|
|
155
|
+
|
|
156
|
+
from flash.serve.control import DeploymentRequest
|
|
157
|
+
from flash.serve.deployment.profiles import get_profile, placement_for
|
|
158
|
+
from flash.serve.deployment.resolve import (
|
|
159
|
+
execution_inputs,
|
|
160
|
+
resolve_adapter,
|
|
161
|
+
resolve_base_revision,
|
|
162
|
+
)
|
|
163
|
+
from flash.server.domain.ops.serving_resources import resolve_deployment_bundle
|
|
164
|
+
|
|
165
|
+
_require_modal_provider(args.provider)
|
|
166
|
+
profile = get_profile(args.model)
|
|
167
|
+
image = _image(args.image)
|
|
168
|
+
placement = placement_for(
|
|
169
|
+
profile,
|
|
170
|
+
args.provider,
|
|
171
|
+
workspace_name=getattr(args, "modal_workspace", "") or "",
|
|
172
|
+
environment=getattr(args, "modal_environment", "") or "",
|
|
173
|
+
region=getattr(args, "modal_region", "") or "",
|
|
174
|
+
# "" means the no-suffix environment, which is a real modal configuration.
|
|
175
|
+
web_suffix=(getattr(args, "modal_web_suffix", "") or "") or None,
|
|
176
|
+
)
|
|
177
|
+
logical_base_revision = resolve_base_revision(args.model)
|
|
178
|
+
resolved = resolve_adapter(
|
|
179
|
+
run_id=args.run,
|
|
180
|
+
artifact_repo_id=args.artifact_repo,
|
|
181
|
+
artifact_subfolder=args.artifact_subfolder,
|
|
182
|
+
artifact_repo_type=getattr(args, "artifact_repo_type", "dataset"),
|
|
183
|
+
base_model=args.model,
|
|
184
|
+
base_model_revision=logical_base_revision,
|
|
185
|
+
lora_rank=args.lora_rank,
|
|
186
|
+
checkpoint_step=getattr(args, "checkpoint_step", None),
|
|
187
|
+
thinking_default=bool(getattr(args, "thinking", False)),
|
|
188
|
+
)
|
|
189
|
+
logical_base_revision = resolved.adapter.base_model_revision
|
|
190
|
+
if profile.served_model == args.model:
|
|
191
|
+
model_revision = logical_base_revision
|
|
192
|
+
elif profile.served_model_revision is not None:
|
|
193
|
+
model_revision = profile.served_model_revision
|
|
194
|
+
else:
|
|
195
|
+
model_revision = resolve_base_revision(profile.served_model)
|
|
196
|
+
|
|
197
|
+
if profile.tokenizer_model == profile.served_model:
|
|
198
|
+
tokenizer_revision = model_revision
|
|
199
|
+
elif profile.tokenizer_model == args.model:
|
|
200
|
+
tokenizer_revision = logical_base_revision
|
|
201
|
+
else:
|
|
202
|
+
tokenizer_revision = resolve_base_revision(profile.tokenizer_model)
|
|
203
|
+
|
|
204
|
+
engine = profile.engine(
|
|
205
|
+
model_revision=model_revision,
|
|
206
|
+
tokenizer_revision=tokenizer_revision,
|
|
207
|
+
image=image,
|
|
208
|
+
)
|
|
209
|
+
request = DeploymentRequest(
|
|
210
|
+
deployment_id=args.deployment_id,
|
|
211
|
+
generation=args.generation,
|
|
212
|
+
provider=args.provider,
|
|
213
|
+
placement=placement,
|
|
214
|
+
engine=engine,
|
|
215
|
+
adapters=(resolved.adapter,),
|
|
216
|
+
)
|
|
217
|
+
return resolve_deployment_bundle(
|
|
218
|
+
request,
|
|
219
|
+
execution_inputs(profile, image, (resolved,)),
|
|
220
|
+
image,
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def cmd_serve_deploy(args) -> int:
|
|
225
|
+
try:
|
|
226
|
+
_require_modal_provider(args.provider)
|
|
227
|
+
if not getattr(args, "dry_run", False):
|
|
228
|
+
from flash.serve.deployment.profiles import get_profile, require_live_qualification
|
|
229
|
+
|
|
230
|
+
image = _image(args.image)
|
|
231
|
+
require_live_qualification(get_profile(args.model), args.provider, image.digest)
|
|
232
|
+
bundle = _deployment_bundle(args)
|
|
233
|
+
except (ValueError, TypeError) as exc:
|
|
234
|
+
return _err(str(exc))
|
|
235
|
+
|
|
236
|
+
from flash.server.domain.ops.serving_resources import dry_run_deployment
|
|
237
|
+
|
|
238
|
+
try:
|
|
239
|
+
# validate the provider-specific hostname contract on both dry-run and allocation paths.
|
|
240
|
+
_build_provider_plan(bundle)
|
|
241
|
+
except (ValueError, TypeError) as exc:
|
|
242
|
+
return _err(str(exc))
|
|
243
|
+
|
|
244
|
+
if getattr(args, "dry_run", False):
|
|
245
|
+
for key, value in dry_run_deployment(bundle).items():
|
|
246
|
+
print(f"{key:18} {value}")
|
|
247
|
+
print("\ndry run: no provider was contacted and nothing was provisioned.")
|
|
248
|
+
return 0
|
|
249
|
+
|
|
250
|
+
try:
|
|
251
|
+
credentials = _credentials()
|
|
252
|
+
runtime_secrets = _runtime_secrets()
|
|
253
|
+
except ValueError as exc:
|
|
254
|
+
return _err(
|
|
255
|
+
f"{exc}. provider credentials are read from the environment for this one request "
|
|
256
|
+
"and are never stored"
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
deadline_at = time.monotonic() + float(args.timeout)
|
|
260
|
+
try:
|
|
261
|
+
from flash.serve.provisioning.modal.execution.operations import provision_modal_deployment
|
|
262
|
+
|
|
263
|
+
result = provision_modal_deployment(
|
|
264
|
+
bundle, credentials, runtime_secrets, deadline_at=deadline_at
|
|
265
|
+
)
|
|
266
|
+
except FreshDeploymentArtifactTokenRequired as exc:
|
|
267
|
+
return _err(f"{ARTIFACT_TOKEN_ENV} is not set. {exc}")
|
|
268
|
+
except InterruptedProvisioning:
|
|
269
|
+
# the interrupt still propagates, but first report the exact identity and billing ambiguity.
|
|
270
|
+
_report_identity(bundle)
|
|
271
|
+
_warn_unconfirmed_cleanup(args.deployment_id)
|
|
272
|
+
raise
|
|
273
|
+
return _report(result, bundle)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _warn_unconfirmed_cleanup(deployment_id: str) -> None:
|
|
277
|
+
"""say what ctrl-c actually left behind before the generic handler says aborted."""
|
|
278
|
+
|
|
279
|
+
print(
|
|
280
|
+
f"\nwarning: interrupted before ready, and modal cleanup could not be confirmed for "
|
|
281
|
+
f"{deployment_id}. resources may still exist and bill; run `flash serve status` to inspect "
|
|
282
|
+
"them, then `flash serve undeploy` before retrying rather than provisioning again.",
|
|
283
|
+
file=sys.stderr,
|
|
284
|
+
)
|
{freesolo_flash_dev-1.2.119 → freesolo_flash_dev-1.2.120}/flash/cli/commands/serving/identity.py
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""portable immutable identity for existing customer-owned serving deployments.
|
|
2
2
|
|
|
3
|
-
The
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
The Modal plan validates more than deterministic resource names: it binds the exact manifest and
|
|
4
|
+
spec into app tags. Re-resolving mutable Hub repositories is therefore neither sufficient nor
|
|
5
|
+
necessary for status or teardown. This codec carries the already-resolved, credential-free bundle
|
|
6
|
+
without persisting it.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
@@ -23,27 +23,18 @@ _BASE64URL_RE = re.compile(r"[A-Za-z0-9_-]+")
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def _placement_payload(placement) -> dict[str, object]:
|
|
26
|
-
from flash.serve.control import ModalPlacement
|
|
27
|
-
|
|
28
|
-
if type(placement) is ModalPlacement:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
"account_id": placement.account_id,
|
|
40
|
-
"container_disk_gb": placement.container_disk_gb,
|
|
41
|
-
"data_center_id": placement.data_center_id,
|
|
42
|
-
"gpu_count": placement.gpu_count,
|
|
43
|
-
"gpu_type_id": placement.gpu_type_id,
|
|
44
|
-
"volume_size_gb": placement.volume_size_gb,
|
|
45
|
-
}
|
|
46
|
-
raise TypeError("deployment identity requires an exact provider placement")
|
|
26
|
+
from flash.serve.control import ModalPlacement
|
|
27
|
+
|
|
28
|
+
if type(placement) is not ModalPlacement:
|
|
29
|
+
raise TypeError("deployment identity requires an exact ModalPlacement")
|
|
30
|
+
return {
|
|
31
|
+
"environment": placement.environment,
|
|
32
|
+
"gpu": placement.gpu,
|
|
33
|
+
"gpu_count": placement.gpu_count,
|
|
34
|
+
"region": placement.region,
|
|
35
|
+
"web_suffix": placement.web_suffix,
|
|
36
|
+
"workspace_name": placement.workspace_name,
|
|
37
|
+
}
|
|
47
38
|
|
|
48
39
|
|
|
49
40
|
def encode_deployment_identity(bundle) -> str:
|
|
@@ -120,31 +111,17 @@ def _exact_keys(value: Mapping[str, object], expected: set[str], name: str) -> N
|
|
|
120
111
|
|
|
121
112
|
|
|
122
113
|
def _placement(provider: object, value: object):
|
|
123
|
-
from flash.serve.control import ModalPlacement
|
|
114
|
+
from flash.serve.control import ModalPlacement
|
|
124
115
|
|
|
116
|
+
if provider != "modal":
|
|
117
|
+
raise ValueError("deployment identity provider must be modal")
|
|
125
118
|
payload = _mapping(value, "placement")
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return ModalPlacement(**payload)
|
|
133
|
-
if provider == "runpod":
|
|
134
|
-
_exact_keys(
|
|
135
|
-
payload,
|
|
136
|
-
{
|
|
137
|
-
"account_id",
|
|
138
|
-
"container_disk_gb",
|
|
139
|
-
"data_center_id",
|
|
140
|
-
"gpu_count",
|
|
141
|
-
"gpu_type_id",
|
|
142
|
-
"volume_size_gb",
|
|
143
|
-
},
|
|
144
|
-
"runpod placement",
|
|
145
|
-
)
|
|
146
|
-
return RunPodPlacement(**payload)
|
|
147
|
-
raise ValueError("deployment identity provider must be modal or runpod")
|
|
119
|
+
_exact_keys(
|
|
120
|
+
payload,
|
|
121
|
+
{"environment", "gpu", "gpu_count", "region", "web_suffix", "workspace_name"},
|
|
122
|
+
"modal placement",
|
|
123
|
+
)
|
|
124
|
+
return ModalPlacement(**payload)
|
|
148
125
|
|
|
149
126
|
|
|
150
127
|
def _resolved_adapters(manifest) -> tuple[object, ...]:
|
|
@@ -193,6 +170,8 @@ def decode_deployment_identity(value: str):
|
|
|
193
170
|
)
|
|
194
171
|
|
|
195
172
|
payload = _decode_payload(value)
|
|
173
|
+
if payload["provider"] != "modal":
|
|
174
|
+
raise ValueError("deployment identity provider must be modal")
|
|
196
175
|
manifest_value = payload["manifest"]
|
|
197
176
|
image_reference = payload["image_reference"]
|
|
198
177
|
if type(manifest_value) is not str or type(image_reference) is not str:
|
|
@@ -216,7 +195,7 @@ def _mismatch(flag: str) -> None:
|
|
|
216
195
|
|
|
217
196
|
|
|
218
197
|
def _validate_authored_identity(args, bundle) -> None:
|
|
219
|
-
from flash.serve.control import ModalPlacement
|
|
198
|
+
from flash.serve.control import ModalPlacement
|
|
220
199
|
|
|
221
200
|
spec = bundle.spec
|
|
222
201
|
if len(spec.adapters) != 1:
|
|
@@ -256,14 +235,6 @@ def _validate_authored_identity(args, bundle) -> None:
|
|
|
256
235
|
for flag, actual, expected in modal:
|
|
257
236
|
if actual != expected:
|
|
258
237
|
_mismatch(flag)
|
|
259
|
-
elif type(placement) is RunPodPlacement:
|
|
260
|
-
runpod = (
|
|
261
|
-
("runpod-account", placement.account_id, args.runpod_account),
|
|
262
|
-
("runpod-data-center", placement.data_center_id, args.runpod_data_center),
|
|
263
|
-
)
|
|
264
|
-
for flag, actual, expected in runpod:
|
|
265
|
-
if actual != expected:
|
|
266
|
-
_mismatch(flag)
|
|
267
238
|
else: # pragma: no cover - DeploymentSpec validation already excludes this
|
|
268
239
|
raise TypeError("deployment identity placement is invalid")
|
|
269
240
|
|