freesolo-flash-dev 1.2.122__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.122 → freesolo_flash_dev-1.2.123}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/README.md +7 -3
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/modal_app.py +105 -68
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/context.py +6 -2
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/headers.py +28 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/router.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_base_model_serving.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_auth.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_chat_authorizer.py +12 -3
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_identity_repairs.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_checkpoint_model_validation.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_multimodal.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router.py +2 -2
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_coverage.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_edge_coverage.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_reasoning_split.py +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_outbox.py +5 -5
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_reporter.py +22 -12
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.env.example +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal-dev.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/deploy-modal.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/README.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/docs/serving-contract.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/imports.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/push.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/verl_policy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/entry/worker.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/batching.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/bridge.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/failures.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/prompts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/bridging/scoring.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/media.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/multiturn/validation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/failures.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/gkd.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/overrides.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/progress.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/prompt_preparation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/protocol.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/reporting.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/state.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/opd/orchestration/validation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/inputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/adapter.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/instance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/provider.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/_lifecycle/net/worker.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/base.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/realized.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/cost.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/gpus.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/jobs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/polling.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/execution/resources.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/auth.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/client/pricing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/execution/provider.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/status.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/attach_reconcile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/http.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/app/progress.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/deploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/prompt.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/app.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/envs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/broker.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/domain/teacher/requests.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_facts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/accounting/usage_outbox.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/boot.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/generation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_engine.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/model_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/inference_routes.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/responses.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_deploy_identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_model_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_per_model_gpu.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_bootstrap_http.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_app_progress.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_docs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_profiles.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.122 → 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
|
|
@@ -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
|
|
|
@@ -138,12 +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
|
-
#
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
#
|
|
145
|
-
#
|
|
146
|
-
MAX_CONTAINERS =
|
|
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.
|
|
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
|
|
147
152
|
# Concurrent requests packed onto one base-model GPU before Modal autoscales a new (costly) one.
|
|
148
153
|
# A real-GPU sweep (scripts/gpu_canary.py::sweep_concurrency on A10G/Qwen2.5-1.5B) showed vLLM
|
|
149
154
|
# throughput scaling near-linearly with no saturation through 128 concurrent, while TTFT stayed
|
|
@@ -428,6 +433,7 @@ def _build_engine(
|
|
|
428
433
|
timeout=TIMEOUT_SECONDS,
|
|
429
434
|
min_containers=MIN_CONTAINERS,
|
|
430
435
|
max_containers=MAX_CONTAINERS,
|
|
436
|
+
buffer_containers=BUFFER_CONTAINERS,
|
|
431
437
|
)(modal.concurrent(max_inputs=max_inputs, target_inputs=target_inputs)(_Engine))
|
|
432
438
|
# Rebind the module name to the decorated handle, matching the normal ``@app.cls class X`` pattern
|
|
433
439
|
# where the module attribute ends up referring to the decorated class.
|
|
@@ -556,6 +562,66 @@ _AUTH_CACHE_TTL_SECONDS = 60.0
|
|
|
556
562
|
_AUTH_CACHE_MAX_ENTRIES = 4096
|
|
557
563
|
|
|
558
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
|
+
|
|
559
625
|
def _build_chat_authorizer(settings: Any) -> Any:
|
|
560
626
|
"""Build the serving->backend chat authorizer, or None when not configured.
|
|
561
627
|
|
|
@@ -589,70 +655,30 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
589
655
|
|
|
590
656
|
# (api_key_sha256, adapter_id) -> (expires_at_monotonic, org_id); populated only on a successful
|
|
591
657
|
# authorization. Per-router-container in-memory (each container reduces its own backend load).
|
|
592
|
-
_cache: dict[tuple[str, str], tuple[float, str | None]] = {}
|
|
658
|
+
_cache: dict[tuple[str, str, str], tuple[float, str | None]] = {}
|
|
593
659
|
# In-flight single-flight tasks so concurrent identical misses share ONE backend call.
|
|
594
|
-
_inflight: dict[tuple[str, str], asyncio.Task[str | None]] = {}
|
|
660
|
+
_inflight: dict[tuple[str, str, str], asyncio.Task[str | None]] = {}
|
|
595
661
|
|
|
596
|
-
async def _authorize_backend(
|
|
662
|
+
async def _authorize_backend(
|
|
663
|
+
api_key: str, adapter_id: str, scope: "dict[str, str]"
|
|
664
|
+
) -> "str | None":
|
|
597
665
|
try:
|
|
598
|
-
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
|
+
)
|
|
599
677
|
except Exception as exc: # backend unreachable -> fail closed, never serve unauthorized
|
|
600
678
|
raise HTTPException(
|
|
601
679
|
status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unreachable"
|
|
602
680
|
) from exc
|
|
603
|
-
|
|
604
|
-
# Return the authorized billing org so the router can meter a base-model serve to the
|
|
605
|
-
# caller (a base model has no adapter owner). A malformed response cannot authorize an
|
|
606
|
-
# external request because that would let base-model usage escape billing.
|
|
607
|
-
try:
|
|
608
|
-
org_id = resp.json().get("orgId")
|
|
609
|
-
except Exception as exc:
|
|
610
|
-
raise HTTPException(
|
|
611
|
-
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
612
|
-
"serving auth backend returned malformed response",
|
|
613
|
-
) from exc
|
|
614
|
-
if not isinstance(org_id, str) or not org_id:
|
|
615
|
-
raise HTTPException(
|
|
616
|
-
status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
617
|
-
"serving auth backend returned malformed response",
|
|
618
|
-
)
|
|
619
|
-
return org_id
|
|
620
|
-
if resp.status_code == 401:
|
|
621
|
-
# The backend returns 401 for BOTH an invalid *user* key (our authorize route, body
|
|
622
|
-
# code "invalid_api_key") AND a rejected serving *machine* bearer (require_internal_token,
|
|
623
|
-
# decided before the user key is even read). Only the former is the caller's fault; the
|
|
624
|
-
# latter is a serving misconfiguration we must not report as the user's bad key.
|
|
625
|
-
code = ""
|
|
626
|
-
try:
|
|
627
|
-
detail = resp.json().get("detail")
|
|
628
|
-
if isinstance(detail, dict):
|
|
629
|
-
code = detail.get("code") or ""
|
|
630
|
-
except Exception: # a non-JSON 401 is an internal-auth failure (below)
|
|
631
|
-
code = ""
|
|
632
|
-
if code == "invalid_api_key":
|
|
633
|
-
raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid Freesolo API key")
|
|
634
|
-
raise HTTPException(
|
|
635
|
-
status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth is misconfigured"
|
|
636
|
-
)
|
|
637
|
-
# Org has no budget to serve (zero balance and no card+auto-topup). The backend gates this
|
|
638
|
-
# before generation so a broke org can't serve for free; surface it as a clean 402 rather
|
|
639
|
-
# than letting it fall through to the retryable 503 below.
|
|
640
|
-
if resp.status_code == 402:
|
|
641
|
-
raise HTTPException(
|
|
642
|
-
status.HTTP_402_PAYMENT_REQUIRED,
|
|
643
|
-
"insufficient balance: top up or enable auto-topup to serve this model",
|
|
644
|
-
)
|
|
645
|
-
# Unknown adapter (404) and org mismatch (403) both collapse to 403 so we don't leak
|
|
646
|
-
# which adapters exist to an unauthorized caller.
|
|
647
|
-
if resp.status_code in (403, 404):
|
|
648
|
-
raise HTTPException(
|
|
649
|
-
status.HTTP_403_FORBIDDEN, "API key is not authorized for this adapter"
|
|
650
|
-
)
|
|
651
|
-
# Any backend 5xx (500/502/503/504) or other unexpected status is a transient auth-lookup
|
|
652
|
-
# infra failure (Supabase down, backend overloaded). Surface it as a RETRYABLE 503, never a
|
|
653
|
-
# 502: a client/load-balancer must be free to retry rather than treat it as a permanent
|
|
654
|
-
# upstream error. The cache+single-flight above is what makes this failure rare under load.
|
|
655
|
-
raise HTTPException(status.HTTP_503_SERVICE_UNAVAILABLE, "serving auth backend unavailable")
|
|
681
|
+
return _authorize_response_org(resp)
|
|
656
682
|
|
|
657
683
|
def _prune(now: float) -> None:
|
|
658
684
|
for expired in [k for k, (exp, _) in _cache.items() if exp <= now]:
|
|
@@ -663,10 +689,10 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
663
689
|
_cache.pop(k, None)
|
|
664
690
|
|
|
665
691
|
async def _authorize_and_cache(
|
|
666
|
-
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]"
|
|
667
693
|
) -> "str | None":
|
|
668
694
|
try:
|
|
669
|
-
org = await _authorize_backend(api_key, adapter_id)
|
|
695
|
+
org = await _authorize_backend(api_key, adapter_id, scope)
|
|
670
696
|
finally:
|
|
671
697
|
# Drop the single-flight slot regardless of outcome so a failed lookup re-checks next
|
|
672
698
|
# time (failures are never cached) and a success can be re-driven once the cache expires.
|
|
@@ -677,9 +703,19 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
677
703
|
_prune(now)
|
|
678
704
|
return org
|
|
679
705
|
|
|
680
|
-
async def authorize(
|
|
706
|
+
async def authorize(
|
|
707
|
+
api_key: str, adapter_id: str, scope: "dict[str, str] | None" = None
|
|
708
|
+
) -> "str | None":
|
|
681
709
|
# do not retain raw user credentials as live dict keys beyond the request that supplied them.
|
|
682
|
-
|
|
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)
|
|
683
719
|
cached = _cache.get(ck)
|
|
684
720
|
now = time.monotonic()
|
|
685
721
|
if cached is not None:
|
|
@@ -688,7 +724,7 @@ def _build_chat_authorizer(settings: Any) -> Any:
|
|
|
688
724
|
_cache.pop(ck, None)
|
|
689
725
|
task = _inflight.get(ck)
|
|
690
726
|
if task is None:
|
|
691
|
-
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))
|
|
692
728
|
# Retrieve the task's outcome even if every awaiter is cancelled (all identical clients
|
|
693
729
|
# disconnect), so an orphaned single-flight failure doesn't warn "exception never retrieved".
|
|
694
730
|
task.add_done_callback(lambda t: t.cancelled() or t.exception())
|
|
@@ -727,6 +763,7 @@ def _base_model_records() -> list:
|
|
|
727
763
|
@app.function(
|
|
728
764
|
secrets=runtime_secrets,
|
|
729
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
|
|
730
767
|
timeout=ROUTER_TIMEOUT_SECONDS, # must cover engine cold start (see ROUTER_TIMEOUT_SECONDS)
|
|
731
768
|
)
|
|
732
769
|
@modal.concurrent(max_inputs=MAX_INPUTS, target_inputs=TARGET_INPUTS)
|
|
@@ -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.122 → 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:
|
|
@@ -264,7 +264,7 @@ def test_hosted_authorizer_uses_freesolo_model_id_schema(monkeypatch) -> None:
|
|
|
264
264
|
def __init__(self, *_args, **_kwargs):
|
|
265
265
|
pass
|
|
266
266
|
|
|
267
|
-
async def post(self, _url, *, json):
|
|
267
|
+
async def post(self, _url, *, json, headers=None):
|
|
268
268
|
seen.update(json)
|
|
269
269
|
return _Response()
|
|
270
270
|
|
|
@@ -72,7 +72,7 @@ class FakeAuthorizer:
|
|
|
72
72
|
self.calls: list[tuple[str, str]] = []
|
|
73
73
|
self.error = error
|
|
74
74
|
|
|
75
|
-
async def __call__(self, token: str, adapter_id: str) -> str:
|
|
75
|
+
async def __call__(self, token: str, adapter_id: str, scope: dict | None = None) -> str:
|
|
76
76
|
self.calls.append((token, adapter_id))
|
|
77
77
|
if self.error is not None:
|
|
78
78
|
raise self.error
|
|
@@ -28,7 +28,7 @@ from tests.serving.checkpoint_fixtures import (
|
|
|
28
28
|
from tests.serving.conftest import attest
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
async def _allow(_token: str, _adapter_id: str) -> str:
|
|
31
|
+
async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
32
32
|
"""Permissive attributed authorizer for routing tests."""
|
|
33
33
|
return "org-1"
|
|
34
34
|
|
|
@@ -894,7 +894,7 @@ def test_openai_chat_stream_sets_anti_buffering_headers(app_setup):
|
|
|
894
894
|
def test_openai_chat_rejects_non_boolean_stream_after_authorization(stream):
|
|
895
895
|
authorizations: list[str] = []
|
|
896
896
|
|
|
897
|
-
async def _authorize(_token: str, adapter_id: str) -> str:
|
|
897
|
+
async def _authorize(_token: str, adapter_id: str, _scope: dict | None = None) -> str:
|
|
898
898
|
authorizations.append(adapter_id)
|
|
899
899
|
return "org-1"
|
|
900
900
|
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_router_coverage.py
RENAMED
|
@@ -30,7 +30,7 @@ from flash.serving.src.io.structured_outputs import StructuredOutputsError
|
|
|
30
30
|
QWEN = "Qwen/Qwen3.5-9B"
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
async def _allow(_token: str, _adapter_id: str) -> str:
|
|
33
|
+
async def _allow(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
34
34
|
return "org-1"
|
|
35
35
|
|
|
36
36
|
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_outbox.py
RENAMED
|
@@ -295,7 +295,7 @@ def test_nonstream_capture_is_awaited_before_successful_response() -> None:
|
|
|
295
295
|
pool = _Pool()
|
|
296
296
|
store = _Store()
|
|
297
297
|
|
|
298
|
-
async def authorize(_token: str, _adapter_id: str) -> str:
|
|
298
|
+
async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
299
299
|
return "org-1"
|
|
300
300
|
|
|
301
301
|
app = build_serving_app(
|
|
@@ -330,7 +330,7 @@ def test_stream_captures_in_progress_before_response_and_finalizes_same_id() ->
|
|
|
330
330
|
pool = _Pool()
|
|
331
331
|
store = _Store()
|
|
332
332
|
|
|
333
|
-
async def authorize(_token: str, _adapter_id: str) -> str:
|
|
333
|
+
async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
334
334
|
return "org-1"
|
|
335
335
|
|
|
336
336
|
app = build_serving_app(
|
|
@@ -412,7 +412,7 @@ def test_stream_finalization_preserves_first_event_attestation() -> None:
|
|
|
412
412
|
def test_stream_capture_failure_before_headers_returns_controlled_503() -> None:
|
|
413
413
|
record = _revision()
|
|
414
414
|
|
|
415
|
-
async def authorize(_token: str, _adapter_id: str) -> str:
|
|
415
|
+
async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
416
416
|
return "org-1"
|
|
417
417
|
|
|
418
418
|
app = build_serving_app(
|
|
@@ -439,7 +439,7 @@ def test_thinking_request_is_rejected_before_engine_dispatch() -> None:
|
|
|
439
439
|
record = _revision().model_copy(update={"thinking": True})
|
|
440
440
|
pool = _Pool()
|
|
441
441
|
|
|
442
|
-
async def authorize(_token: str, _adapter_id: str) -> str:
|
|
442
|
+
async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
443
443
|
return "org-1"
|
|
444
444
|
|
|
445
445
|
app = build_serving_app(
|
|
@@ -461,7 +461,7 @@ def test_thinking_request_is_rejected_before_engine_dispatch() -> None:
|
|
|
461
461
|
def test_nonstream_capture_failure_returns_controlled_503() -> None:
|
|
462
462
|
record = _revision()
|
|
463
463
|
|
|
464
|
-
async def authorize(_token: str, _adapter_id: str) -> str:
|
|
464
|
+
async def authorize(_token: str, _adapter_id: str, _scope: dict | None = None) -> str:
|
|
465
465
|
return "org-1"
|
|
466
466
|
|
|
467
467
|
app = build_serving_app(
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/tests/serving/test_usage_reporter.py
RENAMED
|
@@ -124,21 +124,31 @@ def test_lora_engine_scales_to_zero_by_default(modal_app_module):
|
|
|
124
124
|
assert modal_app_module.app.function.call_args.kwargs["min_containers"] == 1
|
|
125
125
|
|
|
126
126
|
|
|
127
|
-
def
|
|
128
|
-
#
|
|
129
|
-
#
|
|
130
|
-
#
|
|
131
|
-
# one
|
|
132
|
-
#
|
|
133
|
-
|
|
127
|
+
def test_no_gpu_engine_is_capped_and_each_keeps_one_buffer(modal_app_module):
|
|
128
|
+
# `base_model` is a modal.parameter(), so Modal gives each distinct value its own container pool
|
|
129
|
+
# with its own autoscaling accounting. A fixed cap therefore ceilings a SINGLE model's capacity
|
|
130
|
+
# rather than bounding total spend -- sustained load on one model cannot borrow headroom from an
|
|
131
|
+
# idle one, so the cap converts demand into queueing on the hot tier. Spend is bounded by workspace
|
|
132
|
+
# quotas and billing alerts instead. Asserted on the kwargs modal is actually CALLED with, because
|
|
133
|
+
# a module constant that never reaches `app.cls` governs nothing.
|
|
134
|
+
assert modal_app_module.MAX_CONTAINERS is None
|
|
135
|
+
assert modal_app_module.BUFFER_CONTAINERS == 1
|
|
134
136
|
|
|
135
137
|
cls_calls = [call.kwargs for call in modal_app_module.app.cls.call_args_list]
|
|
136
138
|
assert len(cls_calls) == len(modal_app_module.ENGINE_BY_KEY)
|
|
137
|
-
assert all(kwargs["max_containers"]
|
|
138
|
-
|
|
139
|
-
#
|
|
140
|
-
#
|
|
141
|
-
assert "
|
|
139
|
+
assert all(kwargs["max_containers"] is None for kwargs in cls_calls)
|
|
140
|
+
# One spare warm container per engine absorbs a burst past TARGET_INPUTS without a cold boot.
|
|
141
|
+
# `buffer_containers` only provisions while the Function is ACTIVE, so this preserves scale-to-zero
|
|
142
|
+
# (MIN_CONTAINERS stays 0) rather than paying for an idle gpu.
|
|
143
|
+
assert all(kwargs["buffer_containers"] == 1 for kwargs in cls_calls)
|
|
144
|
+
assert all(kwargs["min_containers"] == 0 for kwargs in cls_calls)
|
|
145
|
+
|
|
146
|
+
# The cpu router is likewise uncapped: it is the front door that triggers cold engines, and
|
|
147
|
+
# capping it would throttle every model at once rather than bounding gpu spend per model. It
|
|
148
|
+
# carries the same buffer, so a burst does not queue behind the front door it just cleared.
|
|
149
|
+
router_kwargs = modal_app_module.app.function.call_args.kwargs
|
|
150
|
+
assert "max_containers" not in router_kwargs
|
|
151
|
+
assert router_kwargs["buffer_containers"] == 1
|
|
142
152
|
|
|
143
153
|
|
|
144
154
|
def test_scaledown_window_is_per_tier_and_cheaper_tiers_release_sooner(modal_app_module):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/ISSUE_TEMPLATE/feature_request.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{freesolo_flash_dev-1.2.122 → freesolo_flash_dev-1.2.123}/.github/workflows/bake-kernel-cache.yml
RENAMED
|
File without changes
|
|
File without changes
|