freesolo-flash-dev 1.2.121__tar.gz → 1.2.123__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docs/serving-contract.md +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/catalog.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/README.md +17 -12
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/modal_app.py +104 -63
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage.py +10 -9
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/model_config.py +31 -29
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/prequant_config.py +4 -4
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/context.py +6 -2
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/headers.py +28 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/router.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_base_model_serving.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_auth.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_authorizer.py +12 -3
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_identity_repairs.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_model_validation.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_model_config.py +16 -11
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_multimodal.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_per_model_gpu.py +10 -8
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_prequant_config.py +7 -6
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router.py +2 -2
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_coverage.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_edge_coverage.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_reasoning_split.py +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_outbox.py +19 -29
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_reporter.py +27 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_catalog_consistency.py +2 -2
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve.py +40 -4
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.env.example +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/README.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/imports.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/push.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_policy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/worker.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/instance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/provider.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/worker.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/base.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/realized.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/cost.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/jobs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/polling.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/resources.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/status.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach_reconcile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/http.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/app/progress.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/deploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/app.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/envs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/broker.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/requests.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_facts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_outbox.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/boot.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/generation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_engine.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/responses.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_bootstrap_http.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_progress.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_docs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_profiles.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.123
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
|
|
5
5
|
Project-URL: Homepage, https://github.com/freesolo-co/flash
|
|
6
6
|
Project-URL: Repository, https://github.com/freesolo-co/flash
|
|
@@ -10,7 +10,7 @@ adapters. A different base model requires a separate deployment. Use
|
|
|
10
10
|
Customer-owned Modal is live-qualified for `Qwen/Qwen3.5-9B`, `Qwen/Qwen3.8-27B`, and
|
|
11
11
|
`Qwen/Qwen3.6-35B-A3B`. The 27B and 35B-A3B qualifications are bound to the exact certified serving
|
|
12
12
|
image digest; another digest remains available for offline planning but cannot allocate Modal.
|
|
13
|
-
Hosted Qwen3.8 27B
|
|
13
|
+
Hosted Qwen3.8 27B is active on H100. Its customer-owned engine runs on `H100!` and serves the pinned
|
|
14
14
|
`Qwen/Qwen3.8-27B-FP8` checkpoint while preserving `Qwen/Qwen3.8-27B` as the distinct logical base
|
|
15
15
|
and tokenizer provenance. The 35B-A3B engine serves BF16 weights on one H200 with FP8 KV cache, a
|
|
16
16
|
32K context, eight sequences, a 4096 batched-token cap, and six rank-64 LoRA slots.
|
|
@@ -208,7 +208,7 @@ class ModelInfo:
|
|
|
208
208
|
DEFAULT_MODEL = "Qwen/Qwen3.5-9B"
|
|
209
209
|
|
|
210
210
|
# the checkpoint each public catalog model loads for customer-owned serving. hosted activation is
|
|
211
|
-
# a separate allowlist in flash.serving.src.engine.model_config
|
|
211
|
+
# a separate allowlist in flash.serving.src.engine.model_config.
|
|
212
212
|
SERVING_MODEL_REPOS: dict[str, str] = {
|
|
213
213
|
"Qwen/Qwen3.5-9B": "Freesolo-Co/Qwen3.5-9B-FP8",
|
|
214
214
|
"Qwen/Qwen3.8-27B": "Qwen/Qwen3.8-27B-FP8",
|
|
@@ -40,9 +40,13 @@ Modal environment `dev` and that production mode does not. The mode does not cha
|
|
|
40
40
|
engine behavior.
|
|
41
41
|
|
|
42
42
|
Both environments keep `MIN_CONTAINERS = 0`, so every GPU engine scales to zero and starts on demand.
|
|
43
|
-
The CPU router remains warm. The
|
|
44
|
-
`
|
|
45
|
-
`TARGET_INPUTS = 48`.
|
|
43
|
+
The CPU router remains warm. The hardcoded settings remain `MAX_CONTAINERS = None`,
|
|
44
|
+
`BUFFER_CONTAINERS = 1` (on the router AND every engine), `SCALEDOWN_WINDOW_SECONDS = 1800`, and
|
|
45
|
+
`MAX_INPUTS = 64` with `TARGET_INPUTS = 48`. `MAX_CONTAINERS` is deliberately uncapped: `base_model` is a
|
|
46
|
+
`modal.parameter()`, so each model has its own container pool and a fixed cap would ceiling one
|
|
47
|
+
model's capacity rather than bounding total spend. Bound spend with workspace quotas and billing
|
|
48
|
+
alerts instead. `BUFFER_CONTAINERS` only provisions while a Function is active, so engines still
|
|
49
|
+
scale to zero when idle.
|
|
46
50
|
|
|
47
51
|
### Production
|
|
48
52
|
|
|
@@ -150,13 +154,12 @@ GPUs, so there's nothing to tune at deploy time:
|
|
|
150
154
|
checkpoints are VL-preserving (each VL-unified base's vision tower + MoE router gates stay in
|
|
151
155
|
original precision) and already published to the operator HF org. Native FP8 tensor cores need
|
|
152
156
|
compute capability ≥ 8.9; every dense FP8 tier runs on an L4, L40S, or H100 (all native). No serving
|
|
153
|
-
tier runs on A100 now that the 35B is bf16 on H200. The
|
|
154
|
-
|
|
157
|
+
tier runs on A100 now that the 35B is bf16 on H200. The 27B serves the official native FP8
|
|
158
|
+
checkpoint on an H100.
|
|
155
159
|
|
|
156
160
|
- **The real memory lever — LoRA buffers:** vLLM PRE-ALLOCATES the GPU LoRA buffers at `max_loras ×
|
|
157
161
|
max_lora_rank`, regardless of how many adapters load. Both are linear levers. The qualified 9B runs
|
|
158
|
-
**16 × 128** on L40S
|
|
159
|
-
qualification. The 35B MoE runs **6 × 64** bf16 on H200. Adapters trained above the effective rank are rejected at load; a base regularly serving
|
|
162
|
+
**16 × 128** on L40S and the 27B runs **16 × 64** on H100. The 35B MoE runs **6 × 64** bf16 on H200. Adapters trained above the effective rank are rejected at load; a base regularly serving
|
|
160
163
|
more distinct adapters than its hot limit pays a swap latency from the CPU pool unless its hot
|
|
161
164
|
limit equals `MAX_CPU_LORAS`.
|
|
162
165
|
|
|
@@ -174,17 +177,19 @@ cold-boot smoke test first.
|
|
|
174
177
|
| Base model | Checkpoint | GPU | Hot LoRA shape | Context |
|
|
175
178
|
| ------------------------- | -------------------------------------------- | --------- | -------------- | ------- |
|
|
176
179
|
| Qwen3.5-9B | owned FP8 (`Freesolo-Co/*-FP8`) | **L40S**§ | 16 × 128 | 32768 |
|
|
177
|
-
| Qwen3.8-27B
|
|
180
|
+
| Qwen3.8-27B | official native FP8 (`Qwen/Qwen3.8-27B-FP8`) | **H100**‡ | 16 × 64 | 32768 |
|
|
178
181
|
| Qwen3.6-35B-A3B (MoE, VL) | official **bf16** (`Qwen/Qwen3.6-35B-A3B`) | **H200**† | 6 × 64 | 32768 |
|
|
179
182
|
|
|
180
183
|
§ 9B (L40S) runs **16 × 128** at 32k context with `max_num_seqs=8`, CUDA graphs
|
|
181
184
|
(`enforce_eager=False`), and `gpu_memory_utilization=0.90`. Its rank-128 × 16 buffer OOMed an L4 and
|
|
182
185
|
2×L4 in the real-GPU sweep, so it runs on the 48 GiB L40S, the cheapest Ada card that fits it at 32k.
|
|
183
186
|
|
|
184
|
-
‡
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
‡ 27B (H100, 80 GiB) runs **16 × 64** at 32k with `max_num_seqs=8`, CUDA graphs
|
|
188
|
+
(`enforce_eager=False`), and `gpu_memory_utilization=0.90`, qualified by a real-GPU canary on the exact
|
|
189
|
+
immutable official FP8 checkpoint: weights loaded at 44.25 GiB, leaving 23.07 GiB of KV cache
|
|
190
|
+
(350,981 tokens, 10.71x concurrency at 32k) after a 0.35 GiB graph capture. Cold boot is about 20 min
|
|
191
|
+
(load + 137 s torch.compile + 442 s warmup dominated by the FlashInfer GDN JIT), all cached on the
|
|
192
|
+
serving volume. Qwen3.6-27B measurements do not qualify or predict the Qwen3.8 checkpoint.
|
|
188
193
|
|
|
189
194
|
† 35B-A3B runs **bf16 on an H200** (141 GiB) at **6 × 64**, the one serving path that gives a flash
|
|
190
195
|
adapter its full all-expert LoRA AND CUDA graphs at speed. It gets rank 64 like the 27B
|
|
@@ -138,8 +138,17 @@ def scaledown_window_for(gpu: str) -> int:
|
|
|
138
138
|
# gpu model engines scale to zero. inference and adapter registration remote calls start the matching
|
|
139
139
|
# parameter-bound engine on demand.
|
|
140
140
|
MIN_CONTAINERS = 0
|
|
141
|
-
#
|
|
141
|
+
# No autoscaling cap per base-model engine; modal adds capacity as concurrency demands. A fixed cap
|
|
142
|
+
# here is a hard ceiling on a SINGLE model's capacity: `base_model` is a modal.parameter() and Modal
|
|
143
|
+
# gives each value its own container pool, so sustained load on one model cannot borrow headroom from
|
|
144
|
+
# an idle one. Bound spend with workspace quotas and billing alerts, which do not silently convert
|
|
145
|
+
# demand into queueing on the hot tier.
|
|
142
146
|
MAX_CONTAINERS = None
|
|
147
|
+
# One spare warm container for each autoscaling pool -- every base-model engine AND the cpu router --
|
|
148
|
+
# so a burst past `TARGET_INPUTS` does not pay a full cold boot (420s on L40S, 900s on H100, 1010s on
|
|
149
|
+
# H200) before it can be served. Modal only provisions the buffer while a Function is ACTIVE, so this
|
|
150
|
+
# does not defeat `MIN_CONTAINERS = 0`: idle engines still scale to zero and bill nothing.
|
|
151
|
+
BUFFER_CONTAINERS = 1
|
|
143
152
|
# Concurrent requests packed onto one base-model GPU before Modal autoscales a new (costly) one.
|
|
144
153
|
# A real-GPU sweep (scripts/gpu_canary.py::sweep_concurrency on A10G/Qwen2.5-1.5B) showed vLLM
|
|
145
154
|
# throughput scaling near-linearly with no saturation through 128 concurrent, while TTFT stayed
|
|
@@ -424,6 +433,7 @@ def _build_engine(
|
|
|
424
433
|
timeout=TIMEOUT_SECONDS,
|
|
425
434
|
min_containers=MIN_CONTAINERS,
|
|
426
435
|
max_containers=MAX_CONTAINERS,
|
|
436
|
+
buffer_containers=BUFFER_CONTAINERS,
|
|
427
437
|
)(modal.concurrent(max_inputs=max_inputs, target_inputs=target_inputs)(_Engine))
|
|
428
438
|
# Rebind the module name to the decorated handle, matching the normal ``@app.cls class X`` pattern
|
|
429
439
|
# where the module attribute ends up referring to the decorated class.
|
|
@@ -552,6 +562,66 @@ _AUTH_CACHE_TTL_SECONDS = 60.0
|
|
|
552
562
|
_AUTH_CACHE_MAX_ENTRIES = 4096
|
|
553
563
|
|
|
554
564
|
|
|
565
|
+
def _authorize_response_org(resp: Any) -> "str | None":
|
|
566
|
+
"""Translate the backend's authorize response into a billing org, or raise.
|
|
567
|
+
|
|
568
|
+
Extracted from _build_chat_authorizer only to keep that closure under the repo's
|
|
569
|
+
function-size limit; it reads nothing but the response, so hoisting it changes no
|
|
570
|
+
behaviour and makes each status mapping testable on its own.
|
|
571
|
+
"""
|
|
572
|
+
from fastapi import HTTPException, status
|
|
573
|
+
|
|
574
|
+
if resp.status_code == 200:
|
|
575
|
+
# Return the authorized billing org so the router can meter a base-model serve to the
|
|
576
|
+
# caller (a base model has no adapter owner). A malformed response cannot authorize an
|
|
577
|
+
# external request because that would let base-model usage escape billing.
|
|
578
|
+
try:
|
|
579
|
+
org_id = resp.json().get("orgId")
|
|
580
|
+
except Exception as exc:
|
|
581
|
+
raise HTTPException(
|
|
582
|
+
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
583
|
+
"serving auth backend returned malformed response",
|
|
584
|
+
) from exc
|
|
585
|
+
if not isinstance(org_id, str) or not org_id:
|
|
586
|
+
raise HTTPException(
|
|
587
|
+
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
588
|
+
"serving auth backend returned malformed response",
|
|
589
|
+
)
|
|
590
|
+
return org_id
|
|
591
|
+
if resp.status_code == 401:
|
|
592
|
+
# The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
|
|
593
|
+
# code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
|
|
594
|
+
# decided before the user key is even read). Only the former is the caller's fault; the
|
|
595
|
+
# latter is a serving misconfiguration we must not report as the user's bad key.
|
|
596
|
+
code = ""
|
|
597
|
+
try:
|
|
598
|
+
detail = resp.json().get("detail")
|
|
599
|
+
if isinstance(detail, dict):
|
|
600
|
+
code = detail.get("code") or ""
|
|
601
|
+
except Exception: # a non-JSON 401 is an internal-auth failure (below)
|
|
602
|
+
code = ""
|
|
603
|
+
if code == "invalid_api_key":
|
|
604
|
+
raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
|
|
605
|
+
raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured")
|
|
606
|
+
# Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
|
|
607
|
+
# before generation so a broke org can't serve for free; surface it as a clean 402 rather
|
|
608
|
+
# than letting it fall through to the retryable 503 below.
|
|
609
|
+
if resp.status_code == 402:
|
|
610
|
+
raise HTTPException(
|
|
611
|
+
status.HTTP_402_PAYMENT_REQUIRED,
|
|
612
|
+
"insufficient balance: top up or enable auto-topup to serve this model",
|
|
613
|
+
)
|
|
614
|
+
# Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
|
|
615
|
+
# which adapters exist to an unauthorized caller.
|
|
616
|
+
if resp.status_code in (403, 404):
|
|
617
|
+
raise HTTPException(status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter")
|
|
618
|
+
# Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
|
|
619
|
+
# infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
|
|
620
|
+
# 502: a client/load-balancer must be free to retry rather than treat it as a permanent
|
|
621
|
+
# upstream error. The cache+single-flight above is what makes this failure rare under load.
|
|
622
|
+
raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
|
|
623
|
+
|
|
624
|
+
|
|
555
625
|
def _build_chat_authorizer(settings: Any) -> Any:
|
|
556
626
|
"""Build the serving->backend chat authorizer, or None when not configured.
|
|
557
627
|
|
|
@@ -585,70 +655,30 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
585
655
|
|
|
586
656
|
# (api_key_sha256, adapter_id) -> (expires_at_monotonic, org_id); populated only on a successful
|
|
587
657
|
# authorization. Per-router-container in-memory (each container reduces its own backend load).
|
|
588
|
-
_cache: dict[tuple[str, str], tuple[float, str | None]] = {}
|
|
658
|
+
_cache: dict[tuple[str, str, str], tuple[float, str | None]] = {}
|
|
589
659
|
# In-flight single-flight tasks so concurrent identical misses share ONE backend call.
|
|
590
|
-
_inflight: dict[tuple[str, str], asyncio.Task[str | None]] = {}
|
|
660
|
+
_inflight: dict[tuple[str, str, str], asyncio.Task[str | None]] = {}
|
|
591
661
|
|
|
592
|
-
async def _authorize_backend(
|
|
662
|
+
async def _authorize_backend(
|
|
663
|
+
api_key: str, adapter_id: str, scope: "dict[str, str]"
|
|
664
|
+
) -> "str | None":
|
|
593
665
|
try:
|
|
594
|
-
resp = await _client.post(
|
|
666
|
+
resp = await _client.post(
|
|
667
|
+
url,
|
|
668
|
+
json={"apiKey": api_key, "modelId": adapter_id},
|
|
669
|
+
# A training container authenticates with the platform internal key rather
|
|
670
|
+
# than a customer key, so the backend cannot resolve it via
|
|
671
|
+
# authenticate_api_key. It identifies the calling job from these headers and
|
|
672
|
+
# re-checks them against the live job row. Dropping them here is
|
|
673
|
+
# indistinguishable, to the backend, from a request that never had them: it
|
|
674
|
+
# refuses with missing_training_context and catalog sampling fails closed.
|
|
675
|
+
headers=scope or None,
|
|
676
|
+
)
|
|
595
677
|
except Exception as exc: # backend unreachable -> fail closed, never serve unauthorized
|
|
596
678
|
raise HTTPException(
|
|
597
679
|
status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unreachable"
|
|
598
680
|
) from exc
|
|
599
|
-
|
|
600
|
-
# Return the authorized billing org so the router can meter a base-model serve to the
|
|
601
|
-
# caller (a base model has no adapter owner). A malformed response cannot authorize an
|
|
602
|
-
# external request because that would let base-model usage escape billing.
|
|
603
|
-
try:
|
|
604
|
-
org_id = resp.json().get("orgId")
|
|
605
|
-
except Exception as exc:
|
|
606
|
-
raise HTTPException(
|
|
607
|
-
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
608
|
-
"serving auth backend returned malformed response",
|
|
609
|
-
) from exc
|
|
610
|
-
if not isinstance(org_id, str) or not org_id:
|
|
611
|
-
raise HTTPException(
|
|
612
|
-
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
613
|
-
"serving auth backend returned malformed response",
|
|
614
|
-
)
|
|
615
|
-
return org_id
|
|
616
|
-
if resp.status_code == 401:
|
|
617
|
-
# The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
|
|
618
|
-
# code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
|
|
619
|
-
# decided before the user key is even read). Only the former is the caller's fault; the
|
|
620
|
-
# latter is a serving misconfiguration we must not report as the user's bad key.
|
|
621
|
-
code = ""
|
|
622
|
-
try:
|
|
623
|
-
detail = resp.json().get("detail")
|
|
624
|
-
if isinstance(detail, dict):
|
|
625
|
-
code = detail.get("code") or ""
|
|
626
|
-
except Exception: # a non-JSON 401 is an internal-auth failure (below)
|
|
627
|
-
code = ""
|
|
628
|
-
if code == "invalid_api_key":
|
|
629
|
-
raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
|
|
630
|
-
raise HTTPException(
|
|
631
|
-
status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured"
|
|
632
|
-
)
|
|
633
|
-
# Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
|
|
634
|
-
# before generation so a broke org can't serve for free; surface it as a clean 402 rather
|
|
635
|
-
# than letting it fall through to the retryable 503 below.
|
|
636
|
-
if resp.status_code == 402:
|
|
637
|
-
raise HTTPException(
|
|
638
|
-
status.HTTP_402_PAYMENT_REQUIRED,
|
|
639
|
-
"insufficient balance: top up or enable auto-topup to serve this model",
|
|
640
|
-
)
|
|
641
|
-
# Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
|
|
642
|
-
# which adapters exist to an unauthorized caller.
|
|
643
|
-
if resp.status_code in (403, 404):
|
|
644
|
-
raise HTTPException(
|
|
645
|
-
status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter"
|
|
646
|
-
)
|
|
647
|
-
# Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
|
|
648
|
-
# infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
|
|
649
|
-
# 502: a client/load-balancer must be free to retry rather than treat it as a permanent
|
|
650
|
-
# upstream error. The cache+single-flight above is what makes this failure rare under load.
|
|
651
|
-
raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
|
|
681
|
+
return _authorize_response_org(resp)
|
|
652
682
|
|
|
653
683
|
def _prune(now: float) -> None:
|
|
654
684
|
for expired in [k for k, (exp, _) in _cache.items() if exp <= now]:
|
|
@@ -659,10 +689,10 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
659
689
|
_cache.pop(k, None)
|
|
660
690
|
|
|
661
691
|
async def _authorize_and_cache(
|
|
662
|
-
ck: tuple[str, str], api_key: str, adapter_id: str
|
|
692
|
+
ck: tuple[str, str, str], api_key: str, adapter_id: str, scope: "dict[str, str]"
|
|
663
693
|
) -> "str | None":
|
|
664
694
|
try:
|
|
665
|
-
org = await _authorize_backend(api_key, adapter_id)
|
|
695
|
+
org = await _authorize_backend(api_key, adapter_id, scope)
|
|
666
696
|
finally:
|
|
667
697
|
# Drop the single-flight slot regardless of outcome so a failed lookup re-checks next
|
|
668
698
|
# time (failures are never cached) and a success can be re-driven once the cache expires.
|
|
@@ -673,9 +703,19 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
673
703
|
_prune(now)
|
|
674
704
|
return org
|
|
675
705
|
|
|
676
|
-
async def authorize(
|
|
706
|
+
async def authorize(
|
|
707
|
+
api_key: str, adapter_id: str, scope: "dict[str, str] | None" = None
|
|
708
|
+
) -> "str | None":
|
|
677
709
|
# do not retain raw user credentials as live dict keys beyond the request that supplied them.
|
|
678
|
-
|
|
710
|
+
scope = scope or {}
|
|
711
|
+
# The scope is part of the key, not just the payload. Every training container presents
|
|
712
|
+
# the SAME platform internal key, so keying on (key, model) alone would let one job's
|
|
713
|
+
# cached authorization answer another job's request -- and the cached value is the
|
|
714
|
+
# billing org, so the second job's usage would be metered to the first job's tenant.
|
|
715
|
+
scope_digest = hashlib.sha256(
|
|
716
|
+
"\x00".join(f"{k}={scope[k]}" for k in sorted(scope)).encode("utf-8")
|
|
717
|
+
).hexdigest()
|
|
718
|
+
ck = (hashlib.sha256(api_key.encode("utf-8")).hexdigest(), adapter_id, scope_digest)
|
|
679
719
|
cached = _cache.get(ck)
|
|
680
720
|
now = time.monotonic()
|
|
681
721
|
if cached is not None:
|
|
@@ -684,7 +724,7 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
684
724
|
_cache.pop(ck, None)
|
|
685
725
|
task = _inflight.get(ck)
|
|
686
726
|
if task is None:
|
|
687
|
-
task = asyncio.ensure_future(_authorize_and_cache(ck, api_key, adapter_id))
|
|
727
|
+
task = asyncio.ensure_future(_authorize_and_cache(ck, api_key, adapter_id, scope))
|
|
688
728
|
# Retrieve the task's outcome even if every awaiter is cancelled (all identical clients
|
|
689
729
|
# disconnect), so an orphaned single-flight failure doesn't warn "exception never retrieved".
|
|
690
730
|
task.add_done_callback(lambda t: t.cancelled() or t.exception())
|
|
@@ -723,6 +763,7 @@ def _base_model_records() -> list:
|
|
|
723
763
|
@app.function(
|
|
724
764
|
secrets=runtime_secrets,
|
|
725
765
|
min_containers=1, # one warm CPU front door (hardcoded; no deploy-time knob)
|
|
766
|
+
buffer_containers=BUFFER_CONTAINERS, # scales out with the engines; see BUFFER_CONTAINERS
|
|
726
767
|
timeout=ROUTER_TIMEOUT_SECONDS, # must cover engine cold start (see ROUTER_TIMEOUT_SECONDS)
|
|
727
768
|
)
|
|
728
769
|
@modal.concurrent(max_inputs=MAX_INPUTS, target_inputs=TARGET_INPUTS)
|
{freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage.py
RENAMED
|
@@ -24,16 +24,17 @@ from flash.serving.src.accounting.usage_outbox import (
|
|
|
24
24
|
from flash.serving.src.io.schemas import AdapterRecord
|
|
25
25
|
|
|
26
26
|
FREESOLO_PRICING_SOURCE = "freesolo_backend_catalog"
|
|
27
|
-
FREESOLO_PRICING_VERSION = "2026-08-
|
|
27
|
+
FREESOLO_PRICING_VERSION = "2026-08-27.1"
|
|
28
|
+
# (prompt, completion, cached prompt) usd per million tokens, one entry per active hosted model.
|
|
29
|
+
# these are the charged customer rates, set 5% below the lowest healthy comparable openrouter fp8
|
|
30
|
+
# listing for each model and token category. they are NOT cost-plus: no markup is applied, and they
|
|
31
|
+
# currently sit below the recorded cost basis, so do not reintroduce a multiplier here until measured
|
|
32
|
+
# b200 economics establish a lower truthful cost basis.
|
|
28
33
|
_FREESOLO_USD_PER_MTOK: dict[str, tuple[str, str, str]] = {
|
|
29
|
-
"Qwen/Qwen3.5-
|
|
30
|
-
"Qwen/Qwen3.
|
|
31
|
-
"Qwen/Qwen3.
|
|
32
|
-
"Qwen/Qwen3.5-9B": ("0.114", "0.19", "0.023"),
|
|
33
|
-
"Qwen/Qwen3.6-27B": ("0.4254", "3.055", "0.14"),
|
|
34
|
-
"Qwen/Qwen3.6-35B-A3B": ("0.198", "1.265", "0.066"),
|
|
34
|
+
"Qwen/Qwen3.5-9B": ("0.095", "0.1425", "0.0276"),
|
|
35
|
+
"Qwen/Qwen3.8-27B": ("0.3325", "2.4225", "0.03325"),
|
|
36
|
+
"Qwen/Qwen3.6-35B-A3B": ("0.095", "0.9025", "0.0475"),
|
|
35
37
|
}
|
|
36
|
-
_FREESOLO_MARKUP = Decimal("1.2")
|
|
37
38
|
_USD_PER_MTOK_DIVISOR = Decimal("1000000")
|
|
38
39
|
|
|
39
40
|
|
|
@@ -173,7 +174,7 @@ def freesolo_price(base_model: str) -> CapturedPrice:
|
|
|
173
174
|
raise ValueError(f"no durable serving price for base model {base_model!r}") from exc
|
|
174
175
|
|
|
175
176
|
def per_token(rate: str) -> str:
|
|
176
|
-
return format(Decimal(rate)
|
|
177
|
+
return format(Decimal(rate) / _USD_PER_MTOK_DIVISOR, "f")
|
|
177
178
|
|
|
178
179
|
return CapturedPrice(
|
|
179
180
|
source=FREESOLO_PRICING_SOURCE,
|
{freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/model_config.py
RENAMED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
The serving app runs one vLLM GPU engine per base model, each on the Modal GPU class set by its
|
|
4
4
|
catalog ``gpu`` (see below). Adapters and routing key off the logical ``base_model``; the engine
|
|
5
5
|
loads its configured checkpoint at that checkpoint's own dtype. The active dense 9B uses Freesolo
|
|
6
|
-
compressed-tensors FP8
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
compressed-tensors FP8 and the active dense 27B uses the official Qwen FP8 checkpoint. The active
|
|
7
|
+
35B-A3B MoE serves base bf16 weights because its fused-MoE LoRA path will not compile on FP8, as
|
|
8
|
+
detailed below.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
@@ -27,15 +27,14 @@ from flash.serving.src.engine.prequant_config import (
|
|
|
27
27
|
# `engine` (optional): per-model vLLM engine-arg overrides (LoRA buffer shape, scheduler/memory caps,
|
|
28
28
|
# language_model_only, …). The engine's LOADED checkpoint is NOT in here — it is resolved centrally by
|
|
29
29
|
# ``serve_model_for`` from ``src.prequant_config`` and injected into the overrides as ``serve_model_id``.
|
|
30
|
-
# active models resolve through prequant_config unless an exact validated override is present.
|
|
31
|
-
# pending 27b candidate carries its own immutable checkpoint pin without entering active resolution.
|
|
30
|
+
# active models resolve through prequant_config unless an exact validated override is present.
|
|
32
31
|
# ⚠ serve_model_id is pointed only at checkpoints VERIFIED to exist (a missing repo 404-crash-loops
|
|
33
32
|
# the engine — the reason this mechanism was removed once); the owned repos are VL-preserving FP8
|
|
34
33
|
# checkpoints published to the operator HF org.
|
|
35
34
|
#
|
|
36
35
|
# sizing rationale. preallocated lora buffers and loaded checkpoint weights dominate engine vram.
|
|
37
|
-
# the active 9b uses 16 rank-128 slots on l40s
|
|
38
|
-
#
|
|
36
|
+
# the active 9b uses 16 rank-128 slots on l40s, the active 27b uses 16 rank-64 slots on h100, and the
|
|
37
|
+
# active 35b moe uses 6 rank-64 slots on h200.
|
|
39
38
|
# - Qwen3.6-35B-A3B (vision-language MoE; arch ``Qwen3_5MoeForConditionalGeneration``) -> H200
|
|
40
39
|
# (141 GiB) with the base bf16 weights, 6 x 64 LoRA at 32k. bf16 (not FP8) is the one path giving
|
|
41
40
|
# full-expert LoRA + CUDA graphs because the fused-MoE LoRA path won't compile on fp8e4nv. see the
|
|
@@ -108,32 +107,35 @@ SERVING_MODELS: list[dict[str, Any]] = [
|
|
|
108
107
|
# the complete model and LoRA load is about 108 GiB on the 141 GiB H200.
|
|
109
108
|
},
|
|
110
109
|
},
|
|
110
|
+
# 27B dense on an H100 (80 GiB). the real-GPU canary measured the load at 44.25 GiB -- above the
|
|
111
|
+
# FP8 weight size alone, because the vision tower and the non-quantized tensors stay bf16 -- which
|
|
112
|
+
# still leaves 23.07 GiB of KV cache (350,981 tokens, 10.71x concurrency at 32k) after the 16
|
|
113
|
+
# rank-64 LoRA buffers and a 0.35 GiB graph capture. every repository here is pinned to an
|
|
114
|
+
# immutable revision so a served engine cannot silently follow an upstream retag; note the model
|
|
115
|
+
# pin names a commit in the -FP8 repo while the tokenizer/processor pins name one in the base
|
|
116
|
+
# repo, which are separate sha namespaces.
|
|
117
|
+
{
|
|
118
|
+
"base_model": "Qwen/Qwen3.8-27B",
|
|
119
|
+
"image_input_limit": 4,
|
|
120
|
+
"gpu": "H100",
|
|
121
|
+
"engine": {
|
|
122
|
+
"model_revision": "017b9c7af6b5689d5dd426a76e0bc077eb5ca20a",
|
|
123
|
+
"tokenizer_model": "Qwen/Qwen3.8-27B",
|
|
124
|
+
"tokenizer_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
|
|
125
|
+
"processor_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
|
|
126
|
+
"gpu_memory_utilization": 0.90,
|
|
127
|
+
"max_loras": 16,
|
|
128
|
+
"max_lora_rank": 64,
|
|
129
|
+
"max_model_len": 32768,
|
|
130
|
+
"max_num_seqs": 8,
|
|
131
|
+
"enforce_eager": False,
|
|
132
|
+
"reasoning_parser": "qwen3",
|
|
133
|
+
},
|
|
134
|
+
},
|
|
111
135
|
]
|
|
112
136
|
|
|
113
137
|
_BY_MODEL: dict[str, dict[str, Any]] = {m["base_model"]: m for m in SERVING_MODELS}
|
|
114
138
|
|
|
115
|
-
# inert descriptor for the exact pending canary. activation means moving this descriptor into
|
|
116
|
-
# SERVING_MODELS, not consulting a second runtime allowlist.
|
|
117
|
-
_QWEN38_HOSTED_CANDIDATE: dict[str, Any] = {
|
|
118
|
-
"base_model": "Qwen/Qwen3.8-27B",
|
|
119
|
-
"image_input_limit": 4,
|
|
120
|
-
"gpu": "H100",
|
|
121
|
-
"engine": {
|
|
122
|
-
"serve_model_id": "Qwen/Qwen3.8-27B-FP8",
|
|
123
|
-
"model_revision": "017b9c7af6b5689d5dd426a76e0bc077eb5ca20a",
|
|
124
|
-
"tokenizer_model": "Qwen/Qwen3.8-27B",
|
|
125
|
-
"tokenizer_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
|
|
126
|
-
"processor_revision": "1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0",
|
|
127
|
-
"gpu_memory_utilization": 0.90,
|
|
128
|
-
"max_loras": 16,
|
|
129
|
-
"max_lora_rank": 64,
|
|
130
|
-
"max_model_len": 32768,
|
|
131
|
-
"max_num_seqs": 8,
|
|
132
|
-
"enforce_eager": False,
|
|
133
|
-
"reasoning_parser": "qwen3",
|
|
134
|
-
},
|
|
135
|
-
}
|
|
136
|
-
|
|
137
139
|
|
|
138
140
|
def base_models() -> list[str]:
|
|
139
141
|
return [model["base_model"] for model in SERVING_MODELS]
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"""Prequantized checkpoint mapping for active hosted serving.
|
|
2
2
|
|
|
3
|
-
The 9B loads a Freesolo-owned compressed-tensors FP8 checkpoint. The
|
|
4
|
-
official FP8 default, although the validated engine
|
|
5
|
-
full-expert LoRA and CUDA graphs coexist.
|
|
6
|
-
without entering this active mapping.
|
|
3
|
+
The 9B loads a Freesolo-owned compressed-tensors FP8 checkpoint. The 27B loads its official FP8
|
|
4
|
+
checkpoint. The 35B MoE mapping remains its official FP8 default, although the validated engine
|
|
5
|
+
override serves the base bf16 weights so full-expert LoRA and CUDA graphs coexist.
|
|
7
6
|
"""
|
|
8
7
|
|
|
9
8
|
from __future__ import annotations
|
|
@@ -15,6 +14,7 @@ OWNED_FP8_MODEL_REPOS: dict[str, str] = {
|
|
|
15
14
|
|
|
16
15
|
# official qwen checkpoints active in hosted serving.
|
|
17
16
|
OFFICIAL_FP8_MODEL_REPOS: dict[str, str] = {
|
|
17
|
+
"Qwen/Qwen3.8-27B": "Qwen/Qwen3.8-27B-FP8",
|
|
18
18
|
"Qwen/Qwen3.6-35B-A3B": "Qwen/Qwen3.6-35B-A3B-FP8",
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -20,6 +20,7 @@ from flash.serving.src.http.headers import (
|
|
|
20
20
|
assert_internal,
|
|
21
21
|
internal_org_id,
|
|
22
22
|
is_trusted_internal,
|
|
23
|
+
training_scope_headers,
|
|
23
24
|
)
|
|
24
25
|
from flash.serving.src.http.routing import AdapterRouter, EnginePool
|
|
25
26
|
from flash.serving.src.io.schemas import AdapterRecord
|
|
@@ -42,7 +43,10 @@ class ServingContext:
|
|
|
42
43
|
serving_release: str,
|
|
43
44
|
reload_records: Callable[[], list[AdapterRecord]] | None,
|
|
44
45
|
lookup_record: Callable[[str, str], AdapterRecord | None] | None,
|
|
45
|
-
chat_authorizer: Callable[
|
|
46
|
+
chat_authorizer: Callable[
|
|
47
|
+
[str, str, dict[str, str]], Awaitable[str | AuthorizedTraffic | None]
|
|
48
|
+
]
|
|
49
|
+
| None,
|
|
46
50
|
) -> None:
|
|
47
51
|
self.pool = pool
|
|
48
52
|
self.router = router
|
|
@@ -83,7 +87,7 @@ class ServingContext:
|
|
|
83
87
|
raise HTTPException(
|
|
84
88
|
status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is not configured"
|
|
85
89
|
)
|
|
86
|
-
authorized = await self.chat_authorizer(token, adapter_id)
|
|
90
|
+
authorized = await self.chat_authorizer(token, adapter_id, training_scope_headers(request))
|
|
87
91
|
if isinstance(authorized, AuthorizedTraffic):
|
|
88
92
|
if authorized.principal.kind == "trusted_internal":
|
|
89
93
|
raise HTTPException(
|
|
@@ -50,6 +50,34 @@ def is_trusted_internal(request: Request, trusted_keys: tuple[str, ...]) -> bool
|
|
|
50
50
|
return any([hmac.compare_digest(presented, k) for k in trusted_keys]) # noqa: C419
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
# The job-scope headers a training container sends with a catalog-base sample. The backend
|
|
54
|
+
# re-checks all five against the live training job row before authorizing, so they have to
|
|
55
|
+
# survive the hop through this service -- it forwards the caller's key but is otherwise the
|
|
56
|
+
# only thing standing between the container and /api/serving/authorize.
|
|
57
|
+
TRAINING_SCOPE_HEADERS = (
|
|
58
|
+
"x-freesolo-org-id",
|
|
59
|
+
"x-freesolo-training-job-id",
|
|
60
|
+
"x-freesolo-project-id",
|
|
61
|
+
"x-freesolo-worker-id",
|
|
62
|
+
"x-freesolo-training-job-attempt",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def training_scope_headers(request: Request) -> dict[str, str]:
|
|
67
|
+
"""The training job-scope headers present on this request, lowercased.
|
|
68
|
+
|
|
69
|
+
Absent headers are omitted rather than sent empty: a normal customer chat request
|
|
70
|
+
carries none of these, and forwarding five blanks would make every such request look
|
|
71
|
+
like a malformed training call to the backend.
|
|
72
|
+
"""
|
|
73
|
+
found = {}
|
|
74
|
+
for name in TRAINING_SCOPE_HEADERS:
|
|
75
|
+
value = (request.headers.get(name) or "").strip()
|
|
76
|
+
if value:
|
|
77
|
+
found[name] = value
|
|
78
|
+
return found
|
|
79
|
+
|
|
80
|
+
|
|
53
81
|
def _bearer_token(request: Request) -> str | None:
|
|
54
82
|
header = request.headers.get("Authorization") or ""
|
|
55
83
|
scheme, _, value = header.partition(" ")
|
|
@@ -56,7 +56,7 @@ def build_serving_app(
|
|
|
56
56
|
lookup_record: Callable[[str, str], AdapterRecord | None] | None = None,
|
|
57
57
|
reload_interval_seconds: float = 30.0,
|
|
58
58
|
usage_store: UsageStore,
|
|
59
|
-
chat_authorizer: Callable[[str, str], Awaitable["str | None"]] | None = None,
|
|
59
|
+
chat_authorizer: Callable[[str, str, dict[str, str]], Awaitable["str | None"]] | None = None,
|
|
60
60
|
):
|
|
61
61
|
"""Front-door FastAPI app. ``reload_records`` re-reads persisted ready adapters so a router
|
|
62
62
|
that missed a (un)registration on another container still resolves it: reload once on a miss
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.123"
|
|
4
4
|
description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
# RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
|
|
@@ -196,7 +196,7 @@ artifacts = ["flash/py.typed"]
|
|
|
196
196
|
# auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
|
|
197
197
|
# PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
|
|
198
198
|
# dev-channel release = bump this (and [project].version) and merge to `dev`.
|
|
199
|
-
version = "1.2.
|
|
199
|
+
version = "1.2.123"
|
|
200
200
|
|
|
201
201
|
[tool.pytest.ini_options]
|
|
202
202
|
pythonpath = ["."]
|
|
@@ -81,7 +81,7 @@ class FakeAuthorizer:
|
|
|
81
81
|
self.calls: list[tuple[str, str]] = []
|
|
82
82
|
self._raises = raises
|
|
83
83
|
|
|
84
|
-
async def __call__(self, token: str, adapter_id: str) -> str:
|
|
84
|
+
async def __call__(self, token: str, adapter_id: str, scope: dict | None = None) -> str:
|
|
85
85
|
self.calls.append((token, adapter_id))
|
|
86
86
|
if self._raises is not None:
|
|
87
87
|
raise self._raises
|
{freesolo_flash_dev-1.2.121 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_authorizer.py
RENAMED
|
@@ -82,7 +82,7 @@ def _authorizer(modal_app_module, monkeypatch, response: Any):
|
|
|
82
82
|
def __init__(self, *_a: Any, **_k: Any) -> None:
|
|
83
83
|
pass
|
|
84
84
|
|
|
85
|
-
async def post(self, _url: str, json: Any) -> _FakeResp:
|
|
85
|
+
async def post(self, _url: str, json: Any, headers: Any = None) -> _FakeResp:
|
|
86
86
|
if isinstance(response, Exception):
|
|
87
87
|
raise response
|
|
88
88
|
return response
|
|
@@ -194,7 +194,7 @@ def _counting_client(monkeypatch, responder, *, delay: float = 0.0):
|
|
|
194
194
|
def __init__(self, *_a: Any, **_k: Any) -> None:
|
|
195
195
|
pass
|
|
196
196
|
|
|
197
|
-
async def post(self, _url: str, json: Any) -> _FakeResp:
|
|
197
|
+
async def post(self, _url: str, json: Any, headers: Any = None) -> _FakeResp:
|
|
198
198
|
calls["n"] += 1
|
|
199
199
|
n = calls["n"]
|
|
200
200
|
if delay:
|
|
@@ -413,6 +413,9 @@ def test_failed_authorization_is_not_cached(modal_app_module, monkeypatch):
|
|
|
413
413
|
assert calls["n"] == 2
|
|
414
414
|
|
|
415
415
|
|
|
416
|
+
_EMPTY_SCOPE_DIGEST = hashlib.sha256(b"").hexdigest()
|
|
417
|
+
|
|
418
|
+
|
|
416
419
|
def test_expired_key_is_evicted_before_reauthorization(modal_app_module, monkeypatch):
|
|
417
420
|
import asyncio
|
|
418
421
|
import inspect
|
|
@@ -426,7 +429,11 @@ def test_expired_key_is_evicted_before_reauthorization(modal_app_module, monkeyp
|
|
|
426
429
|
authorize = _new_authorizer(modal_app_module)
|
|
427
430
|
cache = inspect.getclosurevars(authorize).nonlocals["_cache"]
|
|
428
431
|
request_key = ("synthetic-expired-key", "adapter-1")
|
|
429
|
-
cache_key = (
|
|
432
|
+
cache_key = (
|
|
433
|
+
hashlib.sha256(request_key[0].encode("utf-8")).hexdigest(),
|
|
434
|
+
request_key[1],
|
|
435
|
+
_EMPTY_SCOPE_DIGEST,
|
|
436
|
+
)
|
|
430
437
|
|
|
431
438
|
async def run() -> None:
|
|
432
439
|
await authorize(*request_key)
|
|
@@ -455,10 +462,12 @@ def test_prune_removes_expired_keys_below_capacity(modal_app_module, monkeypatch
|
|
|
455
462
|
expired_key = (
|
|
456
463
|
hashlib.sha256(expired_request[0].encode("utf-8")).hexdigest(),
|
|
457
464
|
expired_request[1],
|
|
465
|
+
_EMPTY_SCOPE_DIGEST,
|
|
458
466
|
)
|
|
459
467
|
current_key = (
|
|
460
468
|
hashlib.sha256(current_request[0].encode("utf-8")).hexdigest(),
|
|
461
469
|
current_request[1],
|
|
470
|
+
_EMPTY_SCOPE_DIGEST,
|
|
462
471
|
)
|
|
463
472
|
|
|
464
473
|
async def run() -> None:
|