freesolo-flash-dev 1.2.63__tar.gz → 1.2.64__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.63 → freesolo_flash_dev-1.2.64}/CHANGELOG.md +4 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/setup.py +40 -20
- freesolo_flash_dev-1.2.64/flash/cli/commands/env/setup_wandb.py +30 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/traces.py +2 -2
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/scaffold/TRAINING.md +4 -2
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/__init__.py +14 -4
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/opd_train_runner.py +35 -17
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/child/glue.py +158 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/child/runtime.py +15 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/bridge.py +90 -117
- freesolo_flash_dev-1.2.64/flash/engine/worker/train/opd/bridge_failures.py +117 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/multiturn.py +30 -9
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/plugin.py +3 -21
- freesolo_flash_dev-1.2.64/flash/engine/worker/train/opd/scoring.py +86 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/child/multiturn.py +3 -58
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/sft/child/plugin.py +3 -2
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/pyproject.toml +2 -2
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_commands.py +242 -11
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_dev_channel.py +5 -1
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_envs_coverage.py +8 -2
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_multiturn_failure_exit.py +10 -1
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_train.py +689 -4
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_train.py +59 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_wandb_link.py +163 -6
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/uv.lock +1 -1
- freesolo_flash_dev-1.2.63/flash/engine/worker/train/opd/scoring.py +0 -73
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.dockerignore +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.env.example +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/.gitignore +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/CODE_OF_CONDUCT.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/CONTRIBUTING.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/Dockerfile +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/LICENSE +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/NOTICE +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/README.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/SECURITY.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/SELF_HOSTING.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/deploy/infisical/README.md +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/bake_pod_entry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/docker/make_rp_handler.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/deploy.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/episode.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/eval.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/eval_args.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/imports.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/list.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/push.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/retained.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/test.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/test_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/test_params.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/env/test_warnings.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/commands/train_cost.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/core/catalog.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/huggingface.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/backend_common.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/entry/opd.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/entry/sft.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/io/hf.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/opd_train.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/perf/liger.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/rl_train.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/rl_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/score_batcher.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/sft_train.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/teacher/client.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/teacher/encoding.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/step_timing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/finalize.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/batching.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/bridge.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/runtime.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/child/structured.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/failures.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/gkd.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/overrides.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/prompts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/reporting.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/state.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/opd/validation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/child/patches.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/child/plugin.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/config.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/inputs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/multi_turn.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/reward_module.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/scoring.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/single_turn.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/rl/verl_config.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/sft/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/sft/config.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/adapter.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/base.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/cache_security.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/evaluations.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/identity.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/loader.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/envs/pull.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/auth.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/bootstrap.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/deadline.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/host/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/host/failmark.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/host/hostlog.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/http.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/instance.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/poll.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/poll_instance.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/provider.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/_lifecycle/worker.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/allocator.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/artifacts/hf.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/artifacts/preload_runpod.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/base.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/fit_errors.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/auth.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/gpus.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/jobs/reap.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/lambda_/pricing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/realized.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/auth.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/cost.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/gpus.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/job_execution.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/jobs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/pricing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/resources.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/serverless/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/runpod/serverless/endpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/sharding.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/auth.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/jobs/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/jobs/builders.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/providers/vast/pricing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/artifacts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/attempts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/costs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/deadlines.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/preparation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/reconciliation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/results/verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/status.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/submit.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/seed_submission.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runner/weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/adapter_check.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/deploy.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/errors.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/export.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/responses.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/streaming.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/thinking.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/serve/urls.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/app.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/environment_registry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/envs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/projects.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/reconcile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/run_registry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/teacher_errors.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/domain/teacher_requests.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/server/routes/teacher.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/teacher/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/teacher/limits.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/teacher/retry_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/scripts/scrub_history.sh +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/teacher.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/_helpers/vast.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/fixtures/math_eval.jsonl +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/fixtures/math_train.jsonl +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/test_lambda_live.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/test_runpod_live.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/live/test_vast_live.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cancel_remote.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_deploy_alias_move_warning.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_endpoint_name.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_list_hub.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_idle_endpoint_reaper.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_jobs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_lambda_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_lambda_runner.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_limits.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_multiturn_eos_boundary.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_replay_guard.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_opd_resume_safety.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_parasail_teacher.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_provider_preflight_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_provider_routing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_provider_teardown_robustness.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_providers_symmetry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_realized_cost.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_runpod_api_delete.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_runpod_key_fingerprint.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_runpod_key_waterfall.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_startup_block.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_teacher_broker.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_teacher_encoding_contract.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vast_api.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vast_api_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vast_offers.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vast_provider_coverage.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vast_runner.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_verified_revisions.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_workflow_contracts.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/tests/test_zero2_sharding_gate.py +0 -0
|
@@ -54,6 +54,10 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
|
|
|
54
54
|
|
|
55
55
|
### Fixed
|
|
56
56
|
|
|
57
|
+
- Completed verl children now finish each captured W&B run before the W&B service shuts down,
|
|
58
|
+
avoiding teardown tracebacks, and `flash env setup` now gives every starter config explicit W&B
|
|
59
|
+
project and folder-derived run metadata.
|
|
60
|
+
|
|
57
61
|
- An ordered `[gpu] type` list is now priced over every class it declares acceptable, not just the
|
|
58
62
|
first. Allocation cost-ranks the whole set, so quoting the head alone priced a shape the run may
|
|
59
63
|
never be given — an authored `["B200", "H100"]` quoted roughly 3x the H100 the allocator would
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.64
|
|
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
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import json
|
|
6
6
|
import sys
|
|
7
7
|
import tomllib
|
|
8
|
+
from collections.abc import Mapping
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
10
11
|
from flash._internal.channel import CLI_NAME
|
|
@@ -13,6 +14,7 @@ from flash.cli.commands.env.retained import (
|
|
|
13
14
|
_warn_if_environment_form_disagrees,
|
|
14
15
|
_warn_if_retained_starter_files_describe_another_plane,
|
|
15
16
|
)
|
|
17
|
+
from flash.cli.commands.env.setup_wandb import _wandb_block, _wandb_project
|
|
16
18
|
from flash.cli.scaffold import TRAINING_MD
|
|
17
19
|
from flash.cli.ui import render
|
|
18
20
|
from flash.envs.evaluations import _DEFAULT_EVALUATIONS_PATH
|
|
@@ -358,22 +360,14 @@ _REASONING_OPTIONS = [
|
|
|
358
360
|
_SKIP_TRACES = "" # sentinel option value: scaffold the starter rows instead of importing
|
|
359
361
|
|
|
360
362
|
|
|
361
|
-
def _require_setup_project(args) -> str:
|
|
363
|
+
def _require_setup_project(args, *, api_url: str | None, api_key: str) -> Mapping[str, object]:
|
|
362
364
|
"""Resolve and validate the one explicit project used by the whole scaffold."""
|
|
363
|
-
from flash.client import ClientError, list_projects,
|
|
364
|
-
from flash.client.config import load_credentials
|
|
365
|
+
from flash.client import ClientError, list_projects, resolve_project
|
|
365
366
|
from flash.client.http import has_freesolo_backend
|
|
366
367
|
|
|
367
|
-
api_url, api_key = load_credentials()
|
|
368
|
-
if not api_key:
|
|
369
|
-
raise ClientError(
|
|
370
|
-
f"not logged in. Run `{CLI_NAME} login` before `{CLI_NAME} env setup` "
|
|
371
|
-
"so the project can be validated"
|
|
372
|
-
)
|
|
373
|
-
|
|
374
368
|
supplied = str(getattr(args, "project", "") or "").strip()
|
|
375
369
|
if supplied:
|
|
376
|
-
return
|
|
370
|
+
return resolve_project(supplied, api_key, api_url)
|
|
377
371
|
if not _setup_interactive(args):
|
|
378
372
|
raise ClientError(
|
|
379
373
|
"--project PROJECT_UUID is required in noninteractive mode, with redirected stdin, or with --yes"
|
|
@@ -395,7 +389,7 @@ def _require_setup_project(args) -> str:
|
|
|
395
389
|
f"`{CLI_NAME} projects create NAME`"
|
|
396
390
|
)
|
|
397
391
|
selected = render.select_required("Choose the Freesolo project for this environment", options)
|
|
398
|
-
return
|
|
392
|
+
return resolve_project(selected, api_key, api_url)
|
|
399
393
|
|
|
400
394
|
|
|
401
395
|
# Guidance the starter .py docstrings carry, per plane kind. The templates hold placeholders
|
|
@@ -450,7 +444,7 @@ def _render_starter(template: str, project_id: str, *, can_publish: bool) -> str
|
|
|
450
444
|
return template.replace("PROJECT_UUID", project_id)
|
|
451
445
|
|
|
452
446
|
|
|
453
|
-
def _plane_can_publish_environments() -> bool:
|
|
447
|
+
def _plane_can_publish_environments(api_url: str | None) -> bool:
|
|
454
448
|
"""Whether `flash env push` can actually publish for the logged-in plane.
|
|
455
449
|
|
|
456
450
|
Publishing uploads to the plane, which commits into the managed environment hub
|
|
@@ -462,10 +456,8 @@ def _plane_can_publish_environments() -> bool:
|
|
|
462
456
|
operator-run Freesolo-compatible backend has a project directory (which is what that helper
|
|
463
457
|
answers) but still cannot publish to the hub.
|
|
464
458
|
"""
|
|
465
|
-
from flash.client.config import load_credentials
|
|
466
459
|
from flash.serve.urls import is_freesolo_hosted_url
|
|
467
460
|
|
|
468
|
-
api_url, _ = load_credentials()
|
|
469
461
|
# Unset means the built-in default, which is the managed plane.
|
|
470
462
|
return api_url is None or is_freesolo_hosted_url(api_url)
|
|
471
463
|
|
|
@@ -553,7 +545,7 @@ def _existing_reasoning(configs: tuple[Path, ...]) -> bool | None:
|
|
|
553
545
|
return next(iter(found.values()), None)
|
|
554
546
|
|
|
555
547
|
|
|
556
|
-
def _traces_dataset(args, project_id: str) -> str | None:
|
|
548
|
+
def _traces_dataset(args, project_id: str, api_key: str) -> str | None:
|
|
557
549
|
"""Optionally export traces from the already-selected project."""
|
|
558
550
|
if not _setup_interactive(args):
|
|
559
551
|
return None
|
|
@@ -568,7 +560,7 @@ def _traces_dataset(args, project_id: str) -> str | None:
|
|
|
568
560
|
if use_traces == _SKIP_TRACES:
|
|
569
561
|
return None
|
|
570
562
|
try:
|
|
571
|
-
exported = traces.fetch_records(project_id)
|
|
563
|
+
exported = traces.fetch_records(project_id, api_key)
|
|
572
564
|
except Exception as exc: # trace import is optional after project validation succeeds
|
|
573
565
|
_warn(f"could not export traces from {project_id} ({exc}); using the starter dataset")
|
|
574
566
|
return None
|
|
@@ -692,6 +684,7 @@ def _write_rl_config(
|
|
|
692
684
|
rl: Path,
|
|
693
685
|
project_line: str,
|
|
694
686
|
thinking_line: str,
|
|
687
|
+
wandb_block: str,
|
|
695
688
|
env_comment: str,
|
|
696
689
|
max_examples_line: str,
|
|
697
690
|
rl_reasoning_train: str,
|
|
@@ -704,6 +697,7 @@ def _write_rl_config(
|
|
|
704
697
|
'algorithm = "grpo"\n'
|
|
705
698
|
f"{thinking_line}"
|
|
706
699
|
"\n"
|
|
700
|
+
f"{wandb_block}"
|
|
707
701
|
f"{env_comment}"
|
|
708
702
|
"[train]\n"
|
|
709
703
|
"epochs = 1\n"
|
|
@@ -722,6 +716,7 @@ def _write_sft_config(
|
|
|
722
716
|
sft: Path,
|
|
723
717
|
project_line: str,
|
|
724
718
|
thinking_line: str,
|
|
719
|
+
wandb_block: str,
|
|
725
720
|
env_comment: str,
|
|
726
721
|
max_examples_line: str,
|
|
727
722
|
sft_reasoning_note: str,
|
|
@@ -734,6 +729,7 @@ def _write_sft_config(
|
|
|
734
729
|
'algorithm = "sft"\n'
|
|
735
730
|
f"{thinking_line}"
|
|
736
731
|
"\n"
|
|
732
|
+
f"{wandb_block}"
|
|
737
733
|
f"{env_comment}"
|
|
738
734
|
"[train]\n"
|
|
739
735
|
"epochs = 1\n"
|
|
@@ -766,6 +762,7 @@ def _write_opd_config(
|
|
|
766
762
|
project_line: str,
|
|
767
763
|
project_id: str,
|
|
768
764
|
thinking_line: str,
|
|
765
|
+
wandb_block: str,
|
|
769
766
|
max_examples_line: str,
|
|
770
767
|
*,
|
|
771
768
|
can_publish: bool = True,
|
|
@@ -788,6 +785,7 @@ def _write_opd_config(
|
|
|
788
785
|
'algorithm = "opd" # on-policy distillation from a managed parasail teacher (default glm 5.2)\n'
|
|
789
786
|
f"{thinking_line}"
|
|
790
787
|
"\n"
|
|
788
|
+
f"{wandb_block}"
|
|
791
789
|
+ _environment_comment(
|
|
792
790
|
project_id,
|
|
793
791
|
can_publish=can_publish,
|
|
@@ -816,15 +814,34 @@ def _write_training_guide(training: Path, project_id: str) -> None:
|
|
|
816
814
|
)
|
|
817
815
|
|
|
818
816
|
|
|
817
|
+
def _resolve_setup_identity(args) -> tuple[str, str, str, str, str]:
|
|
818
|
+
"""Resolve the credential, project, and folder identity used by every setup phase."""
|
|
819
|
+
from flash.client import ClientError
|
|
820
|
+
from flash.client.config import load_credentials
|
|
821
|
+
|
|
822
|
+
api_url, api_key = load_credentials()
|
|
823
|
+
if not api_key:
|
|
824
|
+
raise ClientError(
|
|
825
|
+
f"not logged in. Run `{CLI_NAME} login` before `{CLI_NAME} env setup` "
|
|
826
|
+
"so the project can be validated"
|
|
827
|
+
)
|
|
828
|
+
project = _require_setup_project(args, api_url=api_url, api_key=api_key)
|
|
829
|
+
project_id = str(project["id"])
|
|
830
|
+
folder_name = Path.cwd().name
|
|
831
|
+
if not folder_name.strip():
|
|
832
|
+
raise ClientError("the current environment folder name must be nonblank")
|
|
833
|
+
return api_url, api_key, project_id, _wandb_project(project), folder_name
|
|
834
|
+
|
|
835
|
+
|
|
819
836
|
def cmd_env_setup(args) -> int:
|
|
820
|
-
project_id =
|
|
837
|
+
api_url, api_key, project_id, project_name, folder_name = _resolve_setup_identity(args)
|
|
821
838
|
_validate_existing_config_projects(project_id)
|
|
822
839
|
starter_env = Path("environment.py")
|
|
823
840
|
starter_evaluations = Path(_DEFAULT_EVALUATIONS_PATH)
|
|
824
841
|
dataset = Path("dataset/train.jsonl")
|
|
825
842
|
# trace import is optional and can only read the selected project. an existing dataset is never
|
|
826
843
|
# overwritten, so importing into it would be a silently discarded download.
|
|
827
|
-
traces_jsonl = None if dataset.exists() else _traces_dataset(args, project_id)
|
|
844
|
+
traces_jsonl = None if dataset.exists() else _traces_dataset(args, project_id, api_key)
|
|
828
845
|
multi_turn, starter_env_exists = _resolve_turn_mode(args, starter_env, dataset)
|
|
829
846
|
|
|
830
847
|
rl = Path("configs/rl.toml")
|
|
@@ -837,7 +854,7 @@ def cmd_env_setup(args) -> int:
|
|
|
837
854
|
reasoning_configs = (rl, opd, sft)
|
|
838
855
|
reasoning = _resolve_reasoning_mode(args, reasoning_configs)
|
|
839
856
|
|
|
840
|
-
can_publish = _plane_can_publish_environments()
|
|
857
|
+
can_publish = _plane_can_publish_environments(api_url)
|
|
841
858
|
_warn_if_environment_form_disagrees(reasoning_configs, can_publish=can_publish, warn=_warn)
|
|
842
859
|
env_py = _render_starter(
|
|
843
860
|
_STARTER_ENV_MULTITURN_PY if multi_turn else _STARTER_ENV_PY,
|
|
@@ -908,6 +925,7 @@ def cmd_env_setup(args) -> int:
|
|
|
908
925
|
rl,
|
|
909
926
|
project_line,
|
|
910
927
|
thinking_line,
|
|
928
|
+
_wandb_block(project_name, f"{folder_name}-grpo"),
|
|
911
929
|
env_comment,
|
|
912
930
|
max_examples_line,
|
|
913
931
|
rl_reasoning_train,
|
|
@@ -916,6 +934,7 @@ def cmd_env_setup(args) -> int:
|
|
|
916
934
|
sft,
|
|
917
935
|
project_line,
|
|
918
936
|
thinking_line,
|
|
937
|
+
_wandb_block(project_name, f"{folder_name}-sft"),
|
|
919
938
|
env_comment,
|
|
920
939
|
max_examples_line,
|
|
921
940
|
sft_reasoning_note,
|
|
@@ -927,6 +946,7 @@ def cmd_env_setup(args) -> int:
|
|
|
927
946
|
project_line,
|
|
928
947
|
project_id,
|
|
929
948
|
thinking_line,
|
|
949
|
+
_wandb_block(project_name, f"{folder_name}-opd"),
|
|
930
950
|
max_examples_line,
|
|
931
951
|
can_publish=can_publish,
|
|
932
952
|
)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""W&B metadata helpers for environment scaffolds."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
|
|
8
|
+
_WANDB_PROJECT_MAX_LENGTH = 128
|
|
9
|
+
_WANDB_PROJECT_FORBIDDEN = frozenset("/\\#?%:")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _wandb_project(project: Mapping[str, object]) -> str:
|
|
13
|
+
"""Adapt a resolved canonical project to a W&B-safe project name."""
|
|
14
|
+
project_id = str(project["id"])
|
|
15
|
+
name = project.get("name")
|
|
16
|
+
if not isinstance(name, str) or not name.strip():
|
|
17
|
+
return project_id
|
|
18
|
+
if len(name) > _WANDB_PROJECT_MAX_LENGTH or any(
|
|
19
|
+
character in _WANDB_PROJECT_FORBIDDEN for character in name
|
|
20
|
+
):
|
|
21
|
+
return project_id
|
|
22
|
+
return name
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _wandb_block(project_name: str, run_name: str) -> str:
|
|
26
|
+
return (
|
|
27
|
+
"[wandb]\n"
|
|
28
|
+
f"project = {json.dumps(project_name, ensure_ascii=False)}\n"
|
|
29
|
+
f"run_name = {json.dumps(run_name, ensure_ascii=False)}\n\n"
|
|
30
|
+
)
|
|
@@ -77,8 +77,8 @@ def fetch_records(
|
|
|
77
77
|
) -> dict:
|
|
78
78
|
"""A project's traces in the requested shape, converted server-side.
|
|
79
79
|
|
|
80
|
-
Omitting `api_key` reads the stored credential
|
|
81
|
-
|
|
80
|
+
Omitting `api_key` reads the stored credential. Callers that already resolved configuration
|
|
81
|
+
should pass the key from that snapshot so a concurrent login cannot change the request identity.
|
|
82
82
|
"""
|
|
83
83
|
key = _require_api_key(api_key or load_credentials()[1])
|
|
84
84
|
return export_trace_records(project_id, key, export_format=export_format)
|
|
@@ -272,8 +272,10 @@ lora_rank = 32 # lora_alpha defaults to 2 x lora_rank; set it to ov
|
|
|
272
272
|
# All knobs live under [train]. Do not add [sft], [grpo], or [opd] tables.
|
|
273
273
|
|
|
274
274
|
[wandb]
|
|
275
|
-
#
|
|
276
|
-
#
|
|
275
|
+
# new scaffolds set `project` from the selected Freesolo project and `run_name` from the folder
|
|
276
|
+
# plus algorithm. edit either value as needed; only `project` and `run_name` are allowed.
|
|
277
|
+
# project = "my-project"
|
|
278
|
+
# run_name = "sft-run-1"
|
|
277
279
|
```
|
|
278
280
|
|
|
279
281
|
**Knobs are scoped by algorithm.** `[train]` is one flat table shared by all three algorithms,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""HTTP client for the managed Flash control plane (used by the CLI)."""
|
|
2
2
|
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
|
|
3
5
|
from flash._internal.channel import CLI_NAME
|
|
4
6
|
from flash.client.config import load_credentials, save_credentials
|
|
5
7
|
from flash.client.http import (
|
|
@@ -20,8 +22,10 @@ from flash.client.http import (
|
|
|
20
22
|
from flash.core.spec import require_project_id
|
|
21
23
|
|
|
22
24
|
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
+
def resolve_project(
|
|
26
|
+
project_id: str, api_key: str, api_url: str | None = None
|
|
27
|
+
) -> Mapping[str, object]:
|
|
28
|
+
"""Resolve one project, turning "not yours / not there" into the actionable CLI refusal.
|
|
25
29
|
|
|
26
30
|
403 and 404 are the same answer to a CLI user -- this project is not one you can record against
|
|
27
31
|
-- and neither is distinguishable from a typo, so they collapse into one message naming the way
|
|
@@ -48,9 +52,9 @@ def resolve_project_id(project_id: str, api_key: str, api_url: str | None = None
|
|
|
48
52
|
at call time, which is the binding the CLI tests patch.
|
|
49
53
|
"""
|
|
50
54
|
if api_url is not None and not has_freesolo_backend(api_url):
|
|
51
|
-
return require_project_id(project_id)
|
|
55
|
+
return {"id": require_project_id(project_id)}
|
|
52
56
|
try:
|
|
53
|
-
return
|
|
57
|
+
return get_project(project_id, api_key)
|
|
54
58
|
except ApiError as exc:
|
|
55
59
|
if exc.status not in {403, 404}:
|
|
56
60
|
raise
|
|
@@ -60,6 +64,11 @@ def resolve_project_id(project_id: str, api_key: str, api_url: str | None = None
|
|
|
60
64
|
) from exc
|
|
61
65
|
|
|
62
66
|
|
|
67
|
+
def resolve_project_id(project_id: str, api_key: str, api_url: str | None = None) -> str:
|
|
68
|
+
"""Resolve and return one canonical project id."""
|
|
69
|
+
return str(resolve_project(project_id, api_key, api_url)["id"])
|
|
70
|
+
|
|
71
|
+
|
|
63
72
|
__all__ = [
|
|
64
73
|
"ApiClient",
|
|
65
74
|
"ApiError",
|
|
@@ -72,6 +81,7 @@ __all__ = [
|
|
|
72
81
|
"list_projects",
|
|
73
82
|
"list_trace_projects",
|
|
74
83
|
"load_credentials",
|
|
84
|
+
"resolve_project",
|
|
75
85
|
"resolve_project_id",
|
|
76
86
|
"save_credentials",
|
|
77
87
|
"upload_eval_run",
|
{freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/opd_train_runner.py
RENAMED
|
@@ -124,6 +124,31 @@ def _validate_teacher_transport() -> tuple[str, str]:
|
|
|
124
124
|
return capability, control_panel_url
|
|
125
125
|
|
|
126
126
|
|
|
127
|
+
def _prepare_prompt_messages(
|
|
128
|
+
example: dict,
|
|
129
|
+
messages: list[dict],
|
|
130
|
+
*,
|
|
131
|
+
multi_turn: bool,
|
|
132
|
+
package_root: str | None,
|
|
133
|
+
) -> tuple[list[dict], tuple[str, ...]]:
|
|
134
|
+
from flash.content.multimodal import normalize_prompt_images, record_has_images
|
|
135
|
+
|
|
136
|
+
if record_has_images(example, messages):
|
|
137
|
+
normalized = normalize_prompt_images(example, messages, package_root)
|
|
138
|
+
if multi_turn:
|
|
139
|
+
_opd_train.validate_transcript_messages(
|
|
140
|
+
normalized.messages,
|
|
141
|
+
source="environment initial prompt",
|
|
142
|
+
allow_content_blocks=True,
|
|
143
|
+
)
|
|
144
|
+
return normalized.messages, tuple(normalized.descriptors)
|
|
145
|
+
if multi_turn:
|
|
146
|
+
messages = _opd_train.validate_transcript_messages(
|
|
147
|
+
messages, source="environment initial prompt"
|
|
148
|
+
)
|
|
149
|
+
return messages, ()
|
|
150
|
+
|
|
151
|
+
|
|
127
152
|
def _prepare_prompts(
|
|
128
153
|
request: _OpdRequest,
|
|
129
154
|
prompt_rows: list[tuple[Any, Any]],
|
|
@@ -131,11 +156,7 @@ def _prepare_prompts(
|
|
|
131
156
|
capability: str,
|
|
132
157
|
control_panel_url: str,
|
|
133
158
|
) -> _PromptState:
|
|
134
|
-
from flash.content.multimodal import
|
|
135
|
-
image_teacher_prompt_messages,
|
|
136
|
-
normalize_prompt_images,
|
|
137
|
-
record_has_images,
|
|
138
|
-
)
|
|
159
|
+
from flash.content.multimodal import image_teacher_prompt_messages
|
|
139
160
|
from flash.engine.worker.teacher.client import TeacherClient
|
|
140
161
|
|
|
141
162
|
teacher = TeacherClient(capability, control_panel_url, request.knobs.teacher_model)
|
|
@@ -187,15 +208,14 @@ def _prepare_prompts(
|
|
|
187
208
|
with _opd_train.liveness_heartbeat("opd_image_prep", progress=lambda: prepped[0]):
|
|
188
209
|
for example, messages in prompt_rows:
|
|
189
210
|
prepped[0] += 1
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
211
|
+
student_messages, image_descriptors = _prepare_prompt_messages(
|
|
212
|
+
example,
|
|
213
|
+
messages,
|
|
214
|
+
multi_turn=request.multi_turn,
|
|
215
|
+
package_root=package_root,
|
|
216
|
+
)
|
|
217
|
+
if image_descriptors:
|
|
195
218
|
assert processor is not None
|
|
196
|
-
normalized = normalize_prompt_images(example, messages, package_root)
|
|
197
|
-
student_messages = normalized.messages
|
|
198
|
-
image_descriptors = tuple(normalized.descriptors)
|
|
199
219
|
teacher_messages = image_teacher_prompt_messages(
|
|
200
220
|
student_messages, len(image_descriptors)
|
|
201
221
|
)
|
|
@@ -207,9 +227,7 @@ def _prepare_prompts(
|
|
|
207
227
|
enable_thinking=bool(_opd_train._w.THINKING),
|
|
208
228
|
)
|
|
209
229
|
else:
|
|
210
|
-
|
|
211
|
-
teacher_messages = messages
|
|
212
|
-
image_descriptors = ()
|
|
230
|
+
teacher_messages = student_messages
|
|
213
231
|
if processor is not None:
|
|
214
232
|
# mixed job: the verl child tokenizes EVERY row through the multimodal dataset
|
|
215
233
|
# path (the processor), so text-only rows must freeze via the same path or the
|
|
@@ -224,7 +242,7 @@ def _prepare_prompts(
|
|
|
224
242
|
else:
|
|
225
243
|
prompt_ids = _opd_train._normalize_prompt_ids(
|
|
226
244
|
tokenizer.apply_chat_template(
|
|
227
|
-
|
|
245
|
+
student_messages,
|
|
228
246
|
tokenize=True,
|
|
229
247
|
add_generation_prompt=True,
|
|
230
248
|
enable_thinking=_opd_train._w.THINKING,
|
{freesolo_flash_dev-1.2.63 → freesolo_flash_dev-1.2.64}/flash/engine/worker/train/core/child/glue.py
RENAMED
|
@@ -81,6 +81,73 @@ def content_block_text(content, *, source: str, position: int) -> str:
|
|
|
81
81
|
return "".join(parts)
|
|
82
82
|
|
|
83
83
|
|
|
84
|
+
def validate_structured_messages(messages: list[dict], *, source: str) -> list[dict]:
|
|
85
|
+
"""validate and canonicalize role/content messages without dropping media placement."""
|
|
86
|
+
if not isinstance(messages, list):
|
|
87
|
+
raise ValueError(f"{source} messages must be a list")
|
|
88
|
+
normalized: list[dict[str, Any]] = []
|
|
89
|
+
for position, message in enumerate(messages):
|
|
90
|
+
if not isinstance(message, dict):
|
|
91
|
+
raise ValueError(f"{source} message {position} must be an object")
|
|
92
|
+
extras = sorted(
|
|
93
|
+
key
|
|
94
|
+
for key, value in message.items()
|
|
95
|
+
if key not in _ALLOWED_MESSAGE_KEYS and value is not None
|
|
96
|
+
)
|
|
97
|
+
if extras:
|
|
98
|
+
raise ValueError(
|
|
99
|
+
f"{source} message {position} carries unsupported transcript metadata {extras}; "
|
|
100
|
+
"tool names, call ids, tool calls, and other message fields cannot be represented "
|
|
101
|
+
"in a role/content multi-turn transcript"
|
|
102
|
+
)
|
|
103
|
+
role = message.get("role")
|
|
104
|
+
content = message.get("content")
|
|
105
|
+
if not isinstance(role, str) or not role.strip():
|
|
106
|
+
raise ValueError(f"{source} message {position} has an invalid role")
|
|
107
|
+
if isinstance(content, str):
|
|
108
|
+
normalized.append({"role": role, "content": content})
|
|
109
|
+
continue
|
|
110
|
+
if not isinstance(content, list):
|
|
111
|
+
raise ValueError(
|
|
112
|
+
f"{source} message {position} content must be text or content blocks for multi-turn"
|
|
113
|
+
)
|
|
114
|
+
blocks: list[dict[str, Any]] = []
|
|
115
|
+
for block_index, block in enumerate(content):
|
|
116
|
+
if not isinstance(block, dict):
|
|
117
|
+
raise ValueError(
|
|
118
|
+
f"{source} message {position} has a content block that is not an object"
|
|
119
|
+
)
|
|
120
|
+
block_type = block.get("type")
|
|
121
|
+
allowed_keys = (
|
|
122
|
+
{"type", block_type} if block_type in _MEDIA_BLOCK_TYPES else {"type", "text"}
|
|
123
|
+
)
|
|
124
|
+
extras = sorted(
|
|
125
|
+
key for key, value in block.items() if key not in allowed_keys and value is not None
|
|
126
|
+
)
|
|
127
|
+
if extras:
|
|
128
|
+
raise ValueError(
|
|
129
|
+
f"{source} message {position} content block {block_index} carries unsupported "
|
|
130
|
+
f"fields {extras}"
|
|
131
|
+
)
|
|
132
|
+
if block_type in _MEDIA_BLOCK_TYPES:
|
|
133
|
+
blocks.append({"type": block_type})
|
|
134
|
+
elif block_type == "text" and isinstance(block.get("text"), str):
|
|
135
|
+
text = block["text"]
|
|
136
|
+
if not text:
|
|
137
|
+
continue
|
|
138
|
+
if blocks and blocks[-1].get("type") == "text":
|
|
139
|
+
blocks[-1]["text"] += text
|
|
140
|
+
else:
|
|
141
|
+
blocks.append({"type": "text", "text": text})
|
|
142
|
+
else:
|
|
143
|
+
raise ValueError(
|
|
144
|
+
f"{source} message {position} has an unsupported content block at index "
|
|
145
|
+
f"{block_index}"
|
|
146
|
+
)
|
|
147
|
+
normalized.append({"role": role, "content": blocks})
|
|
148
|
+
return normalized
|
|
149
|
+
|
|
150
|
+
|
|
84
151
|
def validate_transcript_messages(
|
|
85
152
|
messages: list[dict], *, source: str, allow_content_blocks: bool = False
|
|
86
153
|
) -> list[dict]:
|
|
@@ -314,3 +381,94 @@ async def run_executor_call(loop, callback):
|
|
|
314
381
|
with contextlib.suppress(Exception):
|
|
315
382
|
await asyncio.shield(task)
|
|
316
383
|
raise
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def multi_modal_image_count(multi_modal_data) -> int:
|
|
387
|
+
"""how many images a verl multimodal payload carries.
|
|
388
|
+
|
|
389
|
+
single-turn and multi-turn both report this count to the bridge, which compares it against the
|
|
390
|
+
frozen parent prompt. two counters would let the two paths disagree about the same payload, so
|
|
391
|
+
this is the one definition: verl carries "image" (singular) for a single-image row and "images"
|
|
392
|
+
for a list, and a bare non-sequence value under either key is one image.
|
|
393
|
+
"""
|
|
394
|
+
if not multi_modal_data:
|
|
395
|
+
return 0
|
|
396
|
+
if not isinstance(multi_modal_data, dict):
|
|
397
|
+
raise TypeError("verl multimodal data must be a mapping")
|
|
398
|
+
images = multi_modal_data.get("images")
|
|
399
|
+
if images is None:
|
|
400
|
+
images = multi_modal_data.get("image")
|
|
401
|
+
if images is None:
|
|
402
|
+
return 0
|
|
403
|
+
if not isinstance(images, (list, tuple)):
|
|
404
|
+
return 1
|
|
405
|
+
try:
|
|
406
|
+
return len(images)
|
|
407
|
+
except TypeError as error:
|
|
408
|
+
raise TypeError("verl multimodal images must be a sized collection") from error
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
class EpisodePrompt:
|
|
412
|
+
"""the tokenized initial prompt plus the decoded media every generate call must carry.
|
|
413
|
+
|
|
414
|
+
an image-bearing prompt tokenizes to placeholder tokens that carry no pixels. both
|
|
415
|
+
apply_chat_template and every generate call need the decoded media alongside the ids, or the
|
|
416
|
+
engine sees placeholders it cannot expand and the rollout either dies on a feature/placeholder
|
|
417
|
+
mismatch or conditions on nothing. text-only prompts yield {}.
|
|
418
|
+
|
|
419
|
+
the media is frozen at episode start and resent unchanged on every turn. later environment
|
|
420
|
+
replies never add to it: a mid-episode image would change the placeholder/pixel correspondence
|
|
421
|
+
the prompt ids were built against, which is why both loops reject one upstream.
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
__slots__ = (
|
|
425
|
+
"audios",
|
|
426
|
+
"images",
|
|
427
|
+
"mm_processor_kwargs",
|
|
428
|
+
"multi_modal_data",
|
|
429
|
+
"prompt_ids",
|
|
430
|
+
"structured_messages",
|
|
431
|
+
"videos",
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
def __init__(self, multi_modal_data, mm_processor_kwargs, prompt_ids, structured_messages):
|
|
435
|
+
self.multi_modal_data = multi_modal_data
|
|
436
|
+
self.mm_processor_kwargs = mm_processor_kwargs
|
|
437
|
+
self.prompt_ids = prompt_ids
|
|
438
|
+
self.structured_messages = structured_messages
|
|
439
|
+
self.images = multi_modal_data.get("images")
|
|
440
|
+
self.videos = multi_modal_data.get("videos")
|
|
441
|
+
self.audios = multi_modal_data.get("audios")
|
|
442
|
+
|
|
443
|
+
def image_count(self) -> int:
|
|
444
|
+
"""how many images the engine actually decoded for this prompt.
|
|
445
|
+
|
|
446
|
+
the bridge authenticates this against the frozen parent prompt, so it counts what the child
|
|
447
|
+
will condition on rather than what the transcript appears to mention. it must agree with the
|
|
448
|
+
count the single-turn path reports, hence the shared counter rather than a second one.
|
|
449
|
+
"""
|
|
450
|
+
return multi_modal_image_count(self.multi_modal_data)
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
async def prepare_episode_prompt(loop_self, raw_prompt) -> EpisodePrompt:
|
|
454
|
+
"""extract media and ids before building the canonical structured prompt view.
|
|
455
|
+
|
|
456
|
+
order matters: an image prompt arrives as content blocks, so the media and block-rendered ids
|
|
457
|
+
must be captured before structured validation. the canonical view preserves media placement for
|
|
458
|
+
bridge authentication and rejects unsupported blocks and message metadata before rollout.
|
|
459
|
+
"""
|
|
460
|
+
messages = [dict(message) for message in raw_prompt]
|
|
461
|
+
multi_modal_data = await loop_self.process_multi_modal_info(messages)
|
|
462
|
+
images = multi_modal_data.get("images")
|
|
463
|
+
videos = multi_modal_data.get("videos")
|
|
464
|
+
audios = multi_modal_data.get("audios")
|
|
465
|
+
mm_processor_kwargs = loop_self._get_mm_processor_kwargs(audios)
|
|
466
|
+
prompt_ids = await loop_self.apply_chat_template(
|
|
467
|
+
messages,
|
|
468
|
+
images=images,
|
|
469
|
+
videos=videos,
|
|
470
|
+
audios=audios,
|
|
471
|
+
mm_processor_kwargs=mm_processor_kwargs,
|
|
472
|
+
)
|
|
473
|
+
structured = validate_structured_messages(messages, source="initial prompt")
|
|
474
|
+
return EpisodePrompt(multi_modal_data, mm_processor_kwargs, prompt_ids, structured)
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import atexit
|
|
6
|
+
import contextlib
|
|
5
7
|
import json
|
|
6
8
|
import os
|
|
7
9
|
import sys
|
|
@@ -200,9 +202,22 @@ def install_wandb_link_reporting() -> None:
|
|
|
200
202
|
if getattr(wandb.init, "_flash_wandb_reporting", False):
|
|
201
203
|
return
|
|
202
204
|
original_init = wandb.init
|
|
205
|
+
finished_run_ids: set[int] = set()
|
|
206
|
+
|
|
207
|
+
def finish_run(run) -> None:
|
|
208
|
+
run_id = id(run)
|
|
209
|
+
if run_id in finished_run_ids:
|
|
210
|
+
return
|
|
211
|
+
try:
|
|
212
|
+
run.finish(exit_code=0)
|
|
213
|
+
except Exception:
|
|
214
|
+
return
|
|
215
|
+
finished_run_ids.add(run_id)
|
|
203
216
|
|
|
204
217
|
def init_reporting(*args, **kwargs):
|
|
205
218
|
run = original_init(*args, **kwargs)
|
|
219
|
+
with contextlib.suppress(Exception):
|
|
220
|
+
atexit.register(finish_run, run)
|
|
206
221
|
try:
|
|
207
222
|
url = getattr(run, "url", None)
|
|
208
223
|
run_id = getattr(run, "id", None)
|