freesolo-flash-dev 1.4.18__tar.gz → 1.4.20__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.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-modal-dev.yml +6 -6
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-modal.yml +30 -8
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/PKG-INFO +1 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/scaffold/TRAINING.md +60 -2
- freesolo_flash_dev-1.4.20/flash/content/processor.py +37 -0
- freesolo_flash_dev-1.4.20/flash/content/training_template.py +16 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/catalog.py +3 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_tools.py +3 -13
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/glue.py +91 -46
- freesolo_flash_dev-1.4.20/flash/engine/worker/train/core/child/tool_messages.py +63 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/rl_train_runner.py +1 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/multiturn.py +7 -3
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/inputs.py +78 -6
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/multi_turn.py +15 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/adapter.py +57 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/base.py +7 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/api.py +2 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/execution.py +5 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/tool_calls.py +11 -7
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/prompt.py +2 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_errors.py +7 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/modal_app.py +43 -33
- freesolo_flash_dev-1.4.20/flash/serving/app/rollback.py +208 -0
- freesolo_flash_dev-1.4.20/flash/serving/app/rollout.py +62 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/canary.py +31 -6
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/gate.py +6 -4
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_outbox.py +21 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/boot.py +4 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/lora_engine.py +23 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/model_config.py +2 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/authorization_transport.py +39 -8
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/inference_routes.py +2 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/pyproject.toml +2 -2
- freesolo_flash_dev-1.4.20/scripts/qualify_serving_rollout.py +264 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_authorization_transport.py +71 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_chat_authorizer.py +26 -0
- freesolo_flash_dev-1.4.20/tests/serving/test_engine_shutdown.py +66 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_modal_deploy_identity.py +15 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_multimodal.py +44 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_per_model_gpu.py +39 -16
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_canary.py +13 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_gate.py +2 -0
- freesolo_flash_dev-1.4.20/tests/serving/test_promotion_release_handoff.py +97 -0
- freesolo_flash_dev-1.4.20/tests/serving/test_rollback_compatibility.py +239 -0
- freesolo_flash_dev-1.4.20/tests/serving/test_rollout_readiness.py +136 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_outbox.py +53 -2
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_reporter.py +16 -6
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_provider.py +20 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_processor_chat_template.py +29 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_qwen9b_base.py +3 -1
- freesolo_flash_dev-1.4.20/tests/test_rl_native_tool_calls.py +610 -0
- freesolo_flash_dev-1.4.20/tests/test_rl_tool_validation.py +68 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_profiles.py +1 -1
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_unavailable_errors.py +13 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_workflow_contracts.py +71 -3
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/uv.lock +1 -1
- freesolo_flash_dev-1.4.18/flash/content/processor.py +0 -17
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.dockerignore +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.env.example +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/CODEOWNERS +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/dependabot.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/scripts/ci_sharding.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/scripts/notify_tests_repo.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/auto-rebake.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/bake-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/ci.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-deepinfer.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/dev-kernel-cache.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/main-source-guard.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/notify-tests-repo.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/production-kernel-cache-ready.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-dev.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-image.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish-serving-image.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/publish.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/version-parity.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/worker-image.yml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.gitignore +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile.serve +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/Dockerfile.worker +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/LICENSE +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/NOTICE +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/build/kernel_cache/.gitignore +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/build/kernel_cache/.keep +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/deploy/infisical/entrypoint.sh +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/Dockerfile.kernelcache +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/Dockerfile.kernelcache.relayer +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/bake_sandbox_entry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/extract_cudart_fix.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/docker/patch_vllm_moe_lora.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/background.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/channel.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/fileio.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/http_deadline.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/logging.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/openai_sse.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/paths.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/_internal/version.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/fused_experts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/lora_rank.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/adapters/targets.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/manifest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/artifacts/storage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/__main__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/imports.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/list.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/push.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/retained.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/setup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/ops/setup_wandb.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/episode.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/eval.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/eval_args.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/params.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/test.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/env/testing/warnings.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/account.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/catalog.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/deploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/log_follow.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/runs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/traces.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/train.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/ops/worker_output.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/deploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/status.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/commands/serving/undeploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/account.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/custom.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/env.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/main.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/models.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/serve_parser.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/traces.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/parsing/training.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/scaffold/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/cost.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/env_panels.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/render.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/tables.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cli/ui/tty.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/freesolo_api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/runtime_secrets.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/shapes.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/specs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/client/streaming.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/image_descriptors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/reasoning_normalization.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/stop_tokens.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/structured_options.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/content/thinking.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/grpo.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/spec.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/core/spec_persistence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/analytical.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/currency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/facts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/spec.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/cost/types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/async_client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/backend.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/billing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/controller.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/managed.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/server.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/session.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/starter.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/validation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/custom/worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/kv_sizing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/model_config_probe.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/recipe.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/steps.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/plan/vram.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/dataset_profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/image_tokens.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/reasoning_render.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_image_rows.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_rows.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/sft_workload.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/profiling/workload_profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/accounting.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/result/rollout_samples.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/checkpoint_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/huggingface.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/model_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/verl_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/support/worker_entrypoint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/__main__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/rl.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/entry/worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/cpu_handoff.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/prefetch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/transfer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/io/wandb_log.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/adapter.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/chatml_mask.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/decoding.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/lora.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/model/packing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/memory.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/perf/model_size.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/phases.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/rng.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/runtime/state.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/agents.yaml +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/batch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/compact_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/configuration.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/engine.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/flashinfer_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/launch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/model.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/observations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/options.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/prompt_media.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/queue.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/readiness.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/reference.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/registration.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/replay.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/replay_guard.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/rollout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/startup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/tracking.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/trainer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/upstream.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/vllm_worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/finalize.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/ledger.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/persistence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/step_timing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/lifecycle/timing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/episode.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/generation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/rollout/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/backend_common.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/prompt_rows.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/rl_train.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/score_batcher.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/sft_train.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/entry/sft_train_runner.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/credit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/entry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/metrics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/reward.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/rollout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/trainer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/child/transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/launch/verl_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/scoring.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/rl/rollout/single_turn.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/dataset.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/entry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/loop.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/schedule.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/child/trainer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/sft/setup/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/adapter_merger.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/capabilities.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/child_io.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/diagnostics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/parallelism.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/verl/parent_work.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/base.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/loader.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/pull.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/loading/staged.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/cache_security.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/cache_storage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/dataset_selection.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/meta/namespace_listing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/direct_tokens.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/limits.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/package/unpack.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/azure.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/registry/packages.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/context.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/envs/scoring/response.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/attempt.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/bootstrap.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/console.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/pip.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/processes.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/bootstrapping/secrets.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/instance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/poll.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/poll_instance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/instances/terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/auth.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/deadline.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/_lifecycle/net/worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/channel.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/artifacts/weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/allocator.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/fit_errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/core/sharding.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/auth.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/checkpoint_upload.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/handles.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/jobs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/prefetch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/pricing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/provider.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/providers/modal/startup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/py.typed +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/costs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/accounting/weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/attempts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/claim_lock.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/deadlines.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/preparation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/reporting.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/runtime_credentials.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/state.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/status.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/lifecycle/submit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/results/deployments.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/attach.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/deploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/recovery.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/retry_decision.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runner/supervise/transitions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/build.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/manifest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/runtime_capsule/profiles.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/custom.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/schema/fields.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/__main__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/bootstrap.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/chat_stream.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/hydration_credentials.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/launch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/manifest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/materialize.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/openai.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/app/progress.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/responses.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/contract/urls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_canonical.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_serialization.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/_urls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/credentials.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/planning.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/control/types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/adapter_check.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/deploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/download.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/export.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/profiles.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/readiness.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/deployment/resolve.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/common/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/common/records.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/deployment.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/operations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/execution/sdk.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/plan.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/resources.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/planning/wrapper.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/probe.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/readiness.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/provisioning/modal/readiness_checks/teardown.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/openai.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/runtime_support.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/schema_types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/streaming.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/text_scan.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/thinking.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/tool_template.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/request/validation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/adapters.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_admission.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_retention.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/cache_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/engine.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/hub.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/prompt_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/reasoning_tools.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/sampling.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/token_batch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/token_prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serve/runtime/types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/__main__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/app.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/asgi/cli.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/charges.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/billing/retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/ops/serving_resources.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/blob_envs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/env_files.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/environment_registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/envs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/projects.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/domain/registry/runs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/auth.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/db.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deployment_jobs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deployment_state.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/deps.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/internal_client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/locks.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/plane_lease.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/runtime.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/platform/submission_admission.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/custom.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/env_files.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/envs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/meta.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/runs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_chat.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_completion.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_revisions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/serving_smoke.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/server/routes/submissions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/app/timeouts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/autoscaling.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/events.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/modal_app.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/render.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/retries.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/app/rollout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/protocol.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/contract/tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/engram_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/image.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/patches.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/native/transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/bridge.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/prefill_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/routing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/snapshots.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/tiered_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/warmup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/deepinfer/runtime/worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/accounting_smoke_test.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/promotion/evidence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_facts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/accounting/usage_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/generation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/hub.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/lora_entries.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/prequant_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/reasoning_usage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/support.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/text_tokenizer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/engine/warmup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/adapter_routes.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/body_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/context.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/headers.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/key_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/router.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/routing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/http/stream_response.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/cache_namespace.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/multimodal.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/openai_request.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/openai_stream.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/requests.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/responses.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/schemas.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/streaming.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/io/structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/access.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/lookup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/persisted_columns.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/persistence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/registration.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/settings.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/supabase_rest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/store/undeploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/_tasks.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/engine.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/serving/src/stream_channel/protocol.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/snapshot/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/snapshot/archive.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/benchmark_qwen_serving.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/benchmark_router_resources.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/build_dev_dist.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_dev_release.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_file_size.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_function_size.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_rollout_identity_actor.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_source_layout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/check_verl_pin_exists.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/custom_algorithm.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/dataset/train.jsonl +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/environment.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/fixtures/modal_environment/evaluations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/qualify_serving_profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/quantize_qwen35_base.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_custom_training.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_modal_sft.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/scripts/smoke_modal_training.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/serve_launch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/billing_precheck.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/chat_provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/chat_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/deployments.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/managed_chat.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/modal.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/runner.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/server_api_plugin.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/source_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/specs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/_helpers/wire_headers.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/capture_image_sft_processor_oracle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/capture_qwen38_27b_metadata.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/conftest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/image_sft_processor_oracle.json +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen35_9b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen38_27b_target_metadata.json +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/qwen3_5_9b_chat_template.jinja +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/lora_context.py.gz +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/modular_kernel.py.gz +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/fixtures/vllm_023_moe_lora/triton_moe.py.gz +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/conftest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/live/test_sft_thinking_render_live.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/checkpoint_fixtures.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/conftest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_adapter_hub.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_artifact_protections.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_authorization_rollout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_base_model_serving.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_chat_auth.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_fingerprint_validation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_identity_repairs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_model_validation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_checkpoint_revocation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_autoscaling.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_deadline.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_hosted.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_http_deadline.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_latency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_optimizations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_parallel.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_prefill_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_retention.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_retries.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_rollout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_routing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_deepinfer_tiering.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_engine_error_status.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_fp8_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_engine.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_revisions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_immutable_schemas.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_inference_duration.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_internal_header_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_key_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_key_rate_limit_review.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_kv_namespace.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_latency_admission.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_modal_image_paths.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_model_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_openai_stream_options.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_persistence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_pre_first_disconnect.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_prequant_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_accounting_smoke.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_promotion_evidence.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_qwen_warmup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_rate_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_reasoning_usage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registration_endpoint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_registry_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_request_body_limit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_router_edge_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_schemas_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_reasoning_split.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_serve_thinking.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_settings.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_channel.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_response_disconnect.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_stream_wait_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_structured_outputs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_supabase_rest_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_token_prefix_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_delivery_concurrency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving/test_usage_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/__init__.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/conftest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/serving_conformance/test_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_accounting_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_adapter_shard_completeness.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_agent_flash_cli_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_algorithms.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_allocator.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_authenticated_redirects.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_azure_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_azure_environment_registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_backend_common.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_backend_jobspec_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_background_supervisor.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bake_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bake_sandbox_entry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_base_environment_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_base_model_provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_billing_response_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_billing_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_process_groups.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_reentry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_bootstrap_worker_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_build_context_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_admission.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_retention.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cache_scheduler.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_capture_qwen38_metadata.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_catalog_consistency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_catalog_only_models.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_charge_pricing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_foundations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_stop_tokens.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_chat_worker_isolation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_cancellation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_deployment_inventory_api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_deployments.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_listing_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_storage_overlap.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoint_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_ci_sharding.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_commands.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_commands_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_credential_shadowing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_errors.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_estimate.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_gpus_flag.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_help.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_main_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_managed.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_render_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_render_theme.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_deploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_status.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_serve_undeploy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_traces.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cli_wandb_warning.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_deadline_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_import_purity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_server_integration.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_client_stream_reads.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_compact_checkpoint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_config_env_vars.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_config_overrides.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_console_upload.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_controlled_experiment_repairs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_analytical.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_currency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_equation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_estimate.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_hardware.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cost_models.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cpu_checkpoint_handoff.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_cpu_checkpoint_upload_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_checkpoints.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_controller_connect.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_cuda_headroom.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_gpu_selection.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_gradients.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_managed.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_session.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_custom_worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_customer_serving_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dataset_profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deploy_latency.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_cleanup_resilience.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_generation_completion.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_deployment_registration_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dev_channel.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_dev_publish_decision.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_disk_gb.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_cache_evict.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_delete.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_download.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_download_api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_evaluations.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_glue_tool_replies.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_cli.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_list_registry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_no_install.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_publish.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_loader_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_pull_managed_control_plane.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_push.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_rate_limit_resolve.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_ref_pinning.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_env_test.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_environment_cache_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_environment_publish_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_export.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flash_mvp.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flash_worker.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flashinfer_aot_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_flashinfer_cache_dirs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_freesolo_api_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_fused_expert_warmstart.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_generation_eos.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_github_urlopen_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_gpu_type_single_field.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_gpus.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_checkpoint_durability.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_metric_stream.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_params.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_resident_sizing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_reward_batching.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_reward_context.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_grpo_rollout_identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_health_liveness.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_heartbeat_startup_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_hf_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_hosted_adapter_admission.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_idempotent_submissions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_environment_capability.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_incremental_processor.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_sft_markers.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_sft_processor_parity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_image_tokens.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_infisical_secrets.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_instance_bootstrap_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_internal_client.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_bake_build_contracts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_cache_promotion.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kernel_fingerprint.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_kv_util.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_local_credential_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_logging.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_login_perms.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_nested_rung.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_rank_preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_targeting.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_lora_targeting_pinned_verl.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_managed_config_fields.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_managed_hf_repo.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_metrics_schema_agent_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_mig_guard.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_mirror_sampling_parity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_api_loop.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_prefetch_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_startup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_training_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_modal_weight_warm.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multi_gpu_gate.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multimodal_boundary_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_multimodal_training.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_named_reward_metrics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_notify_tests_repo.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_offline_http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_oom_escalate_gpu.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_orchestrator_flash.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_packing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_packing_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_persisted_spec_envelope.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_plane_lease.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_poll_helpers.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_projects.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_prompt_budget.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_removed_algorithms.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_removed_training_settings.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_replay_guard.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_repo_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_resolve_params_b.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_resume_on_retry.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_retry_decision.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_reward_server_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rl_train.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rollout_engine_prompt.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_rollout_samples.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_run_log_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_run_registry_lifecycle.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runmgmt.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_capsule.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_credentials.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_runtime_secret_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_schema_boundary_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_bootstrap_http.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_launch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_manifest.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_materialize.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_packaging.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_app_progress.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_cache_resource_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_chat_transport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_control.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_contract_lock.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_sdk.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_sdk_deadlines.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_modal_teardown_identity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_profile_qualification.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_provisioning_common.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_provisioning_modal.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_reasoning_content.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_resolve_provenance.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_adapters.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_engine.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_hub.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_package.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serve_runtime_types.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_api.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_app_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_auth_singleflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_billing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_checkpoints_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_db.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_envs_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_locks_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_managed_chat_requests.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_serving_resources.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_server_standalone.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_conformance_gate.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_context_preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_input_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_serving_schema_coverage.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_batch_prefetch.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_cancel_profile_pricing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_chunked_nll.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_cost_reduction.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_dataset_lazy_images.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_dataset_nulls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_example_selection.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_gc_off.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_max_context.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_memory_policy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_step_floor.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_tools.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_train.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_warmup_schedule.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_sft_workload.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_smoke_content_integrity.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_attestation_flow.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_layout.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_source_snapshot.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_spec_and_validation.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_spec_contract_bytes.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_staged_environment.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_status_reporting.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_status_updates.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_floor.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_metrics.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_step_timing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_option_safety.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_outputs.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_structured_runtime_options.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_submission_outcome.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_terminal_artifacts.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_thinking_config.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_thinking_tool_calls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_tool_call_exact_parsing.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_tool_scalar_unions.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_train_context_preflight.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_training_controls.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_training_phases.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_transfer_queue_init.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_type_comment_prose.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_runtime_policy.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_upstream_verl_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verifiers.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_checkpoint_export.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_child_plugins.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_verl_silence_watchdog.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_version.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_versioned_rollout_contract.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vl_warmstart_adapter_keys.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vllm_moe_lora_backport.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_vram_architecture.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_wandb_link.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_wandb_naming.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_adapter_download.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_cross_repo.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_error_attribution.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_warmstart_image_adapters.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_watchdog_startup_cleanup.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_weight_cache.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_dryrun.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_hardexit.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_image.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_init_heartbeat.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_stack.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_worker_thinking.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_workload_profile.py +0 -0
- {freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/tests/test_zero2_sharding_gate.py +0 -0
{freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/.github/workflows/deploy-modal-dev.yml
RENAMED
|
@@ -11,9 +11,8 @@ jobs:
|
|
|
11
11
|
name: Deploy development serving Modal app
|
|
12
12
|
if: github.ref == 'refs/heads/dev'
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
|
-
#
|
|
15
|
-
|
|
16
|
-
timeout-minutes: 30
|
|
14
|
+
# Allow active GPU pools to warm before router readiness, plus image builds.
|
|
15
|
+
timeout-minutes: 90
|
|
17
16
|
# github can replace a pending run even though a running deploy is preserved. compare against the
|
|
18
17
|
# sha reported by the deployed app so the replacement repeats every change not actually deployed.
|
|
19
18
|
concurrency:
|
|
@@ -233,7 +232,7 @@ jobs:
|
|
|
233
232
|
|
|
234
233
|
- name: Deploy development serving
|
|
235
234
|
if: steps.gate.outputs.deploy == 'true'
|
|
236
|
-
run: modal deploy --env dev flash/serving/app/modal_app.py
|
|
235
|
+
run: modal deploy --strategy rolling --env dev flash/serving/app/modal_app.py
|
|
237
236
|
|
|
238
237
|
- name: Verify development serving URL
|
|
239
238
|
if: steps.gate.outputs.deploy == 'true'
|
|
@@ -272,12 +271,13 @@ jobs:
|
|
|
272
271
|
expected_deployment_id="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
273
272
|
response_file="$(mktemp)"
|
|
274
273
|
trap 'rm -f "$response_file"' EXIT
|
|
275
|
-
|
|
274
|
+
# Match router startup: its full engine budget plus 60 seconds of headroom.
|
|
275
|
+
deadline=$((SECONDS + 3660))
|
|
276
276
|
|
|
277
277
|
while true; do
|
|
278
278
|
remaining=$((deadline - SECONDS))
|
|
279
279
|
if (( remaining <= 0 )); then
|
|
280
|
-
echo "::error::Development serving custom domain did not become DNS-, TLS-, and health-ready within
|
|
280
|
+
echo "::error::Development serving custom domain did not become DNS-, TLS-, and health-ready within 3660 seconds."
|
|
281
281
|
exit 1
|
|
282
282
|
fi
|
|
283
283
|
|
|
@@ -44,7 +44,7 @@ jobs:
|
|
|
44
44
|
# accounting settlement, image builds, and a rollback with its own readiness
|
|
45
45
|
# poll. The workflow contract test sums these budgets so rollback is never
|
|
46
46
|
# cut off by the job timeout.
|
|
47
|
-
timeout-minutes:
|
|
47
|
+
timeout-minutes: 300
|
|
48
48
|
# serialize serving deploys across runs because each deploy mutates the live app. github can still
|
|
49
49
|
# replace a pending run, so the gate compares against the sha reported by the deployed app rather
|
|
50
50
|
# than assuming every push predecessor was deployed.
|
|
@@ -325,7 +325,7 @@ jobs:
|
|
|
325
325
|
env:
|
|
326
326
|
FREESOLO_DEPLOYMENT_SHA: ${{ github.sha }}
|
|
327
327
|
FREESOLO_DEPLOYMENT_ID: ${{ github.run_id }}-${{ github.run_attempt }}
|
|
328
|
-
run: modal deploy flash/serving/app/modal_app.py
|
|
328
|
+
run: modal deploy --strategy rolling flash/serving/app/modal_app.py
|
|
329
329
|
|
|
330
330
|
- name: Wait for production serving readiness
|
|
331
331
|
if: steps.gate.outputs.deploy == 'true'
|
|
@@ -335,12 +335,13 @@ jobs:
|
|
|
335
335
|
expected_deployment_id="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
336
336
|
response_file="$(mktemp)"
|
|
337
337
|
trap 'rm -f "$response_file"' EXIT
|
|
338
|
-
|
|
338
|
+
# Match router startup: its full engine budget plus 60 seconds of headroom.
|
|
339
|
+
deadline=$((SECONDS + 3660))
|
|
339
340
|
|
|
340
341
|
while true; do
|
|
341
342
|
remaining=$((deadline - SECONDS))
|
|
342
343
|
if (( remaining <= 0 )); then
|
|
343
|
-
echo "::error::Production serving health check did not become ready within
|
|
344
|
+
echo "::error::Production serving health check did not become ready within 3660 seconds."
|
|
344
345
|
exit 1
|
|
345
346
|
fi
|
|
346
347
|
|
|
@@ -462,6 +463,7 @@ jobs:
|
|
|
462
463
|
ROLLBACK_DEPLOYMENT_ID: ${{ github.run_id }}-${{ github.run_attempt }}-rollback
|
|
463
464
|
HEALTH_URL: https://serve.freesolo.co/healthz
|
|
464
465
|
run: |
|
|
466
|
+
set -euo pipefail
|
|
465
467
|
if [ -z "$PREVIOUS_SHA" ]; then
|
|
466
468
|
echo "::error::Promotion failed and NO previous release was recorded, so the broken release is still live. Restore production manually."
|
|
467
469
|
exit 1
|
|
@@ -473,6 +475,15 @@ jobs:
|
|
|
473
475
|
exit 1
|
|
474
476
|
fi
|
|
475
477
|
|
|
478
|
+
# Capture the forward dispatch contract before checkout removes its code.
|
|
479
|
+
# A bare predecessor deploy deletes new engine handles held by live routers.
|
|
480
|
+
rollback_bundle="$(mktemp -d)"
|
|
481
|
+
trap 'rm -rf "$rollback_bundle"' EXIT
|
|
482
|
+
if ! python -m flash.serving.app.rollback snapshot \
|
|
483
|
+
--source-sha "$CURRENT_SHA" --directory "$rollback_bundle"; then
|
|
484
|
+
echo "::error::Cannot preserve forward engine identities; refusing unsafe rollback."
|
|
485
|
+
exit 1
|
|
486
|
+
fi
|
|
476
487
|
echo "Promotion failed; restoring ${PREVIOUS_SHA}."
|
|
477
488
|
git checkout --quiet --force "$PREVIOUS_SHA"
|
|
478
489
|
|
|
@@ -504,14 +515,25 @@ jobs:
|
|
|
504
515
|
exit 1
|
|
505
516
|
fi
|
|
506
517
|
|
|
507
|
-
#
|
|
518
|
+
# Build a compatibility artifact from the predecessor: retain forward handles,
|
|
519
|
+
# restore the predecessor's engine implementation, and gate router startup on
|
|
520
|
+
# active restored pools. Failure occurs before Modal mutates the deployment.
|
|
521
|
+
if ! python "$rollback_bundle/rollback.py" prepare \
|
|
522
|
+
--manifest "$rollback_bundle/manifest.json" --entrypoint "$rollback_app"; then
|
|
523
|
+
echo "::error::Previous release cannot retain active engine handles; refusing unsafe rollback."
|
|
524
|
+
exit 1
|
|
525
|
+
fi
|
|
526
|
+
|
|
527
|
+
# The source behavior is the predecessor; the distinct attempt identifies
|
|
528
|
+
# this rollback artifact and its forward-handle compatibility overlay.
|
|
508
529
|
FREESOLO_DEPLOYMENT_SHA="$PREVIOUS_SHA" \
|
|
509
530
|
FREESOLO_DEPLOYMENT_ID="$ROLLBACK_DEPLOYMENT_ID" \
|
|
510
|
-
modal deploy "$rollback_app"
|
|
531
|
+
modal deploy --strategy rolling "$rollback_app"
|
|
511
532
|
|
|
512
533
|
response_file="$(mktemp)"
|
|
513
|
-
trap 'rm -f "$response_file"' EXIT
|
|
514
|
-
|
|
534
|
+
trap 'rm -f "$response_file"; rm -rf "$rollback_bundle"' EXIT
|
|
535
|
+
# Match router startup: its full engine budget plus 60 seconds of headroom.
|
|
536
|
+
deadline=$((SECONDS + 3660))
|
|
515
537
|
restored=false
|
|
516
538
|
while (( SECONDS < deadline )); do
|
|
517
539
|
if curl --silent --show-error --output "$response_file" --fail \
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: freesolo-flash-dev
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.20
|
|
4
4
|
Summary: Flash — managed LoRA post-training (SFT/GRPO) 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
|
|
@@ -138,6 +138,62 @@ def load_environment(**kwargs) -> MyEnv:
|
|
|
138
138
|
For tool use, dialogue, or games, subclass `EnvironmentMultiTurn` instead and drive the
|
|
139
139
|
conversation across turns. The reward is the same `RewardResult` contract either way.
|
|
140
140
|
|
|
141
|
+
**Native tool calling (multi-turn GRPO).** Declare the tools the model may call as
|
|
142
|
+
`tool_schemas` on the environment — a list of OpenAI function declarations (the `tools` array of
|
|
143
|
+
a chat request), as a class attribute or a zero-argument method. Do not render them into the system
|
|
144
|
+
prompt yourself and do not parse `<tool_call>` text yourself:
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
class RetailEnv(EnvironmentMultiTurn):
|
|
148
|
+
tool_schemas = [
|
|
149
|
+
{
|
|
150
|
+
"type": "function",
|
|
151
|
+
"function": {
|
|
152
|
+
"name": "get_order_details",
|
|
153
|
+
"description": "Look up one order by id.",
|
|
154
|
+
"parameters": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"properties": {"order_id": {"type": "string"}},
|
|
157
|
+
"required": ["order_id"],
|
|
158
|
+
"additionalProperties": False,
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
def step_episode(self, example, messages, assistant_response):
|
|
165
|
+
turn = messages[-1] # {"role": "assistant", "content": ..., "tool_calls": [...]}
|
|
166
|
+
replies = [
|
|
167
|
+
{
|
|
168
|
+
"role": "tool",
|
|
169
|
+
"tool_call_id": call["id"],
|
|
170
|
+
"name": call["function"]["name"],
|
|
171
|
+
"content": run_tool(
|
|
172
|
+
call["function"]["name"], json.loads(call["function"]["arguments"])
|
|
173
|
+
),
|
|
174
|
+
}
|
|
175
|
+
for call in turn.get("tool_calls", [])
|
|
176
|
+
]
|
|
177
|
+
return EnvironmentStepResult(done=not replies, messages=tuple(replies))
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
- Declarations are validated exactly as a serving chat request's `tools` are (closed object schemas
|
|
181
|
+
with `"additionalProperties": false`, no `strict`); a malformed one fails at load.
|
|
182
|
+
- Flash renders them with the chat template's own `tools=` into the first prompt, every
|
|
183
|
+
generation prefix, and the glue for every environment reply, so the policy trains on exactly the
|
|
184
|
+
prompt serving renders for the same conversation (and that SFT renders for a row's `tools`).
|
|
185
|
+
- After each turn Flash parses the text with the serving tool-call parser. `messages[-1]` is the
|
|
186
|
+
OpenAI assistant message: `content` is the text before the call (`""` when none) and
|
|
187
|
+
`tool_calls[].function.arguments` is a JSON string. `assistant_response` stays the raw text, so
|
|
188
|
+
for a call it no longer equals `messages[-1]["content"]`. Text that is not a well-formed call of a
|
|
189
|
+
declared tool stays plain `content` with no `tool_calls`, as serving would return it.
|
|
190
|
+
- Reply with `{"role": "tool", "tool_call_id": ..., "name": ..., "content": ...}` messages (and/or
|
|
191
|
+
`user` messages); the template renders them in its native tool-response format. Only environment
|
|
192
|
+
replies carry these fields — the initial prompt stays role/content.
|
|
193
|
+
- Supported on text-only multi-turn GRPO. Single-turn and image-bearing runs with `tool_schemas`
|
|
194
|
+
are refused at startup, as are `[train].stop_sequences` that overlap the tool-call grammar. A
|
|
195
|
+
dataset row may also carry `tools` (as SFT rows do), but it must equal `tool_schemas`.
|
|
196
|
+
|
|
141
197
|
If the environment class can return image-bearing user observations from `step_episode`, declare
|
|
142
198
|
`image_observations = True` on that class. This is a class capability, not a TOML setting: Flash uses
|
|
143
199
|
it to reject a text-only model before model work. Set it only for environments that
|
|
@@ -971,8 +1027,10 @@ is never killed for being slow.
|
|
|
971
1027
|
### `credit_assignment = "per_turn"` is inert unless your environment emits `per_turn_rewards`
|
|
972
1028
|
|
|
973
1029
|
**First, check that per-turn credit is available to you at all.** It is supported on the
|
|
974
|
-
pure multi-turn rollout path — an `EnvironmentMultiTurn` that drives its own turn loop
|
|
975
|
-
|
|
1030
|
+
pure multi-turn rollout path — an `EnvironmentMultiTurn` that drives its own turn loop
|
|
1031
|
+
(including one that declares native `tool_schemas` and executes the calls in `step_episode`). An
|
|
1032
|
+
environment whose **callables Flash would execute** (trl-style function calling) is not supported
|
|
1033
|
+
at all: the worker raises
|
|
976
1034
|
`verl grpo does not support openai function-calling tool environments; this env reports
|
|
977
1035
|
is_tool_env` and the run dies at startup. Nothing catches this earlier —
|
|
978
1036
|
`flash train --dry-run` accepts the config, because the check depends on the environment
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Normalize chat-template metadata from a checkpoint's own processor and tokenizer."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def inherit_tokenizer_chat_template(processor: Any) -> None:
|
|
7
|
+
"""Support checkpoints that publish their template only in tokenizer_config.json.
|
|
8
|
+
|
|
9
|
+
Transformers loads that template onto the tokenizer but not AutoProcessor.
|
|
10
|
+
Preserve explicit processor templates and never substitute another model's tokenizer.
|
|
11
|
+
Missing templates remain missing so the normal request validation can reject them.
|
|
12
|
+
"""
|
|
13
|
+
if getattr(processor, "chat_template", None) is None:
|
|
14
|
+
tokenizer = getattr(processor, "tokenizer", None)
|
|
15
|
+
template = getattr(tokenizer, "chat_template", None)
|
|
16
|
+
if template is not None:
|
|
17
|
+
processor.chat_template = template
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def processor_template_kwargs(processor: Any, kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
21
|
+
"""Keep rendering options out of Transformers' legacy processor-kwargs path.
|
|
22
|
+
|
|
23
|
+
Serving renders text only: vLLM processes the decoded images separately. Options
|
|
24
|
+
unused by the selected Jinja template (often preserve_thinking) must not be
|
|
25
|
+
interpreted as image/tokenization options. Keep tools, an explicit HF argument.
|
|
26
|
+
Use HF's cached introspection so the classification matches its warning check.
|
|
27
|
+
"""
|
|
28
|
+
from transformers.utils.chat_template_utils import _get_template_variables
|
|
29
|
+
|
|
30
|
+
template = getattr(processor, "chat_template", None)
|
|
31
|
+
if isinstance(template, dict):
|
|
32
|
+
template = template.get("default")
|
|
33
|
+
if not isinstance(template, str):
|
|
34
|
+
# Let the processor report missing/ambiguous template metadata as usual.
|
|
35
|
+
return kwargs
|
|
36
|
+
variables = _get_template_variables(template)
|
|
37
|
+
return {key: value for key, value in kwargs.items() if key == "tools" or key in variables}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Chat-template options shared by supervised and reinforcement learning."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def training_template_kwargs(thinking: bool, tools: list[dict[str, Any]] | None) -> dict[str, Any]:
|
|
9
|
+
"""Shared chat-template options for SFT rows and RL prompts and reply glue.
|
|
10
|
+
|
|
11
|
+
Tools are normalized wire declarations. Omit the key for tool-free renders.
|
|
12
|
+
"""
|
|
13
|
+
kwargs: dict[str, Any] = {"enable_thinking": thinking, "preserve_thinking": False}
|
|
14
|
+
if tools is not None:
|
|
15
|
+
kwargs["tools"] = tools
|
|
16
|
+
return kwargs
|
|
@@ -543,7 +543,7 @@ MODELS["Qwen/Qwen3.5-9B-Base"] = replace(
|
|
|
543
543
|
display_name="Qwen3.5 9B Base (pretrained)",
|
|
544
544
|
managed_revision="68c46c4b3498877f3ef123c856ecfde50c39f404",
|
|
545
545
|
serving=ServingCapacity(
|
|
546
|
-
gpu="
|
|
546
|
+
gpu="L40S",
|
|
547
547
|
serve_model_id="Qwen/Qwen3.5-9B-Base",
|
|
548
548
|
max_loras=16,
|
|
549
549
|
max_cpu_loras=16,
|
|
@@ -556,7 +556,8 @@ MODELS["Qwen/Qwen3.5-9B-Base"] = replace(
|
|
|
556
556
|
),
|
|
557
557
|
notes="Pretrained-only Qwen3.5 9B; bf16 LoRA SFT/GRPO. Uses its own weights and "
|
|
558
558
|
"tokenizer, not the post-trained 9B. Native chat/thinking formatting is available for "
|
|
559
|
-
"fine-tuning; instruction following and reasoning are not post-trained.
|
|
559
|
+
"fine-tuning; instruction following and reasoning are not post-trained. Hosted FP8 serving "
|
|
560
|
+
"on L40S; customer-owned BF16 serving on H100.",
|
|
560
561
|
)
|
|
561
562
|
|
|
562
563
|
|
|
@@ -12,8 +12,11 @@ from __future__ import annotations
|
|
|
12
12
|
|
|
13
13
|
from typing import Any
|
|
14
14
|
|
|
15
|
+
from flash.content.training_template import training_template_kwargs as sft_template_kwargs
|
|
15
16
|
from flash.serve.request.tool_calls import normalize_tools, tools_wire
|
|
16
17
|
|
|
18
|
+
__all__ = ["reject_image_row_tools", "sft_row_tools", "sft_template_kwargs"]
|
|
19
|
+
|
|
17
20
|
|
|
18
21
|
def sft_row_tools(example) -> list[dict[str, Any]] | None:
|
|
19
22
|
"""The row's tools in the form serving renders them, or None when it declares none."""
|
|
@@ -25,19 +28,6 @@ def sft_row_tools(example) -> list[dict[str, Any]] | None:
|
|
|
25
28
|
raise ValueError(f"sft tools: {exc}") from exc
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
def sft_template_kwargs(thinking: bool, tools: list[dict[str, Any]] | None) -> dict[str, Any]:
|
|
29
|
-
"""Chat-template kwargs for every training view of a row.
|
|
30
|
-
|
|
31
|
-
The transcript, the prompt boundary, the reasoning probe and the loss mask's field probe all
|
|
32
|
-
render with these, so the supervised tokens are located in exactly the text that is trained on.
|
|
33
|
-
Without tools this is the pre-existing thinking-only render.
|
|
34
|
-
"""
|
|
35
|
-
kwargs: dict[str, Any] = {"enable_thinking": thinking, "preserve_thinking": False}
|
|
36
|
-
if tools is not None:
|
|
37
|
-
kwargs["tools"] = tools
|
|
38
|
-
return kwargs
|
|
39
|
-
|
|
40
|
-
|
|
41
31
|
def reject_image_row_tools(example, *, image_bearing: bool) -> None:
|
|
42
32
|
"""Refuse tools on an image row before any tokenizer or processor is resolved.
|
|
43
33
|
|
{freesolo_flash_dev-1.4.18 → freesolo_flash_dev-1.4.20}/flash/engine/worker/train/core/child/glue.py
RENAMED
|
@@ -17,8 +17,17 @@ from flash.content.image_descriptors import MAX_IMAGES_PER_CONVERSATION
|
|
|
17
17
|
from flash.content.reasoning_normalization import (
|
|
18
18
|
messages_for_chat_template as _messages_for_chat_template,
|
|
19
19
|
)
|
|
20
|
+
from flash.content.training_template import training_template_kwargs
|
|
21
|
+
from flash.engine.worker.train.core.child.tool_messages import (
|
|
22
|
+
TOOL_MESSAGE_KEYS,
|
|
23
|
+
template_tool_messages,
|
|
24
|
+
tool_message_fields,
|
|
25
|
+
)
|
|
20
26
|
|
|
21
27
|
_ALLOWED_MESSAGE_KEYS = frozenset({"role", "content", "reasoning_content"})
|
|
28
|
+
# the processor glue path renders without tools, and a tool environment's images would need it to
|
|
29
|
+
# render with them; refuse rather than glue a reply whose declarations silently disappeared.
|
|
30
|
+
_TOOL_IMAGE_REPLY_ERROR = "environment replies with images are not supported for tool environments"
|
|
22
31
|
_PROBE_PREFIX = "flash-env-glue-probe"
|
|
23
32
|
# the media block types verl's own dataset parser substitutes for a placeholder, and the exact set
|
|
24
33
|
# it then extracts (rl_dataset.py `_build_messages`: `<image>`/`<video>`/`<audio>` become blocks of
|
|
@@ -122,7 +131,36 @@ def content_block_text(content, *, source: str, position: int) -> str:
|
|
|
122
131
|
return "".join(parts)
|
|
123
132
|
|
|
124
133
|
|
|
125
|
-
def
|
|
134
|
+
def _message_metadata(message: dict, *, source: str, position: int, tools: bool) -> dict:
|
|
135
|
+
"""the validated non-content fields one transcript message keeps.
|
|
136
|
+
|
|
137
|
+
``tools`` admits the openai tool-call fields, and only for an environment that declares tools:
|
|
138
|
+
without them the template cannot render a call natively, so a tool-free transcript keeps
|
|
139
|
+
rejecting them rather than training on a turn the model never saw.
|
|
140
|
+
"""
|
|
141
|
+
allowed = _ALLOWED_MESSAGE_KEYS | TOOL_MESSAGE_KEYS if tools else _ALLOWED_MESSAGE_KEYS
|
|
142
|
+
extras = sorted(key for key in message if key not in allowed)
|
|
143
|
+
if extras:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
f"{source} message {position} carries unsupported transcript metadata {extras}; "
|
|
146
|
+
"tool names, call ids, tool calls, and other message fields cannot be represented "
|
|
147
|
+
"in a role/content multi-turn transcript"
|
|
148
|
+
)
|
|
149
|
+
role = message.get("role")
|
|
150
|
+
reasoning = message.get("reasoning_content")
|
|
151
|
+
if not isinstance(role, str) or not role.strip():
|
|
152
|
+
raise ValueError(f"{source} message {position} has an invalid role")
|
|
153
|
+
if "reasoning_content" in message and not isinstance(reasoning, str):
|
|
154
|
+
raise ValueError(f"{source} message {position} reasoning_content must be text")
|
|
155
|
+
metadata = {"reasoning_content": reasoning} if reasoning is not None else {}
|
|
156
|
+
if tools:
|
|
157
|
+
metadata.update(tool_message_fields(message, source=source, position=position))
|
|
158
|
+
return metadata
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def validate_structured_messages(
|
|
162
|
+
messages: list[dict], *, source: str, tools: bool = False
|
|
163
|
+
) -> list[dict]:
|
|
126
164
|
"""validate and canonicalize role/content messages without dropping media placement."""
|
|
127
165
|
if not isinstance(messages, list):
|
|
128
166
|
raise ValueError(f"{source} messages must be a list")
|
|
@@ -130,21 +168,12 @@ def validate_structured_messages(messages: list[dict], *, source: str) -> list[d
|
|
|
130
168
|
for position, message in enumerate(messages):
|
|
131
169
|
if not isinstance(message, dict):
|
|
132
170
|
raise ValueError(f"{source} message {position} must be an object")
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
raise ValueError(
|
|
136
|
-
f"{source} message {position} carries unsupported transcript metadata {extras}; "
|
|
137
|
-
"tool names, call ids, tool calls, and other message fields cannot be represented "
|
|
138
|
-
"in a role/content multi-turn transcript"
|
|
139
|
-
)
|
|
140
|
-
role = message.get("role")
|
|
171
|
+
metadata = _message_metadata(message, source=source, position=position, tools=tools)
|
|
172
|
+
role = message["role"]
|
|
141
173
|
content = message.get("content")
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if "reasoning_content" in message and not isinstance(reasoning, str):
|
|
146
|
-
raise ValueError(f"{source} message {position} reasoning_content must be text")
|
|
147
|
-
metadata = {"reasoning_content": reasoning} if reasoning is not None else {}
|
|
174
|
+
if content is None and "tool_calls" in metadata:
|
|
175
|
+
# an openai assistant turn that only calls tools may carry null content.
|
|
176
|
+
content = ""
|
|
148
177
|
if isinstance(content, str):
|
|
149
178
|
normalized.append({"role": role, "content": content, **metadata})
|
|
150
179
|
continue
|
|
@@ -190,7 +219,7 @@ def validate_structured_messages(messages: list[dict], *, source: str) -> list[d
|
|
|
190
219
|
|
|
191
220
|
|
|
192
221
|
def validate_transcript_messages(
|
|
193
|
-
messages: list[dict], *, source: str, allow_content_blocks: bool = False
|
|
222
|
+
messages: list[dict], *, source: str, allow_content_blocks: bool = False, tools: bool = False
|
|
194
223
|
) -> list[dict]:
|
|
195
224
|
"""require the exact role/content transcript shape the child rollout loops can represent.
|
|
196
225
|
|
|
@@ -206,30 +235,19 @@ def validate_transcript_messages(
|
|
|
206
235
|
for position, message in enumerate(messages):
|
|
207
236
|
if not isinstance(message, dict):
|
|
208
237
|
raise ValueError(f"{source} message {position} must be an object")
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
raise ValueError(
|
|
212
|
-
f"{source} message {position} carries unsupported transcript metadata {extras}; "
|
|
213
|
-
"tool names, call ids, tool calls, and other message fields cannot be represented "
|
|
214
|
-
"in a role/content multi-turn transcript"
|
|
215
|
-
)
|
|
216
|
-
role = message.get("role")
|
|
238
|
+
metadata = _message_metadata(message, source=source, position=position, tools=tools)
|
|
239
|
+
role = message["role"]
|
|
217
240
|
content = message.get("content")
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if "reasoning_content" in message and not isinstance(reasoning, str):
|
|
222
|
-
raise ValueError(f"{source} message {position} reasoning_content must be text")
|
|
241
|
+
if content is None and "tool_calls" in metadata:
|
|
242
|
+
# an openai assistant turn that only calls tools may carry null content.
|
|
243
|
+
content = ""
|
|
223
244
|
if allow_content_blocks and isinstance(content, list):
|
|
224
245
|
# a multimodal prompt arrives as content BLOCKS, not a string; flatten to the text this
|
|
225
246
|
# transcript can represent. the media rides separately as decoded pixels.
|
|
226
247
|
content = content_block_text(content, source=source, position=position)
|
|
227
248
|
elif not isinstance(content, str):
|
|
228
249
|
raise ValueError(f"{source} message {position} content must be text for multi-turn")
|
|
229
|
-
|
|
230
|
-
if reasoning is not None:
|
|
231
|
-
normalized_message["reasoning_content"] = reasoning
|
|
232
|
-
normalized.append(normalized_message)
|
|
250
|
+
normalized.append({"role": role, "content": content, **metadata})
|
|
233
251
|
return normalized
|
|
234
252
|
|
|
235
253
|
|
|
@@ -268,25 +286,36 @@ def dedup_seam_terminator(response_ids: list[int], glue_ids: list[int]) -> list[
|
|
|
268
286
|
class EnvGlueTokenizer:
|
|
269
287
|
"""derive exact inter-turn glue without re-rendering accepted transcript history."""
|
|
270
288
|
|
|
271
|
-
def __init__(
|
|
289
|
+
def __init__(
|
|
290
|
+
self,
|
|
291
|
+
tokenizer,
|
|
292
|
+
*,
|
|
293
|
+
thinking: bool,
|
|
294
|
+
tools: list[dict] | None = None,
|
|
295
|
+
cache_size: int = 8192,
|
|
296
|
+
) -> None:
|
|
272
297
|
self.tokenizer = tokenizer
|
|
273
298
|
self.thinking = bool(thinking)
|
|
299
|
+
self.tools = tools
|
|
274
300
|
self.cache_size = int(cache_size)
|
|
275
301
|
self.cache: dict[str, list[int]] = {}
|
|
276
302
|
|
|
277
303
|
def __call__(self, env_messages: list[dict]) -> list[int]:
|
|
278
|
-
messages = validate_transcript_messages(
|
|
304
|
+
messages = validate_transcript_messages(
|
|
305
|
+
env_messages, source="environment reply", tools=self.tools is not None
|
|
306
|
+
)
|
|
279
307
|
key = json.dumps(messages, sort_keys=True, separators=(",", ":"))
|
|
280
308
|
cached = self.cache.get(key)
|
|
281
309
|
if cached is not None:
|
|
282
310
|
return list(cached)
|
|
283
311
|
probe = _unique_glue_probe(messages)
|
|
284
312
|
text = self.tokenizer.apply_chat_template(
|
|
285
|
-
|
|
313
|
+
template_tool_messages(
|
|
314
|
+
_messages_for_chat_template(_glue_conversation(probe, messages))
|
|
315
|
+
),
|
|
286
316
|
add_generation_prompt=True,
|
|
287
317
|
tokenize=False,
|
|
288
|
-
|
|
289
|
-
preserve_thinking=False,
|
|
318
|
+
**training_template_kwargs(self.thinking, self.tools),
|
|
290
319
|
)
|
|
291
320
|
first = text.find(probe)
|
|
292
321
|
if first == -1 or text.find(probe, first + len(probe)) != -1:
|
|
@@ -580,16 +609,22 @@ def parent_environment_glue(
|
|
|
580
609
|
package_root: str | None,
|
|
581
610
|
*,
|
|
582
611
|
thinking: bool,
|
|
612
|
+
tools: list[dict] | None = None,
|
|
583
613
|
) -> tuple[list[int], list[str]]:
|
|
584
614
|
"""derive the authenticated parent copy of one reply's glue and ordered image digests."""
|
|
585
|
-
structured = validate_structured_messages(
|
|
615
|
+
structured = validate_structured_messages(
|
|
616
|
+
messages, source="environment reply", tools=tools is not None
|
|
617
|
+
)
|
|
586
618
|
if not image_descriptors:
|
|
587
619
|
transcript = validate_transcript_messages(
|
|
588
620
|
structured,
|
|
589
621
|
source="environment reply",
|
|
590
622
|
allow_content_blocks=True,
|
|
623
|
+
tools=tools is not None,
|
|
591
624
|
)
|
|
592
|
-
return EnvGlueTokenizer(tokenizer, thinking=thinking)(transcript), []
|
|
625
|
+
return EnvGlueTokenizer(tokenizer, thinking=thinking, tools=tools)(transcript), []
|
|
626
|
+
if tools is not None:
|
|
627
|
+
raise ValueError(_TOOL_IMAGE_REPLY_ERROR)
|
|
593
628
|
if processor is None:
|
|
594
629
|
raise ValueError("environment reply carries images but the parent has no processor")
|
|
595
630
|
from flash.content.multimodal import decode_image_descriptors
|
|
@@ -625,9 +660,10 @@ class EnvironmentReplyGlue:
|
|
|
625
660
|
class EnvGlueProcessor:
|
|
626
661
|
"""derive text or processor-aware environment glue and decode only newly transported images."""
|
|
627
662
|
|
|
628
|
-
def __init__(self, loop_self, *, thinking: bool) -> None:
|
|
663
|
+
def __init__(self, loop_self, *, thinking: bool, tools: list[dict] | None = None) -> None:
|
|
629
664
|
self.loop_self = loop_self
|
|
630
|
-
self.
|
|
665
|
+
self.tools = tools
|
|
666
|
+
self.text = EnvGlueTokenizer(loop_self.tokenizer, thinking=thinking, tools=tools)
|
|
631
667
|
self.apply_chat_template_kwargs = dict(
|
|
632
668
|
getattr(loop_self, "apply_chat_template_kwargs", {}) or {}
|
|
633
669
|
)
|
|
@@ -640,15 +676,19 @@ class EnvGlueProcessor:
|
|
|
640
676
|
image_data_uris: list[str] | None = None,
|
|
641
677
|
) -> EnvironmentReplyGlue:
|
|
642
678
|
image_data_uris = list(image_data_uris or ())
|
|
643
|
-
|
|
679
|
+
tools = self.tools is not None
|
|
680
|
+
structured = validate_structured_messages(messages, source="environment reply", tools=tools)
|
|
644
681
|
_validate_reply_image_count(structured, image_data_uris)
|
|
645
682
|
if not image_data_uris:
|
|
646
683
|
text_messages = validate_transcript_messages(
|
|
647
684
|
structured,
|
|
648
685
|
source="environment reply",
|
|
649
686
|
allow_content_blocks=True,
|
|
687
|
+
tools=tools,
|
|
650
688
|
)
|
|
651
689
|
return EnvironmentReplyGlue(self.text(text_messages), [], [])
|
|
690
|
+
if tools:
|
|
691
|
+
raise ValueError(_TOOL_IMAGE_REPLY_ERROR)
|
|
652
692
|
processor = getattr(self.loop_self, "processor", None)
|
|
653
693
|
if processor is None:
|
|
654
694
|
raise ValueError("environment reply carries images but the rollout has no processor")
|
|
@@ -673,9 +713,9 @@ class EnvGlueProcessor:
|
|
|
673
713
|
raise
|
|
674
714
|
|
|
675
715
|
|
|
676
|
-
def validate_glue_template(tokenizer, *, thinking: bool) -> None:
|
|
716
|
+
def validate_glue_template(tokenizer, *, thinking: bool, tools: list[dict] | None = None) -> None:
|
|
677
717
|
"""fail before rollout when assistant content cannot round-trip through the template."""
|
|
678
|
-
EnvGlueTokenizer(tokenizer, thinking=thinking)(
|
|
718
|
+
EnvGlueTokenizer(tokenizer, thinking=thinking, tools=tools)(
|
|
679
719
|
[{"role": "user", "content": "flash multi-turn glue validation"}]
|
|
680
720
|
)
|
|
681
721
|
|
|
@@ -848,12 +888,16 @@ class EpisodePrompt:
|
|
|
848
888
|
return snapshot
|
|
849
889
|
|
|
850
890
|
|
|
851
|
-
async def prepare_episode_prompt(
|
|
891
|
+
async def prepare_episode_prompt(
|
|
892
|
+
loop_self, raw_prompt, *, tools: list[dict] | None = None
|
|
893
|
+
) -> EpisodePrompt:
|
|
852
894
|
"""extract media and ids before building the canonical structured prompt view.
|
|
853
895
|
|
|
854
896
|
order matters: an image prompt arrives as content blocks, so the media and block-rendered ids
|
|
855
897
|
must be captured before structured validation. the canonical view preserves media placement for
|
|
856
898
|
bridge authentication and rejects unsupported blocks and message metadata before rollout.
|
|
899
|
+
``tools`` reaches verl's native ``tools=`` render, the same declarations the parent froze the
|
|
900
|
+
prompt ids with, so a tool environment's first prompt matches serving's.
|
|
857
901
|
"""
|
|
858
902
|
messages = [dict(message) for message in raw_prompt]
|
|
859
903
|
for message in messages:
|
|
@@ -877,6 +921,7 @@ async def prepare_episode_prompt(loop_self, raw_prompt) -> EpisodePrompt:
|
|
|
877
921
|
mm_processor_kwargs = loop_self._get_mm_processor_kwargs(audios)
|
|
878
922
|
prompt_ids = await loop_self.ct_build_initial_tokens(
|
|
879
923
|
messages,
|
|
924
|
+
tools=tools,
|
|
880
925
|
images=images,
|
|
881
926
|
videos=videos,
|
|
882
927
|
audios=audios,
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""OpenAI tool-call message fields in a multi-turn transcript for an environment that declares tools.
|
|
2
|
+
|
|
3
|
+
An environment without tools keeps the role/content transcript and its rejection of every other
|
|
4
|
+
field. One that declares tools renders them natively, the way serving does, so its transcript may
|
|
5
|
+
also carry the two shapes serving accepts in history: an assistant turn's ``tool_calls`` and a
|
|
6
|
+
tool result's ``tool_call_id``/``name``. Only those fields, on those roles, are admitted here; the
|
|
7
|
+
call arguments stay the JSON string the wire carries, and are decoded into the mapping the chat
|
|
8
|
+
template iterates only at render time, exactly as serving's ``detached_template_messages`` does.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from copy import deepcopy
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
TOOL_MESSAGE_KEYS = frozenset({"tool_calls", "tool_call_id", "name"})
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _call_text(value, *, source: str, position: int, field: str) -> str:
|
|
20
|
+
if not isinstance(value, str) or not value:
|
|
21
|
+
raise ValueError(f"{source} message {position} {field} must be a nonempty string")
|
|
22
|
+
return value
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def tool_message_fields(message: dict, *, source: str, position: int) -> dict[str, Any]:
|
|
26
|
+
"""the validated tool fields one message carries, or {} when it carries none.
|
|
27
|
+
|
|
28
|
+
``tool_calls`` belongs to an assistant turn and ``tool_call_id``/``name`` to a tool result,
|
|
29
|
+
matching serving's ``validate_tool_history``; on any other role they are rejected rather than
|
|
30
|
+
carried, because the template would silently drop them. Call validation is shared with serving;
|
|
31
|
+
full-history validation cannot run here because a rollout validates calls before results exist.
|
|
32
|
+
"""
|
|
33
|
+
role = message.get("role")
|
|
34
|
+
fields: dict[str, Any] = {}
|
|
35
|
+
if message.get("tool_calls") is not None:
|
|
36
|
+
if role != "assistant":
|
|
37
|
+
raise ValueError(f"{source} message {position} tool_calls require the assistant role")
|
|
38
|
+
from flash.serve.request.tool_calls import validate_tool_calls
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
validate_tool_calls(message["tool_calls"], message_index=position)
|
|
42
|
+
except ValueError as error:
|
|
43
|
+
raise ValueError(f"{source} {error}") from error
|
|
44
|
+
fields["tool_calls"] = deepcopy(message["tool_calls"])
|
|
45
|
+
for key in ("tool_call_id", "name"):
|
|
46
|
+
if message.get(key) is None:
|
|
47
|
+
continue
|
|
48
|
+
if role != "tool":
|
|
49
|
+
raise ValueError(f"{source} message {position} {key} requires the tool role")
|
|
50
|
+
fields[key] = _call_text(message[key], source=source, position=position, field=key)
|
|
51
|
+
return fields
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def template_tool_messages(messages: list[dict]) -> list[dict]:
|
|
55
|
+
"""decode call arguments into the mapping the qwen template iterates, as serving does."""
|
|
56
|
+
if not any(message.get("tool_calls") for message in messages):
|
|
57
|
+
return messages
|
|
58
|
+
from flash.serve.request.tool_calls import detached_template_messages
|
|
59
|
+
|
|
60
|
+
return detached_template_messages(messages)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
__all__ = ["TOOL_MESSAGE_KEYS", "template_tool_messages", "tool_message_fields"]
|