freesolo-flash-dev 1.2.94__tar.gz → 1.2.96__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.94 → freesolo_flash_dev-1.2.96}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/__init__.py +14 -19
- freesolo_flash_dev-1.2.96/flash/cli/errors.py +277 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__init__.py +3 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/heartbeat.py +26 -3
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/hf.py +11 -1
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll.py +18 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_theme.py +230 -1
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_poll_helpers.py +28 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_training_controls.py +161 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_init_heartbeat.py +67 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/uv.lock +1 -1
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.env.example +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/CHANGELOG.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/README.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/traces.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/commands/worker_output.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/TRAINING.md +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/glue.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/scoring.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/identity.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/process_census.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/envs/staged.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/teacher/provider_status.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_process_census.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_failure_exit.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_opd_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.94 → freesolo_flash_dev-1.2.96}/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.96
|
|
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
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import argparse
|
|
6
|
-
import difflib
|
|
7
6
|
import math
|
|
8
|
-
import re
|
|
9
7
|
import shlex
|
|
10
8
|
import sys
|
|
11
9
|
from typing import NoReturn
|
|
@@ -57,6 +55,7 @@ from flash.cli.commands.traces import (
|
|
|
57
55
|
RECORDS_FORMAT,
|
|
58
56
|
cmd_traces_export,
|
|
59
57
|
)
|
|
58
|
+
from flash.cli.errors import friendly_error
|
|
60
59
|
from flash.cli.ui import render
|
|
61
60
|
from flash.client.config import shadowed_login_warning
|
|
62
61
|
from flash.core.catalog import ALGORITHMS
|
|
@@ -170,20 +169,6 @@ def _gpu_count_override(value: str) -> str:
|
|
|
170
169
|
raise argparse.ArgumentTypeError(f"expected a number of gpus, got {value!r}") from None
|
|
171
170
|
|
|
172
171
|
|
|
173
|
-
def _friendly_message(message: str) -> str:
|
|
174
|
-
"""Shorten argparse's verbose ``invalid choice: 'x' (choose from a, b, c, ...)`` into a concise
|
|
175
|
-
``unknown command 'x' (did you mean 'y'?)`` — the single closest match instead of dumping the
|
|
176
|
-
whole list. Other messages pass through untouched. Styled path only; the machine path keeps
|
|
177
|
-
argparse's exact text (scripts and the error tests match on the literal `invalid choice`)."""
|
|
178
|
-
m = re.search(r"invalid choice: '([^']*)'(?: \(choose from (.*)\))?", message)
|
|
179
|
-
if not m:
|
|
180
|
-
return message
|
|
181
|
-
bad, raw_choices = m.group(1), m.group(2) or ""
|
|
182
|
-
choices = [c.strip().strip("'\"") for c in raw_choices.split(",") if c.strip()]
|
|
183
|
-
near = difflib.get_close_matches(bad, choices, n=1)
|
|
184
|
-
return f"unknown command '{bad}'" + (f" (did you mean '{near[0]}'?)" if near else "")
|
|
185
|
-
|
|
186
|
-
|
|
187
172
|
class _ThemedParser(argparse.ArgumentParser):
|
|
188
173
|
"""Base parser whose usage errors match the rest of the themed CLI.
|
|
189
174
|
|
|
@@ -201,9 +186,13 @@ class _ThemedParser(argparse.ArgumentParser):
|
|
|
201
186
|
if not render.styled():
|
|
202
187
|
super().error(message) # argparse's raw usage + `prog: error: msg`, then exit 2
|
|
203
188
|
# themed twin: the red ✗ error line (same idiom as main()'s catch-all and `flash login`),
|
|
204
|
-
# then a dimmed pointer at this parser's own --help instead of the raw usage block.
|
|
205
|
-
#
|
|
206
|
-
|
|
189
|
+
# then a dimmed pointer at this parser's own --help instead of the raw usage block. unknown
|
|
190
|
+
# commands and flags get a short "did you mean" suggestion (see `friendly_error`). the argv
|
|
191
|
+
# stash is what tells it which subcommand was selected; only the root parser carries one.
|
|
192
|
+
print(
|
|
193
|
+
render.error(friendly_error(message, self, getattr(self, "_flash_argv", None))),
|
|
194
|
+
file=sys.stderr,
|
|
195
|
+
)
|
|
207
196
|
# dimmed pointer at THIS parser's own --help (argparse sets prog per parser: `flash --help`
|
|
208
197
|
# for the root, `flash <cmd> --help` for a subcommand) instead of the raw usage block.
|
|
209
198
|
print(render.arrow(f"run `{self.prog} --help` for usage"), file=sys.stderr)
|
|
@@ -902,6 +891,12 @@ def _redacted_args(raw_args: list[str]) -> list[str]:
|
|
|
902
891
|
def main(argv: list[str] | None = None) -> int:
|
|
903
892
|
raw_args = list(argv) if argv is not None else sys.argv[1:]
|
|
904
893
|
parser = _build_parser()
|
|
894
|
+
# the tokens this invocation was actually given, for the error hook: argparse reports a
|
|
895
|
+
# subcommand's unknown flags from the ROOT parser, so scoping the suggestion to the selected
|
|
896
|
+
# command needs the argv `main` was called with. reading sys.argv there instead would be right
|
|
897
|
+
# only for the console-script path and wrong for every embedded caller -- including the tests,
|
|
898
|
+
# where it silently reads pytest's own argv and restores the whole-tree pool.
|
|
899
|
+
parser._flash_argv = raw_args
|
|
905
900
|
args = parser.parse_args(argv)
|
|
906
901
|
configure_logging(verbosity=getattr(args, "verbose", 0))
|
|
907
902
|
debug = getattr(args, "debug", False)
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Turning argparse's usage errors into the themed CLI's short suggestions.
|
|
2
|
+
|
|
3
|
+
argparse reports a mistyped flag by printing the whole usage block, which buries the one token that
|
|
4
|
+
was actually wrong. These helpers reduce that to a single line naming the token and, where one
|
|
5
|
+
exists, the closest real alternative.
|
|
6
|
+
|
|
7
|
+
The hard part is making the suggestion one the user can actually follow. A subcommand's unknown
|
|
8
|
+
tokens are handed back to the root parser to report, so candidate options must be recovered from the
|
|
9
|
+
parser in effect at the rejected token's argv position. Looking only at the final selected command
|
|
10
|
+
crosses nested command boundaries, while looking through the whole tree offers unrelated flags.
|
|
11
|
+
|
|
12
|
+
Root flags are also positional here (`flash --debug login`, never `flash login --debug`), and `--`
|
|
13
|
+
stops option parsing. The suggestion context therefore carries both boundaries, plus the original
|
|
14
|
+
spelling of a repeated short root flag that must be moved without changing its count.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import difflib
|
|
21
|
+
import re
|
|
22
|
+
from collections.abc import Iterable
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
|
|
25
|
+
from flash._internal.channel import CLI_NAME
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class _SuggestionContext:
|
|
30
|
+
options: tuple[str, ...]
|
|
31
|
+
root_only: frozenset[str]
|
|
32
|
+
reposition: str | None = None
|
|
33
|
+
after_terminator: bool = False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def friendly_error(
|
|
37
|
+
message: str, parser: argparse.ArgumentParser, argv: Iterable[str] | None
|
|
38
|
+
) -> str:
|
|
39
|
+
"""Rewrite one argparse usage error for the themed CLI.
|
|
40
|
+
|
|
41
|
+
The whole suggestion policy lives behind this call: which parser's flags are candidates, which
|
|
42
|
+
of them need repositioning, and how the message reads. The caller is an ``error()`` override on
|
|
43
|
+
every parser in the tree and should stay a two-liner -- deciding a candidate pool inline there
|
|
44
|
+
would put policy in a hook that exists to print.
|
|
45
|
+
"""
|
|
46
|
+
if argv is None:
|
|
47
|
+
# a subparser raising its own error is already the parser in effect at the rejected token.
|
|
48
|
+
context = _SuggestionContext(tuple(sorted(_direct_options(parser))), frozenset())
|
|
49
|
+
else:
|
|
50
|
+
context = _suggestion_context(message, parser, tuple(argv))
|
|
51
|
+
return _friendly_message(message, context)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _friendly_message(message: str, context: _SuggestionContext) -> str:
|
|
55
|
+
"""Shorten argparse's verbose errors into concise suggestions on the styled path.
|
|
56
|
+
|
|
57
|
+
An ``invalid choice: 'x' (choose from a, b, c, ...)`` becomes ``unknown command 'x' (did you
|
|
58
|
+
mean 'y'?)`` instead of dumping the whole list. An ``unrecognized arguments: --flag value``
|
|
59
|
+
suggests the closest option registered on the parser that rejected it. Other messages pass
|
|
60
|
+
through untouched. The machine path keeps argparse's exact text for scripts and error tests.
|
|
61
|
+
"""
|
|
62
|
+
m = re.search(r"invalid choice: '([^']*)'(?: \(choose from (.*)\))?", message)
|
|
63
|
+
if m:
|
|
64
|
+
bad, raw_choices = m.group(1), m.group(2) or ""
|
|
65
|
+
choices = [c.strip().strip("'\"") for c in raw_choices.split(",") if c.strip()]
|
|
66
|
+
near = difflib.get_close_matches(bad, choices, n=1)
|
|
67
|
+
return f"unknown command '{bad}'" + (f" (did you mean '{near[0]}'?)" if near else "")
|
|
68
|
+
|
|
69
|
+
prefix = "unrecognized arguments: "
|
|
70
|
+
if not message.startswith(prefix):
|
|
71
|
+
return message
|
|
72
|
+
# a bare `-` starts with a dash but names no option, so it is an ordinary positional argparse
|
|
73
|
+
# could not place. requiring a character after the dash keeps it out of the typo machinery,
|
|
74
|
+
# which would otherwise answer it with the nearest short flag.
|
|
75
|
+
bad = next(
|
|
76
|
+
(
|
|
77
|
+
token.split("=", 1)[0]
|
|
78
|
+
for token in message[len(prefix) :].split()
|
|
79
|
+
if token.startswith("-") and len(token.split("=", 1)[0]) > 1
|
|
80
|
+
),
|
|
81
|
+
None,
|
|
82
|
+
)
|
|
83
|
+
if bad is None:
|
|
84
|
+
return message
|
|
85
|
+
if context.after_terminator:
|
|
86
|
+
return message
|
|
87
|
+
# a root flag in the wrong position is a placement error, not a typo. repeatable short flags
|
|
88
|
+
# retain the complete spelling so moving `-vv` never downgrades it to one `-v`.
|
|
89
|
+
if context.reposition is not None:
|
|
90
|
+
return _reposition_message(context.reposition)
|
|
91
|
+
if bad in context.root_only:
|
|
92
|
+
return _reposition_message(bad)
|
|
93
|
+
# the position-scoped pool can still include an exact spelling shared with the root. dropping it
|
|
94
|
+
# keeps a rejected token from being echoed back as its own correction.
|
|
95
|
+
candidates = [option for option in context.options if option != bad]
|
|
96
|
+
near = difflib.get_close_matches(bad, candidates, n=1)
|
|
97
|
+
if not near:
|
|
98
|
+
return message
|
|
99
|
+
suggestion = near[0]
|
|
100
|
+
if suggestion in context.root_only:
|
|
101
|
+
# a root flag only parses before the subcommand, so naming it alone hands back a correction
|
|
102
|
+
# that fails the same way. say where it goes, or the second attempt is the first error again.
|
|
103
|
+
return f"unrecognized argument '{bad}' (did you mean '{suggestion}'? {_placement_hint(suggestion)})"
|
|
104
|
+
return f"unrecognized argument '{bad}' (did you mean '{suggestion}'?)"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _placement_hint(flag: str) -> str:
|
|
108
|
+
"""Say where a root flag belongs, and claim nothing about the rest of the line.
|
|
109
|
+
|
|
110
|
+
This hint knows one thing: the flag parses only ahead of the subcommand. It does not know what
|
|
111
|
+
removing the flag from where it sat exposes. `--wait` takes an optional value, so a flag lifted
|
|
112
|
+
from between `--wait` and a run id leaves the run id to be swallowed as the timeout -- which
|
|
113
|
+
`_wait_seconds` then catches and explains precisely. Stating the destination and stopping there
|
|
114
|
+
keeps this hint true for every line; the one case it cannot see already answers itself.
|
|
115
|
+
|
|
116
|
+
Both the repositioning message and the respelling-plus-repositioning message end in this same
|
|
117
|
+
advice, so they share it rather than each spelling it out and drifting apart.
|
|
118
|
+
"""
|
|
119
|
+
return f"it goes before the command, as `{CLI_NAME} {flag} ...`"
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _reposition_message(flag: str) -> str:
|
|
123
|
+
"""Answer a correctly spelled root flag that landed after the subcommand."""
|
|
124
|
+
return f"unrecognized argument '{flag}' ({_placement_hint(flag)})"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _suggestion_context(
|
|
128
|
+
message: str, root: argparse.ArgumentParser, argv: tuple[str, ...]
|
|
129
|
+
) -> _SuggestionContext:
|
|
130
|
+
root_only = _root_only_options(root)
|
|
131
|
+
bad = _unrecognized_option(message)
|
|
132
|
+
if bad is None:
|
|
133
|
+
return _SuggestionContext((), root_only)
|
|
134
|
+
location = _option_location(root, argv, bad)
|
|
135
|
+
if location is None:
|
|
136
|
+
return _SuggestionContext((), root_only)
|
|
137
|
+
current, after_terminator = location
|
|
138
|
+
reposition = bad if _is_repeated_root_short_option(root, bad, root_only) else None
|
|
139
|
+
options = tuple(sorted({*_direct_options(current), *root_only}))
|
|
140
|
+
return _SuggestionContext(options, root_only, reposition, after_terminator)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _unrecognized_option(message: str) -> str | None:
|
|
144
|
+
prefix = "unrecognized arguments: "
|
|
145
|
+
if not message.startswith(prefix):
|
|
146
|
+
return None
|
|
147
|
+
return next(
|
|
148
|
+
(
|
|
149
|
+
token.split("=", 1)[0]
|
|
150
|
+
for token in message[len(prefix) :].split()
|
|
151
|
+
if token.startswith("-")
|
|
152
|
+
),
|
|
153
|
+
None,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _option_location(
|
|
158
|
+
root: argparse.ArgumentParser, argv: tuple[str, ...], bad: str
|
|
159
|
+
) -> tuple[argparse.ArgumentParser, bool] | None:
|
|
160
|
+
"""Return the parser and terminator state at the rejected token's argv position."""
|
|
161
|
+
current = root
|
|
162
|
+
path_open = True
|
|
163
|
+
after_terminator = False
|
|
164
|
+
fallback: tuple[argparse.ArgumentParser, bool] | None = None
|
|
165
|
+
|
|
166
|
+
for token in argv:
|
|
167
|
+
if token == "--":
|
|
168
|
+
after_terminator = True
|
|
169
|
+
path_open = False
|
|
170
|
+
continue
|
|
171
|
+
if token.split("=", 1)[0] == bad:
|
|
172
|
+
location = (current, after_terminator)
|
|
173
|
+
fallback = location
|
|
174
|
+
# repeated spellings can include one accepted root occurrence and one rejected
|
|
175
|
+
# subcommand occurrence. choose the occurrence argparse could not consume here.
|
|
176
|
+
if after_terminator or len(_option_tuples(current, token)) != 1:
|
|
177
|
+
return location
|
|
178
|
+
if after_terminator or token.startswith("-") or not path_open:
|
|
179
|
+
continue
|
|
180
|
+
subparsers = next(
|
|
181
|
+
(a for a in current._actions if isinstance(a, argparse._SubParsersAction)), None
|
|
182
|
+
)
|
|
183
|
+
if subparsers is None:
|
|
184
|
+
path_open = False
|
|
185
|
+
continue
|
|
186
|
+
nxt = subparsers.choices.get(token)
|
|
187
|
+
if nxt is None:
|
|
188
|
+
path_open = False
|
|
189
|
+
continue
|
|
190
|
+
current = nxt
|
|
191
|
+
|
|
192
|
+
return fallback
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _option_tuples(parser: argparse.ArgumentParser, token: str) -> list:
|
|
196
|
+
"""The prefix matches for a token, for tokens argparse's own helper cannot be asked about.
|
|
197
|
+
|
|
198
|
+
`_get_option_tuples` indexes the token's second character, so a bare ``-`` raises IndexError
|
|
199
|
+
there. A lone dash is an ordinary unrecognized positional and must reach argparse's own message
|
|
200
|
+
rather than crash the code that was trying to improve it.
|
|
201
|
+
"""
|
|
202
|
+
if len(token) < 2:
|
|
203
|
+
return []
|
|
204
|
+
return parser._get_option_tuples(token)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _parse_optional_fields(
|
|
208
|
+
parser: argparse.ArgumentParser, token: str
|
|
209
|
+
) -> tuple[object, str | None, str | None] | None:
|
|
210
|
+
"""The action, option spelling and explicit remainder argparse reads out of a token.
|
|
211
|
+
|
|
212
|
+
`_parse_optional` has three shapes across the interpreters `requires-python` admits: a 3-tuple
|
|
213
|
+
before 3.11.9/3.12.3, a 4-tuple once a separator was inserted, and from 3.12.11 a LIST of those
|
|
214
|
+
tuples, one per prefix match. Normalizing here keeps that churn in one place, and keeps the
|
|
215
|
+
separator out of the caller: the exact-spelling reconstruction the caller does already settles
|
|
216
|
+
what the separator would have told it. An unfamiliar shape returns None rather than raising,
|
|
217
|
+
because this runs inside the handler whose whole job is to render someone else's error.
|
|
218
|
+
"""
|
|
219
|
+
parsed = parser._parse_optional(token)
|
|
220
|
+
if isinstance(parsed, list):
|
|
221
|
+
# several prefix matches means the spelling is ambiguous, so it is not one repeated flag.
|
|
222
|
+
parsed = parsed[0] if len(parsed) == 1 else None
|
|
223
|
+
if not isinstance(parsed, tuple) or len(parsed) not in (3, 4):
|
|
224
|
+
return None
|
|
225
|
+
return parsed[0], parsed[1], parsed[-1]
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _is_repeated_root_short_option(
|
|
229
|
+
root: argparse.ArgumentParser, token: str, root_only: frozenset[str]
|
|
230
|
+
) -> bool:
|
|
231
|
+
"""Whether token is a compact repeat of a count-style root option, such as ``-vv``."""
|
|
232
|
+
if not token.startswith("-") or token.startswith("--"):
|
|
233
|
+
return False
|
|
234
|
+
fields = _parse_optional_fields(root, token)
|
|
235
|
+
if fields is None:
|
|
236
|
+
return False
|
|
237
|
+
action, option, explicit = fields
|
|
238
|
+
return (
|
|
239
|
+
isinstance(action, argparse._CountAction)
|
|
240
|
+
and option in root_only
|
|
241
|
+
and isinstance(explicit, str)
|
|
242
|
+
and bool(explicit)
|
|
243
|
+
# the whole token must be that one short flag repeated, so `-vx` and `-v=2` are not repeats.
|
|
244
|
+
and token == option + option[-1] * len(explicit)
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _direct_options(parser: argparse.ArgumentParser) -> Iterable[str]:
|
|
249
|
+
for action in parser._actions:
|
|
250
|
+
yield from action.option_strings
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _parser_options(parser: argparse.ArgumentParser) -> Iterable[str]:
|
|
254
|
+
"""Yield option strings registered on a parser and its subparsers."""
|
|
255
|
+
yield from _direct_options(parser)
|
|
256
|
+
for action in parser._actions:
|
|
257
|
+
if isinstance(action, argparse._SubParsersAction):
|
|
258
|
+
for subparser in action.choices.values():
|
|
259
|
+
yield from _parser_options(subparser)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def _root_only_options(parser: argparse.ArgumentParser) -> frozenset[str]:
|
|
263
|
+
"""Option strings accepted only BEFORE the subcommand.
|
|
264
|
+
|
|
265
|
+
This CLI's root flags are positional: `flash --debug login` parses, `flash login --debug` does
|
|
266
|
+
not. A suggestion drawn from the whole option pool can therefore name a real flag that still
|
|
267
|
+
fails in the position the user typed it, so the caller needs to know which ones to reposition.
|
|
268
|
+
"""
|
|
269
|
+
root: set[str] = set()
|
|
270
|
+
sub: set[str] = set()
|
|
271
|
+
for action in parser._actions:
|
|
272
|
+
if isinstance(action, argparse._SubParsersAction):
|
|
273
|
+
for subparser in action.choices.values():
|
|
274
|
+
sub.update(_parser_options(subparser))
|
|
275
|
+
else:
|
|
276
|
+
root.update(action.option_strings)
|
|
277
|
+
return frozenset(root - sub)
|
|
@@ -145,6 +145,9 @@ _HB_LAST_PROGRESS_TS = 0.0
|
|
|
145
145
|
# per-step heartbeat past the provider's stall window, killing a healthy run.
|
|
146
146
|
_HB_PROGRESS_SEQ = 0
|
|
147
147
|
_HB_PROGRESS_UPLOADED_SEQ = 0
|
|
148
|
+
# a replace-in-place failure heartbeat can be overwritten before the provider polls it. retain the
|
|
149
|
+
# failed checkpoint identity and cause so every terminal heartbeat carries the same structured state.
|
|
150
|
+
_HB_PENDING_CHECKPOINT_FAILURE: dict[str, int | str] | None = None
|
|
148
151
|
# Environment-scoped artifact repos are shared by many runs. Keep heartbeat commits below the HF
|
|
149
152
|
# per-repo commit cap while staying under the provider poller's training stall window
|
|
150
153
|
# (STALL_AFTER_S=1500s in flash/providers/_lifecycle/poll.py).
|
|
@@ -78,15 +78,27 @@ _HB_THROTTLED_STAGES = _HB_TIGHT_LIVENESS_STAGES | frozenset({"rl_step", "sft_st
|
|
|
78
78
|
# right after a download that has been pinging throughout, so the throttle would almost always
|
|
79
79
|
# swallow it. the wrap that follows re-emits with liveness=True and stays throttled.
|
|
80
80
|
_HB_MODEL_LOAD_STAGES = frozenset({"sft_model_load", "opd_model_load"})
|
|
81
|
-
|
|
81
|
+
_HB_SUCCESS_TERMINAL_STAGES = frozenset({"done", "already_done"})
|
|
82
82
|
# 600s -> ~6 commits/hr; keeps stall detector alive without hitting the HF commit cap.
|
|
83
83
|
_HB_TERMINAL_ONLY_INTERVAL_S = 600.0
|
|
84
84
|
|
|
85
85
|
|
|
86
|
+
def _is_terminal_stage(stage: str) -> bool:
|
|
87
|
+
"""return whether this stage ends the worker attempt."""
|
|
88
|
+
return stage in _HB_SUCCESS_TERMINAL_STAGES or stage.startswith("error_")
|
|
89
|
+
|
|
90
|
+
|
|
86
91
|
def _is_critical_stage(stage: str) -> bool:
|
|
87
92
|
"""A terminal transition or an error is CRITICAL: never throttled (the commit must land) and
|
|
88
|
-
given the longer upload-lock timeout, because no later heartbeat can repair a missed one.
|
|
89
|
-
|
|
93
|
+
given the longer upload-lock timeout, because no later heartbeat can repair a missed one.
|
|
94
|
+
|
|
95
|
+
`_failed` earns this as much as the `error_` prefix does: a failure heartbeat is emitted once, at
|
|
96
|
+
the moment the failure is known, and nothing later restates it. `checkpoint_upload_failed` is
|
|
97
|
+
raised from inside a long HF upload, which is precisely when `_HB_UPLOAD_IN_FLIGHT` is set and an
|
|
98
|
+
unforced ping is dropped -- so the one report of the failure would be discarded exactly in the
|
|
99
|
+
case that produces it.
|
|
100
|
+
"""
|
|
101
|
+
return _is_terminal_stage(stage) or stage.endswith("_failed")
|
|
90
102
|
|
|
91
103
|
|
|
92
104
|
# Guards throttle bookkeeping; slow HF commit runs outside this lock so heartbeat and liveness
|
|
@@ -210,6 +222,17 @@ def heartbeat(
|
|
|
210
222
|
):
|
|
211
223
|
genuine_progress = not liveness
|
|
212
224
|
with _HB_LOCK:
|
|
225
|
+
if stage == "checkpoint_upload_failed":
|
|
226
|
+
failure = kw.get("checkpoint_failure")
|
|
227
|
+
if isinstance(failure, dict):
|
|
228
|
+
_w._HB_PENDING_CHECKPOINT_FAILURE = dict(failure)
|
|
229
|
+
elif stage == "checkpoint_uploaded":
|
|
230
|
+
# a later full resume checkpoint landed, so the earlier failure no longer describes the
|
|
231
|
+
# run's outcome. deployable or final adapter publication cannot clear this because neither
|
|
232
|
+
# restores the missing full resume state.
|
|
233
|
+
_w._HB_PENDING_CHECKPOINT_FAILURE = None
|
|
234
|
+
elif _is_terminal_stage(stage) and _w._HB_PENDING_CHECKPOINT_FAILURE:
|
|
235
|
+
kw.setdefault("checkpoint_failure", dict(_w._HB_PENDING_CHECKPOINT_FAILURE))
|
|
213
236
|
ts = time.time()
|
|
214
237
|
if genuine_progress:
|
|
215
238
|
_w._HB_LAST_PROGRESS_TS = ts
|
|
@@ -553,7 +553,17 @@ def upload_resume_checkpoint(
|
|
|
553
553
|
)
|
|
554
554
|
if emit_heartbeat:
|
|
555
555
|
with contextlib.suppress(Exception):
|
|
556
|
-
|
|
556
|
+
# worker stdout is not part of control-plane run logs, so the stage
|
|
557
|
+
# name alone would otherwise be the entire failure report.
|
|
558
|
+
_w.heartbeat(
|
|
559
|
+
"checkpoint_upload_failed",
|
|
560
|
+
step=step,
|
|
561
|
+
checkpoint_failure={
|
|
562
|
+
"step": step,
|
|
563
|
+
"operation": failure_stage,
|
|
564
|
+
"error": sanitize_diagnostic(e, limit=300),
|
|
565
|
+
},
|
|
566
|
+
)
|
|
557
567
|
if failure_stage in {"before", "after"}:
|
|
558
568
|
raise
|
|
559
569
|
return False
|
|
@@ -262,7 +262,25 @@ def _format_heartbeat(hb: dict) -> str:
|
|
|
262
262
|
for name, value in reward_metrics.items():
|
|
263
263
|
if isinstance(value, (int, float)):
|
|
264
264
|
msg += f" {name}={value:.3f}"
|
|
265
|
+
error = hb.get("error")
|
|
266
|
+
if isinstance(error, str) and error.strip():
|
|
267
|
+
msg += f" error={error.strip()}"
|
|
268
|
+
checkpoint_failure = hb.get("checkpoint_failure")
|
|
269
|
+
if isinstance(checkpoint_failure, dict):
|
|
270
|
+
failure_step = checkpoint_failure.get("step")
|
|
271
|
+
if isinstance(failure_step, (int, float)) and not isinstance(failure_step, bool):
|
|
272
|
+
msg += f" checkpoint_failure_step={int(failure_step)}"
|
|
273
|
+
operation = checkpoint_failure.get("operation")
|
|
274
|
+
if isinstance(operation, str) and operation.strip():
|
|
275
|
+
msg += f" checkpoint_failure_stage={operation.strip()}"
|
|
276
|
+
checkpoint_error = checkpoint_failure.get("error")
|
|
277
|
+
if isinstance(checkpoint_error, str) and checkpoint_error.strip():
|
|
278
|
+
msg += f" checkpoint_error={checkpoint_error.strip()}"
|
|
265
279
|
msg += format_gpu_status(hb.get("gpu"))
|
|
280
|
+
# everything above is one summary record, including untrusted stage, error, and gpu fallback text.
|
|
281
|
+
# sanitize it once at that boundary so no field can forge a second worker record. the deliberately
|
|
282
|
+
# multiline sample and child-output sections are appended below and retain their line breaks.
|
|
283
|
+
msg = neutralize_control_chars(msg).replace("\n", "\\n")
|
|
266
284
|
sample_lines: list[str] = []
|
|
267
285
|
rendered_samples = 0
|
|
268
286
|
samples = hb.get("sampled_completions")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "freesolo-flash-dev"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.96"
|
|
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).
|
|
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
|
|
|
137
137
|
# auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
|
|
138
138
|
# PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
|
|
139
139
|
# dev-channel release = bump this (and [project].version) and merge to `dev`.
|
|
140
|
-
version = "1.2.
|
|
140
|
+
version = "1.2.96"
|
|
141
141
|
|
|
142
142
|
[tool.pytest.ini_options]
|
|
143
143
|
pythonpath = ["."]
|