soup-cli 0.75.0__tar.gz → 0.75.2__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.
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/ci.yml +12 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/CHANGELOG.md +40 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/PKG-INFO +15 -34
- {soup_cli-0.75.0 → soup_cli-0.75.2}/README.md +14 -33
- {soup_cli-0.75.0 → soup_cli-0.75.2}/README.tr.md +17 -34
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/adapters-and-governance.md +2 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/backends-and-ops.md +14 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/commands.md +1 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/evaluation.md +2 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/performance-and-quantization.md +9 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/serving-and-export.md +14 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/training.md +2 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/pyproject.toml +1 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/run.py +24 -3
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/schema.py +7 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/unpack.py +76 -7
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cli.py +42 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/lambda_labs.py +56 -6
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/modal.py +117 -17
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/adapters.py +2 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/can.py +15 -12
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/generate.py +12 -4
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/push.py +45 -19
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/runs.py +5 -2
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/serve.py +69 -18
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ship.py +25 -14
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/schema.py +54 -13
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/vllm.py +4 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/gate.py +17 -2
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/judge.py +10 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/experiment/tracker.py +13 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/execution.py +124 -10
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/registry.py +86 -24
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/app.py +98 -4
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/app.js +131 -82
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/index.html +20 -19
- soup_cli-0.75.2/src/soup_cli/ui/static/safe_html.js +48 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_sign.py +9 -0
- soup_cli-0.75.2/src/soup_cli/utils/argv_redaction.py +163 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/audit_log.py +4 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hubs.py +31 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream_runtime.py +174 -19
- soup_cli-0.75.2/src/soup_cli/utils/local_request_guard.py +133 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lr_groups.py +6 -14
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/net_guard.py +81 -0
- soup_cli-0.75.2/src/soup_cli/utils/safe_regex.py +312 -0
- soup_cli-0.75.2/src/soup_cli/utils/yaml_limits.py +121 -0
- soup_cli-0.75.2/tests/test_adapter_trusted_key_backend.py +134 -0
- soup_cli-0.75.2/tests/test_argv_redaction_bundled_shorts.py +78 -0
- soup_cli-0.75.2/tests/test_audit_log_option_masking.py +135 -0
- soup_cli-0.75.2/tests/test_can_deploy_target_containment.py +115 -0
- soup_cli-0.75.2/tests/test_can_output_control_bytes.py +99 -0
- soup_cli-0.75.2/tests/test_can_read_limits.py +199 -0
- soup_cli-0.75.2/tests/test_cloud_output_dir_containment.py +154 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_critical.py +2 -2
- soup_cli-0.75.2/tests/test_config_regex_limits.py +283 -0
- soup_cli-0.75.2/tests/test_hub_push_credentials.py +135 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_inference_advanced.py +5 -5
- soup_cli-0.75.2/tests/test_issue1005_peft021_canonical_names.py +283 -0
- soup_cli-0.75.2/tests/test_issue1005_peft021_review_round.py +350 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue369_canonical_named_parameters.py +23 -15
- soup_cli-0.75.2/tests/test_issue616_net_guard_is_shared.py +436 -0
- soup_cli-0.75.2/tests/test_judge_key_scoping.py +59 -0
- soup_cli-0.75.2/tests/test_lambda_submit_interrupt.py +335 -0
- soup_cli-0.75.2/tests/test_local_request_guard.py +102 -0
- soup_cli-0.75.2/tests/test_mcp_capacity_all_runs.py +91 -0
- soup_cli-0.75.2/tests/test_mcp_digest_no_follow.py +292 -0
- soup_cli-0.75.2/tests/test_mcp_plan_inputs.py +230 -0
- soup_cli-0.75.2/tests/test_mcp_post_spawn_failure.py +130 -0
- soup_cli-0.75.2/tests/test_modal_stub_outputs.py +321 -0
- soup_cli-0.75.2/tests/test_outbound_endpoint_ip_literals.py +734 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_a_wave1.py +19 -0
- soup_cli-0.75.2/tests/test_runs_clean_keep_weights.py +177 -0
- soup_cli-0.75.2/tests/test_safe_regex.py +240 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_serve.py +2 -2
- soup_cli-0.75.2/tests/test_serve_local_request_guard.py +307 -0
- soup_cli-0.75.2/tests/test_ui_rendering_escapes.py +184 -0
- soup_cli-0.75.2/tests/test_ui_security_headers.py +203 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0536.py +1 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0537.py +20 -20
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07135.py +1 -1
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07201.py +11 -9
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07202.py +2 -2
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07203.py +11 -5
- soup_cli-0.75.2/tests/test_yaml_expanded_limit.py +283 -0
- soup_cli-0.75.0/tests/test_issue616_net_guard_is_shared.py +0 -208
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.dockerignore +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.gitattributes +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/FUNDING.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/constraints/transformers-floor.txt +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/pull_request_template.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/dependency-drift.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/recipe-repo-ids.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.gitignore +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.mailmap +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/AGENTS.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/CODEOWNERS +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/CONTRIBUTING.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/Dockerfile +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/LICENSE +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/NOTICE +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/SECURITY.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/README.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/bench_validator.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-395-second-stack-vram.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-655-pinned-store-accounting.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-674-quest-w4a4-sft.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-h100-validation.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-qwen4-ple-m4-max.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.0-layer-streaming.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.2-nf4.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.3-breadth.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.4-preference-losses.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.73.1-measured-vram-fit.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.73.2-leg2-scoring.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/bitexact.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/bnb_repro.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/fsdp_sharding_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/issue331_qlora_scope.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/issue395_second_stack_vram.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/mlx_sft_smoke.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/probe-v0.73.0-what-bounds-streaming.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/run-m1-8gb-mlx-sft.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/run-t4-colab-free-tier.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/changelog.d/README.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docker-compose.yml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/README.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/assets/layer-streaming.gif +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/assets/web-ui-new-training.png +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/autodistill.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/compliance.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/data.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/models.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/README.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/README.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/notebooks/proof-4gb.ipynb +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/assemble_changelog.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/autodistill_b1_hardware_smoke.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/check_recipe_repo_ids.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/generate_recipe_snapshot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/soup.png +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/soup_logo_svg.svg +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/capture.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/contract.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/fingerprints.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/mlx_worker.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/publisher.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/_common.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/reward.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/backend_support.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/unknown_keys.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/over_refusal.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/calculator.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/guess_number.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/aider_polyglot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/_trl_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_masking.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_optim.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/stream_setup.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_artifact.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_checkpoint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_stream.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_pull.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_shard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/oq_affine.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/plotext_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/process_liveness.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_ple.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_stress.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_synth.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/seeding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/terminal.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/chat.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/code.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/medical.yaml +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/__init__.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/_windows_ci.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/conftest.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/capture_token.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/consumption_ledger.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/plan.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/shard_manifest.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/student_rollout_capture_token.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/issue204_langfuse_observations_v2_page.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/recipe_config_snapshots.json +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/mcp_roundtrip.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_adapters.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_align_trainable_dtype.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_audio.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_autopilot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bco.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bench.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_build_dag.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_callback.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cans.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_chat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_chat_template.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_help_assertions_are_ansi_safe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_startup_is_light.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_config.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_contributing_test_counts_are_digit_free.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cost.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_curriculum.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_augment.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_sample.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_split.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_tools.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_demo_bundle_metadata.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_device_map_distributed.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_diff.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_display.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_doctor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_embedding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_errors.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_examples_configs.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_export.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_formats.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_generate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_gpu.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_grpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_infer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_init.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ipo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue144_gguf_export.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue204_langfuse_pull.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_display_bridge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_harness_bridge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_val_loss_producer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue264_cloud.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue296_network_transport.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_kwargs.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_train.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue302_vision_pad_token.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue304_cross_tokenizer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue308_callback_subclass.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue316_refusal_apostrophe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue316_suites.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue320_lazy_callback_import.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue322_mcp2_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue323_trl_kwarg_drift.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue327_logits_estimate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue330_mix_recipe_train_loadable.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue332_vllm_prompt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue334_fa3_detection.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue336_deepspeed_lora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue339_load_dtype.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue341_seed_and_fullft.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue348_calibrated_logits_wiring.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue349_measured_fit.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue350_fsdp_qlora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue352_fsdp_peft_checkpoint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue353_mlx_seed_warning.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue353_seed_every_task.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue359_deepspeed_guard_coverage.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue360_sglang_prompt_finish_reason.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue367_live_eval_quantization.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue372_no_reexec_hint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue373_fsdp_sharding_probe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue374_stream_disk_preflight.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue377_lisa_train_embeddings.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue382_windows_ci_guard_is_shared.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue385_stream_dtype.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue389_torchao_error.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue390_expandable_segments_reason.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue392_mlx_target_keys.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue394_mlx_runtime_isolation.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue401_orphaned_run_reconcile.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue402_restart_capacity.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue404_baseline_scorer_stamp.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue423_mlx_device_detection.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue424_windows_liveness.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue427_qwen35_text_modality.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue433_meta_adapter_guard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue441_coerce_token_ids.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue443_interleave_wiring.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue459_interleave_streaming_hub.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue477_qwen38_catalog.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue487_changelog_fragments.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue491_frozen_base_load_dtype.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue502_qwen35_transformers5.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue505_launching_window_blocks_restart.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue524_launching_reconcile.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue531_stream_base_provenance.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue532_supervised_token_guard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue533_offline_hf_materialization.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue534_apple_nvme.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue546_transient_finite_metric.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue549_bon_resume.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue550_bon_offline.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue555_bon_stream_resume.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue563_mps_bf16_training.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue565_grpo_reward_metadata.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue567_grpo_mps_bf16.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue571_qwen4_exp.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue573_qwen4_expert_lora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_capture.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_contract.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_fingerprints.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_mlx_worker.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_publisher.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue599_telemetry_dns_ssrf.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue600_abbreviated_ipv4_ssrf.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue602_qwen4_ple_streaming.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue621_recipe_snapshot.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue623_stream_pin_allocation.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue627_unknown_config_keys.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue633_ansi_in_highlighted_output.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue634_mlx_resume.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue636_torch_floor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue642_sweep_dry_run.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue649_batch_probe_peak_gate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue654_batch_probe_uncovered_branches.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue676_non_dict_messages.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue677_recipe_repo_id_guard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue681_uld_id_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue682_uld_loss_label_mask.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue683_mlx_response_masking.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue684_mlx_grad_accumulation.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue685_mlx_grad_checkpoint.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue686_mlx_optimizer_schedule.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue687_ui_auth.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue688_ui_drain.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue689_hub_streaming.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue690_embedding_trainer_attrs.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue691_sft_packing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue695_validate_agrees_with_loader.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue700_embedding_lora_zero.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue721_ppo_config_forwarding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue723_sequence_gspo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue724_loraplus_optimizer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue724_loraplus_wiring_coverage.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue731_ui_docs_bind.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue748_config_fields_reach_a_consumer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue752_cli_commands_called_as_functions.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue755_backend_support_registry.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue771_validator_fast_path.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue775_path_containment_ratchet.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue781_inference_bos.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue811_data_validate_exit_codes.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue91_aider_eval.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue99_apple_monitor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_kto.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_loader.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_log_level.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mcp_execute.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_merge.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_migrate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mii_serve.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_dispatch.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_max_grad_norm.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_moe.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_ffd_placement.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_no_foreign_license_headers.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_orpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_packing.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_performance.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_plotext_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ppo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_pretrain.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_profile.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_profiling.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_progress.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_push.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_qat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quant_check.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quickstart.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_qwen35_streaming.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_readme_translation_sync.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipe_count_is_synced.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipes.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_registry.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_relora.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_replay.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_requires_python_bound.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_resume.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_rlvr.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_run_cost.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_runs.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_semantic_split.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_server_generate.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sglang_trust_contract.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_simpo.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_stream_multi_gpu_guard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sweep.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_telemetry_ssrf.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tracker.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_training_speed.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_transformers_floor_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trl_preference_config_contract.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trl_version_compat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tui.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_unsloth.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0420.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0450.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0490.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0510.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0520.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0530.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v05310.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v05311.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0532.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0533.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0534.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0535.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0538.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0539.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0540.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0550.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0560.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0580.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0590.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07110.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07111.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07112.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07113.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07114.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07115.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07116.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07117.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07118.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07119.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0712.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07120.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07121.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07122.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07123.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07124.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07125.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07126.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07127.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07128.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07129.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0713.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07130.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07131.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07132.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07133.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07134.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07136.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07137.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07138.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07139.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0714.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07140.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07141.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07141_telemetry_prompt.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0715.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0716.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0717.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0718.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0719.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07200.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07204.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07300.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07302.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_val_loss_end_to_end.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_validator.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_version_sync.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_vision.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_warmup.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_why.py +0 -0
- {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_windows_encoding.py +0 -0
|
@@ -2,7 +2,11 @@ name: CI
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
|
|
5
|
+
# `release/**` is here so a release branch gets the matrix on the exact
|
|
6
|
+
# tree that will be tagged. A pull request builds the MERGE of head and
|
|
7
|
+
# main, which for a release cut from an older tag is not the tree that
|
|
8
|
+
# ships, so a PR run cannot stand in for this one.
|
|
9
|
+
branches: [main, 'release/**']
|
|
6
10
|
pull_request:
|
|
7
11
|
branches: [main]
|
|
8
12
|
|
|
@@ -236,6 +240,13 @@ jobs:
|
|
|
236
240
|
- uses: actions/setup-python@v5
|
|
237
241
|
with:
|
|
238
242
|
python-version: ${{ matrix.python-version }}
|
|
243
|
+
# The Web UI escaping tests run `safe_html.js` under node, and skip when
|
|
244
|
+
# node is absent. Runner images happen to ship one, so the skip would be
|
|
245
|
+
# silent: pin it, or the only tests that execute the real escaping logic
|
|
246
|
+
# can disappear without anything turning red.
|
|
247
|
+
- uses: actions/setup-node@v4
|
|
248
|
+
with:
|
|
249
|
+
node-version: "22"
|
|
239
250
|
- name: Pin the HF cache to a deterministic path
|
|
240
251
|
# Set here and not in the job-level `env:` block: the `runner` context
|
|
241
252
|
# is not available there (only github / needs / strategy / matrix /
|
|
@@ -12,6 +12,44 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.75.2] - 2026-10-01
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Outbound endpoint checks now refuse a private, link-local or reserved IP literal over `https` as well as `http`. This covers `soup data generate --api-base`, the vLLM provider and the commands that use it, judge URLs in `soup eval judge`, eval-gate suites, `soup ship --judge-model` / `eval.ship.judge_model` and `training.online_dpo_judge`, and the Web UI chat proxy. Loopback still works; address a LAN server by its hostname. `training.online_dpo_judge` is now checked when soup.yaml loads, not only when the trainer starts.
|
|
20
|
+
|
|
21
|
+
- `soup data generate --api-base` and the Web UI chat proxy no longer treat `http://0.0.0.0` as local; use `localhost` or `127.0.0.1`.
|
|
22
|
+
|
|
23
|
+
- `100.64.0.0/10` and `fec0::/10` literals are now treated as non-public by every check that already refused private addresses (webhooks, the OTLP endpoint, telemetry, hub endpoints over HTTP, and `soup ingest --pull`, where `--allow-private-host` admits them).
|
|
24
|
+
|
|
25
|
+
- Every check that refuses private addresses now also recognizes an IP literal written with non-ASCII digits or label separators, which an HTTP client folds to ASCII before it connects.
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- `soup ship` checks `--judge-model` before it builds the base and tuned models; it used to load both and only then stop with a usage error.
|
|
30
|
+
|
|
31
|
+
- The Web UI chat proxy answers 400, not 500, for an endpoint URL that does not parse.
|
|
32
|
+
|
|
33
|
+
### Security
|
|
34
|
+
|
|
35
|
+
- Hardening of outbound endpoint validation. A security advisory with details and upgrade guidance will be published alongside this release.
|
|
36
|
+
|
|
37
|
+
## [0.75.1] - 2026-09-21
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- **A layer-streamed LoRA adapter saved as ZERO tensors under peft 0.21.0 (#1005 in #1010).** peft 0.21 selects an adapter's tensors by the prefixes it reads off `model.named_modules()` and keeps the matching `state_dict()` entries, where 0.20 filtered by the `lora_` substring; the streaming wrapper's module and parameter names carried `.inner.` while its `state_dict()` keys were canonical, so `trainer.save_model()`, every `save_steps` checkpoint and `get_peft_model_state_dict()` returned nothing, and nothing raised. The wrapper now enumerates the inner layer's tree at its own prefix (`named_modules()` / `named_children()`, with `train()` / `apply()` / `_apply()` reaching the inner layer explicitly), so names and keys are one spelling — which also keeps transformers' weight-decay grouping, built from `named_children()`, from silently dropping every LoRA parameter into the no-decay group. **Any adapter saved with `stream_layers: true` on peft>=0.21 before this fix holds zero tensors (a 40-byte `adapter_model.safetensors`, no error at save time) and cannot be recovered — re-train it on a Soup with this fix, or with `peft<0.21`.** Naming only; nothing on the streamed forward path changes. Ten peft-version-independent tests pin names == keys against a resident LoRA model; the four tests that documented the old asymmetry are inverted rather than deleted. No `peft<0.21` pin.
|
|
42
|
+
|
|
43
|
+
- **A Ctrl+C arriving immediately after the Lambda controller started could still leave the instance running (#1073 in #1078).** `submit_lambda_run` spawned the controller outside the `try` that absorbs interrupts, so a SIGINT delivered between `Popen` returning and the waiting loop being entered — or one landing on the "still waiting" notice, which is written from the interrupt handler — unwound the parent while the controller was still terminating the paid instance in its `finally` block. The spawn and the notice now sit inside the guarded region: once the child exists, every path leads back to `proc.wait()` and the controller's exit code remains what the function returns. An interrupt raised before the child exists still propagates unchanged, and a `wait()` failure that is not an interrupt still surfaces rather than being retried.
|
|
44
|
+
|
|
45
|
+
- `soup runs clean` now accepts `--no-keep-weights` to delete whole non-best checkpoints; `--keep-weights` (the default) keeps weights on every supported Click version — on Click 8.1 it previously deleted whole checkpoints (#1057)
|
|
46
|
+
|
|
47
|
+
- **Cloud runs keep their outputs and their cleanup (#1058).** `soup train --cloud modal` now writes run outputs to the `soup-outputs` Modal volume and downloads them to the local output directory when the run ends (also after a failed run); previously checkpoints were lost with the container. `soup train --cloud lambda --cloud-submit`: pressing Ctrl+C now waits for the controller to terminate the Lambda instance; previously the controller was killed 0.25 s later and the instance could keep running (Linux/macOS).
|
|
48
|
+
|
|
49
|
+
### Security
|
|
50
|
+
|
|
51
|
+
- Hardening across the CLI, the inference server, the Web UI, MCP execution, config parsing and `.can` handling. A security advisory with details and upgrade guidance will be published alongside this release.
|
|
52
|
+
|
|
15
53
|
## [0.75.0] - 2026-09-12
|
|
16
54
|
|
|
17
55
|
### Added
|
|
@@ -4650,7 +4688,8 @@ what a fine-tune forgets and leaks.
|
|
|
4650
4688
|
`SECURITY.md` (~220 KB). `SECURITY.md` is now a concise security policy; the
|
|
4651
4689
|
detailed hardening notes remain in git history and the GitHub Releases notes.
|
|
4652
4690
|
|
|
4653
|
-
[Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.
|
|
4691
|
+
[Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.1...HEAD
|
|
4692
|
+
[0.75.1]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.0...v0.75.1
|
|
4654
4693
|
[0.75.0]: https://github.com/MakazhanAlpamys/Soup/compare/v0.74.0...v0.75.0
|
|
4655
4694
|
[0.74.0]: https://github.com/MakazhanAlpamys/Soup/compare/v0.73.3...v0.74.0
|
|
4656
4695
|
[0.73.1]: https://github.com/MakazhanAlpamys/Soup/compare/v0.73.0...v0.73.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.75.
|
|
3
|
+
Version: 0.75.2
|
|
4
4
|
Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
|
|
5
5
|
Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
|
|
6
6
|
Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
|
|
@@ -241,39 +241,20 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
241
241
|
|
|
242
242
|
## What's New
|
|
243
243
|
|
|
244
|
-
**v0.75.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
`scheduler` / `weight_decay` / `optimizer`, `max_grad_norm`, `gradient_accumulation_steps`
|
|
259
|
-
and `gradient_checkpointing` were each validated and then dropped on `backend: mlx`. Only
|
|
260
|
-
8 of the 32 optimizer names have an MLX equivalent; the other 24 are refused by name
|
|
261
|
-
instead of silently becoming AdamW. MLX also drives the live dashboard, the tracker and
|
|
262
|
-
`soup ui`, and `soup doctor --config` lists the settings a backend does not read.
|
|
263
|
-
- **Validation loss existed nowhere.** It was computed on every backend and thrown away:
|
|
264
|
-
no metrics column, no event field, nothing on the panel. It is now recorded, streamed
|
|
265
|
-
and displayed.
|
|
266
|
-
- **Breaking: `grpo_variant: gspo` is the published sequence-level objective**
|
|
267
|
-
(arXiv:2507.18071), replacing a column-centering heuristic in which a padding token also
|
|
268
|
-
shifted the gradient of every row sharing its column. Existing gspo configs will not
|
|
269
|
-
reproduce prior runs.
|
|
270
|
-
- **Web UI read endpoints and SSE require auth**, with short-lived single-use tickets
|
|
271
|
-
instead of a token in a query string; `--public` no longer serves `/docs` and
|
|
272
|
-
`/openapi.json` to the LAN; and a training subprocess no longer hangs when nothing
|
|
273
|
-
reads its output.
|
|
274
|
-
- **`torch>=2.6.0`** closes v0.74.0's known limitation: at 2.5.1 `trl>=0.29` could not
|
|
275
|
-
import and every preference trainer was dead. Also fixed: `training.loraplus_lr_ratio`
|
|
276
|
-
crashed every run that set it, and `packing: true` raised on TRL 0.29.
|
|
244
|
+
**v0.75.2 — outbound endpoint checks refuse private addresses.** A security patch on top
|
|
245
|
+
of v0.75.1 with one hardening change; everything merged since v0.75.0 ships in the next
|
|
246
|
+
minor release.
|
|
247
|
+
|
|
248
|
+
- **Endpoint URLs can no longer name a private address directly.** The
|
|
249
|
+
`soup data generate --api-base` URL, the vLLM provider, judge URLs (`soup eval judge`,
|
|
250
|
+
eval-gate suites, `soup ship --judge-model`, `training.online_dpo_judge`) and the Web UI
|
|
251
|
+
chat proxy refuse a private, link-local or reserved IP literal over `https` as well as
|
|
252
|
+
`http`. Loopback still works; address a server on your network by its hostname. Details
|
|
253
|
+
in an advisory published with this release.
|
|
254
|
+
- **`http://0.0.0.0` is no longer treated as local** by `soup data generate --api-base` and
|
|
255
|
+
the Web UI chat proxy; use `localhost` or `127.0.0.1`.
|
|
256
|
+
- **`100.64.0.0/10` and `fec0::/10` count as non-public** wherever private addresses were
|
|
257
|
+
already refused, including webhooks, the OTLP endpoint and `soup ingest --pull`.
|
|
277
258
|
|
|
278
259
|
> Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
|
|
279
260
|
> crash in the native extension before Soup runs at all.
|
|
@@ -87,39 +87,20 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
87
87
|
|
|
88
88
|
## What's New
|
|
89
89
|
|
|
90
|
-
**v0.75.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
`scheduler` / `weight_decay` / `optimizer`, `max_grad_norm`, `gradient_accumulation_steps`
|
|
105
|
-
and `gradient_checkpointing` were each validated and then dropped on `backend: mlx`. Only
|
|
106
|
-
8 of the 32 optimizer names have an MLX equivalent; the other 24 are refused by name
|
|
107
|
-
instead of silently becoming AdamW. MLX also drives the live dashboard, the tracker and
|
|
108
|
-
`soup ui`, and `soup doctor --config` lists the settings a backend does not read.
|
|
109
|
-
- **Validation loss existed nowhere.** It was computed on every backend and thrown away:
|
|
110
|
-
no metrics column, no event field, nothing on the panel. It is now recorded, streamed
|
|
111
|
-
and displayed.
|
|
112
|
-
- **Breaking: `grpo_variant: gspo` is the published sequence-level objective**
|
|
113
|
-
(arXiv:2507.18071), replacing a column-centering heuristic in which a padding token also
|
|
114
|
-
shifted the gradient of every row sharing its column. Existing gspo configs will not
|
|
115
|
-
reproduce prior runs.
|
|
116
|
-
- **Web UI read endpoints and SSE require auth**, with short-lived single-use tickets
|
|
117
|
-
instead of a token in a query string; `--public` no longer serves `/docs` and
|
|
118
|
-
`/openapi.json` to the LAN; and a training subprocess no longer hangs when nothing
|
|
119
|
-
reads its output.
|
|
120
|
-
- **`torch>=2.6.0`** closes v0.74.0's known limitation: at 2.5.1 `trl>=0.29` could not
|
|
121
|
-
import and every preference trainer was dead. Also fixed: `training.loraplus_lr_ratio`
|
|
122
|
-
crashed every run that set it, and `packing: true` raised on TRL 0.29.
|
|
90
|
+
**v0.75.2 — outbound endpoint checks refuse private addresses.** A security patch on top
|
|
91
|
+
of v0.75.1 with one hardening change; everything merged since v0.75.0 ships in the next
|
|
92
|
+
minor release.
|
|
93
|
+
|
|
94
|
+
- **Endpoint URLs can no longer name a private address directly.** The
|
|
95
|
+
`soup data generate --api-base` URL, the vLLM provider, judge URLs (`soup eval judge`,
|
|
96
|
+
eval-gate suites, `soup ship --judge-model`, `training.online_dpo_judge`) and the Web UI
|
|
97
|
+
chat proxy refuse a private, link-local or reserved IP literal over `https` as well as
|
|
98
|
+
`http`. Loopback still works; address a server on your network by its hostname. Details
|
|
99
|
+
in an advisory published with this release.
|
|
100
|
+
- **`http://0.0.0.0` is no longer treated as local** by `soup data generate --api-base` and
|
|
101
|
+
the Web UI chat proxy; use `localhost` or `127.0.0.1`.
|
|
102
|
+
- **`100.64.0.0/10` and `fec0::/10` count as non-public** wherever private addresses were
|
|
103
|
+
already refused, including webhooks, the OTLP endpoint and `soup ingest --pull`.
|
|
123
104
|
|
|
124
105
|
> Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
|
|
125
106
|
> crash in the native extension before Soup runs at all.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- synced-from: README.md sha256:
|
|
1
|
+
<!-- synced-from: README.md sha256:aca2a4e15b1d8c4055ac1b650f9fd514bdfdc024e7d9dd86211a0796263d1d4b -->
|
|
2
2
|
<p align="center">🌍 <a href="README.md">English</a> | <strong>Türkçe</strong></p>
|
|
3
3
|
|
|
4
4
|
<p align="center">
|
|
@@ -88,39 +88,22 @@ yerine altyapıyla boğuşarak geçiriyor. Soup bunu çözer.
|
|
|
88
88
|
|
|
89
89
|
## Yenilikler
|
|
90
90
|
|
|
91
|
-
**v0.75.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
ve `gradient_checkpointing`, `backend: mlx` üzerinde tek tek doğrulanıp sonra düşürülüyordu.
|
|
108
|
-
32 optimizer adından yalnızca 8'inin MLX karşılığı var; diğer 24'ü sessizce AdamW'ye
|
|
109
|
-
dönüşmek yerine adıyla reddediliyor. MLX ayrıca canlı panoyu, izleyiciyi ve `soup ui`'yi
|
|
110
|
-
sürüyor; `soup doctor --config` ise bir arka ucun okumadığı ayarları listeliyor.
|
|
111
|
-
- **Doğrulama kaybı hiçbir yerde yoktu.** Her arka uçta hesaplanıp atılıyordu: metrik sütunu
|
|
112
|
-
yok, olay alanı yok, panoda hiçbir şey yok. Artık kaydediliyor, akıtılıyor ve gösteriliyor.
|
|
113
|
-
- **Geriye dönük uyumsuz: `grpo_variant: gspo`, yayımlanmış dizi düzeyi hedef fonksiyonudur**
|
|
114
|
-
(arXiv:2507.18071); bir dolgu belirtecinin aynı sütunu paylaşan her satırın gradyanını da
|
|
115
|
-
kaydırdığı sütun merkezleme sezgiselinin yerini alıyor. Mevcut gspo yapılandırmaları önceki
|
|
116
|
-
çalıştırmaları yeniden üretmeyecek.
|
|
117
|
-
- **Web arayüzünün okuma uç noktaları ve SSE, kimlik doğrulama gerektiriyor**; sorgu
|
|
118
|
-
dizesindeki bir belirteç yerine kısa ömürlü, tek kullanımlık biletlerle. `--public` artık
|
|
119
|
-
`/docs` ve `/openapi.json`'ı yerel ağa sunmuyor; eğitim alt süreci de çıktısını kimse
|
|
120
|
-
okumadığında artık askıda kalmıyor.
|
|
121
|
-
- **`torch>=2.6.0`**, v0.74.0'ın bilinen sınırlamasını kapatıyor: 2.5.1'de `trl>=0.29` içe
|
|
122
|
-
aktarılamıyor ve her tercih eğiticisi ölüydü. Ayrıca düzeltildi: `training.loraplus_lr_ratio`
|
|
123
|
-
onu ayarlayan her çalıştırmayı çökertiyordu ve `packing: true` TRL 0.29'da hata veriyordu.
|
|
91
|
+
**v0.75.2 — giden uç nokta denetimleri özel adresleri reddediyor.** v0.75.1'in üzerine
|
|
92
|
+
tek bir sıkılaştırma değişikliği içeren bir güvenlik yaması; v0.75.0'dan bu yana
|
|
93
|
+
birleştirilen her şey bir sonraki ara sürümde geliyor.
|
|
94
|
+
|
|
95
|
+
- **Uç nokta URL'leri artık özel bir adresi doğrudan gösteremiyor.**
|
|
96
|
+
`soup data generate --api-base` URL'si, vLLM sağlayıcısı, yargıç URL'leri (`soup eval judge`,
|
|
97
|
+
eval-gate paketleri, `soup ship --judge-model`, `training.online_dpo_judge`) ve Web
|
|
98
|
+
arayüzünün sohbet vekili; özel, bağlantı-yerel (link-local) veya ayrılmış bir IP
|
|
99
|
+
değişmezini yalnızca `http` üzerinden değil `https` üzerinden de reddediyor. Geri döngü
|
|
100
|
+
(loopback) çalışmaya devam ediyor; ağınızdaki bir sunucuya ana makine adıyla erişin.
|
|
101
|
+
Ayrıntılar bu sürümle birlikte yayımlanan bir danışma belgesinde.
|
|
102
|
+
- **`http://0.0.0.0` artık yerel sayılmıyor**: `soup data generate --api-base` ve Web
|
|
103
|
+
arayüzünün sohbet vekili için `localhost` veya `127.0.0.1` kullanın.
|
|
104
|
+
- **`100.64.0.0/10` ve `fec0::/10` herkese açık olmayan adres sayılıyor**: web kancaları,
|
|
105
|
+
OTLP uç noktası ve `soup ingest --pull` dahil, özel adreslerin zaten reddedildiği her
|
|
106
|
+
yerde.
|
|
124
107
|
|
|
125
108
|
> Yalnızca Python **3.10–3.12**. 3.13+ sürümlerinde pip, Soup daha hiç çalışmadan yerel
|
|
126
109
|
> eklentide çöken, test edilmemiş PyTorch tekerleklerini çözümlüyordu.
|
|
@@ -524,7 +524,8 @@ soup adapters verify ./adapter --public-key trusted.pub
|
|
|
524
524
|
```
|
|
525
525
|
|
|
526
526
|
`verify` fails closed — any tamper, wrong/missing/unreadable key, or a
|
|
527
|
-
signature from an untrusted key marks the adapter invalid.
|
|
527
|
+
signature from an untrusted key marks the adapter invalid. With `--public-key`,
|
|
528
|
+
an adapter whose signature record is not `ed25519` is also invalid. Signing keys and
|
|
528
529
|
trusted public keys are symlink-rejected and size-capped but **not**
|
|
529
530
|
cwd-contained (keys are secrets that live outside the project). Signature
|
|
530
531
|
persists as `.soup-signature.json` (atomic write). `sigstore` keyless signing
|
|
@@ -221,6 +221,12 @@ soup train --config soup.yaml --cloud modal --gpu a100 --cloud-submit
|
|
|
221
221
|
`soup_modal_app.py` builds an image with `soup-cli[train]` pinned to your running version, writes
|
|
222
222
|
the embedded config inside the container, and runs `soup train` on the chosen GPU.
|
|
223
223
|
|
|
224
|
+
Run outputs are written to the `soup-outputs` Modal volume (created on first use), in a directory
|
|
225
|
+
named after the run (`soup-<12 hex>`), so checkpoints outlive the container. When the run ends,
|
|
226
|
+
including after a failed run, the app downloads every file in that directory into your local
|
|
227
|
+
output directory and prints a `modal volume get soup-outputs /<run name> <output dir> --force`
|
|
228
|
+
command that retries the download; that command places the files under `<output dir>/<run name>`.
|
|
229
|
+
|
|
224
230
|
### RunPod (Planned)
|
|
225
231
|
|
|
226
232
|
RunPod support is currently in development and descoped from live CLI dispatch pending automated
|
|
@@ -233,6 +239,10 @@ Lambda uses an instance rather than a serverless function. The generated local c
|
|
|
233
239
|
secret-free cloud-init script as API `user_data`, waits for it over SSH, copies the configured
|
|
234
240
|
output back, and requests instance termination in a `finally` block. Keep the controller running
|
|
235
241
|
until it reports that termination succeeded; shutting down the guest does not terminate billing.
|
|
242
|
+
Pressing Ctrl+C during `--cloud-submit` interrupts the controller, which still runs that `finally`
|
|
243
|
+
block, and `soup` waits for it to terminate the instance and exit rather than killing it; the only
|
|
244
|
+
way to skip that cleanup is to kill the controller process itself (for example with `kill` from
|
|
245
|
+
another terminal), which can leave the instance running.
|
|
236
246
|
|
|
237
247
|
Register the public half of an SSH key with Lambda first, then set:
|
|
238
248
|
|
|
@@ -373,7 +383,7 @@ soup runs clean run_202611...
|
|
|
373
383
|
soup runs clean --all --dry-run
|
|
374
384
|
```
|
|
375
385
|
|
|
376
|
-
By default, the `clean` command operates in "surgical mode" (`--keep-weights`), deleting huge optimizer state files (`optimizer.pt`) from lesser checkpoints to save gigabytes, but keeping their lightweight evaluation weights just in case you want to load them later.
|
|
386
|
+
By default, the `clean` command operates in "surgical mode" (`--keep-weights`), deleting huge optimizer state files (`optimizer.pt`) from lesser checkpoints to save gigabytes, but keeping their lightweight evaluation weights just in case you want to load them later. Pass `--no-keep-weights` to delete whole non-best checkpoints instead (the checkpoint with the lowest loss is always kept); combine it with `--dry-run` to see what would go first.
|
|
377
387
|
|
|
378
388
|
|
|
379
389
|
## Alternative Model Hubs
|
|
@@ -397,6 +407,9 @@ The endpoint validator follows the same SSRF rules as `HF_ENDPOINT`: only `http`
|
|
|
397
407
|
|
|
398
408
|
The hub adapter is schema-only in this release; the live downloader and uploader land in v0.51.1.
|
|
399
409
|
|
|
410
|
+
`soup push --hub modelscope` authenticates with `--token` or `MODELSCOPE_API_TOKEN`; `--hub modelers`
|
|
411
|
+
with `--token` or `MODELERS_TOKEN`. Neither reads `HF_TOKEN`.
|
|
412
|
+
|
|
400
413
|
|
|
401
414
|
## TensorBoard Integration
|
|
402
415
|
|
|
@@ -437,3 +437,4 @@ mutating tools (`train_start`, `export`) are gated behind `--allow-mutating`
|
|
|
437
437
|
- **Subprocess Isolation:** Execution runs the Soup CLI as an isolated subprocess (`shell=False`, `stdin=DEVNULL`, `cwd` pinned to server startup directory). Child stdout/stderr is redirected to `.soup/mcp-runs/<run_id>.log` to avoid corrupting the MCP JSON-RPC stdio stream.
|
|
438
438
|
- **Concurrency & Disconnects:** Enforces 1 active execution at a time, gated on a persisted run whose process is still alive — so a **restarted** server does not launch a second training while a child from a previous server is still running, and a stale record whose process is gone never blocks execution. A `launching` record (committed before the child process exists, pid not yet written) blocks restart capacity too: it is indistinguishable from "about to spawn", so treating it as live is the safe direction after a crash in that window. If a server crash leaves that row behind, `soup mcp runs reconcile --expunge-launching` removes rows older than five minutes and prints every removed `run_id`; use `--older-than-seconds N` to choose another positive threshold. The command refuses the whole operation if any candidate records a PID that is still alive. Launches run in background (fire-and-forget). Disconnecting the MCP client does not terminate an already-running subprocess.
|
|
439
439
|
- **Config Snapshotting & Input Revalidation:** At plan time (`train_start`), the validated config is snapshotted to `.soup/mcp-runs/<run_id>/config.yaml`, and execution uses this snapshot rather than the original mutable config path. External protected inputs (such as datasets and model/checkpoint directories or files) are not frozen in the snapshot; instead, their content digests (computed via SHA-256 for regular files, or deterministic recursive content hashing over sorted relative file paths for directory trees, bounded by file-count and total-byte safety limits) are recorded at plan time and revalidated immediately before spawn. Modifying an external protected input between plan and execute invalidates the token. Modifying the original config path after planning has no effect because execution strictly uses the snapshotted config. Snapshotting freezes only the configuration itself, not external filesystem assets.
|
|
440
|
+
- **Every Local Input Is Pinned:** A train plan pins every local file or directory the run reads (model, datasets, reward/teacher/PRM models, reward `.py` files, unlearning sets); an input outside the working directory is refused at plan time, and an input that did not exist at plan time must still not exist at execution.
|
|
@@ -218,6 +218,8 @@ tasks:
|
|
|
218
218
|
judge_model: ollama://llama3.1 # SSRF-allowlisted scheme
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
+
`judge_model` accepts `ollama://<model>`, `http://localhost:<port>/<model>` or `https://<host>/<model>`. An `https://` judge URL uses `OPENAI_API_KEY` only when its host is `api.openai.com`; other hosts are called as an OpenAI-compatible server without that key.
|
|
222
|
+
|
|
221
223
|
Baselines may be a registry reference (`registry://<name-or-id>`), a file path, or omitted for the first run. Any structured exception (`ValueError`, `FileNotFoundError`, `OSError`) during the gate is treated as a regression under `on_regression: stop`.
|
|
222
224
|
|
|
223
225
|
|
|
@@ -516,6 +516,15 @@ output: ./output
|
|
|
516
516
|
>
|
|
517
517
|
> If that prints anything, the adapter is affected. From v0.72.1 a streamed adapter is byte-for-byte in the same layout as an ordinary LoRA run.
|
|
518
518
|
|
|
519
|
+
> **peft 0.21.0 (released 2026-09-15) saved a streamed adapter EMPTY on every Soup before the #1005 fix — re-run those trainings.** peft 0.21 selects the adapter tensors to save by the prefixes it reads off `model.named_modules()`; the streaming wrapper's module names carried an `.inner.` segment its saved keys did not, so `trainer.save_model()`, every `save_steps` checkpoint and `PeftModel.save_pretrained()` wrote a 40-byte `adapter_model.safetensors` holding **zero** tensors, training reported success, and `--resume` loaded nothing. The training itself was correct — only the file is empty, and nothing in it can be recovered. Check with:
|
|
520
|
+
>
|
|
521
|
+
> ```bash
|
|
522
|
+
> python -c "from safetensors.torch import load_file; \
|
|
523
|
+
> print(len(load_file('adapter_model.safetensors')))"
|
|
524
|
+
> ```
|
|
525
|
+
>
|
|
526
|
+
> `0` means the adapter is lost. Fixed on `main` by PR #1010 (the wrapper now reports canonical names, so peft 0.20 and 0.21 both save every tensor; no `peft<0.21` pin); the next release carries it. Until you run a Soup with that fix, `pip install "peft<0.21"` is the workaround.
|
|
527
|
+
|
|
519
528
|
**Troubleshooting:**
|
|
520
529
|
- **"trainable LoRA parameters remain on the meta device"** — PEFT attached an
|
|
521
530
|
adapter without real storage and Soup refused the run before installing the
|
|
@@ -425,7 +425,7 @@ curl http://localhost:8000/v1/adapters
|
|
|
425
425
|
# → {"adapters": [{"name": "chat", "active": true}, ...], "active": "chat"}
|
|
426
426
|
```
|
|
427
427
|
|
|
428
|
-
Names are validated against `^[a-zA-Z0-9][a-zA-Z0-9-]*$`; activate/deactivate calls are thread-safe behind a lock.
|
|
428
|
+
Names are validated against `^[a-zA-Z0-9][a-zA-Z0-9-]*$`; activate/deactivate calls are thread-safe behind a lock. Activate/deactivate also check the `Host` and `Origin` headers (see [Server-Side Tool Endpoints](#server-side-tool-endpoints)).
|
|
429
429
|
|
|
430
430
|
### Multi-Tenant Vector Bank (`soup serve --bank`)
|
|
431
431
|
|
|
@@ -559,6 +559,8 @@ soup ui
|
|
|
559
559
|
|
|
560
560
|
**Security:** The Web UI generates a random auth token at startup (printed to console). Every private endpoint — mutating (start/stop training, delete runs, inspect data, validate config) and reading (runs, metrics, system, recipes, SSE streams) — requires an `Authorization: Bearer <token>` header. `/` and `/api/health` stay open so the dashboard can load. CORS is restricted to the served origin. Data inspection is sandboxed to the working directory.
|
|
561
561
|
|
|
562
|
+
**Content policy.** Every Web UI response carries a `Content-Security-Policy` that allows scripts only from the UI's own origin and the pinned Chart.js file (no inline script, no `eval`), plus `X-Content-Type-Options: nosniff`, `Referrer-Policy: no-referrer` and `X-Frame-Options: DENY`. Chart.js is loaded with a Subresource Integrity hash, so the browser refuses it if the CDN serves different bytes. The UI's markup carries no inline event handlers, and every server- or dataset-derived value is escaped before it is rendered. The loopback-only `/docs`, `/docs/oauth2-redirect` and `/redoc` pages are the one exception to the policy header, because FastAPI's interactive docs start from an inline script.
|
|
563
|
+
|
|
562
564
|
**Interactive API docs are loopback-only.** `/openapi.json`, `/docs`, `/docs/oauth2-redirect` and `/redoc` serve on a loopback bind and are **absent** (404) on any other, including `soup ui --public`. This is deliberate rather than incidental: the schema exposes no run data, configuration or logs, but it does describe every route, parameter and request/response shape, and on a LAN bind that is free reconnaissance. Gating them behind the token instead was rejected — `/docs` is a browser navigation and Swagger cannot attach a Bearer header to it, so gating would break the page for a developer while leaving `/openapi.json` readable by any HTTP client. If you need the schema while bound publicly, read it from a loopback instance of the same version.
|
|
563
565
|
|
|
564
566
|
```bash
|
|
@@ -767,3 +769,14 @@ Three POST routes are now available on `soup serve`:
|
|
|
767
769
|
HTTP 501 when strict OS isolation is unavailable (including on Windows or restricted
|
|
768
770
|
Linux containers).
|
|
769
771
|
|
|
772
|
+
Tool routes, `/v1/thumbs` and adapter activate/deactivate accept requests only when the
|
|
773
|
+
`Host` header names the bound address (any loopback name for a loopback bind) and any
|
|
774
|
+
`Origin` header names the same; otherwise they answer 421 or 403.
|
|
775
|
+
|
|
776
|
+
The generation routes (`/v1/chat/completions`, `/v1/messages`) and the adapter listing
|
|
777
|
+
(`GET /v1/adapters`) carry the narrower half of that check: a request whose `Origin` names
|
|
778
|
+
another site is refused with 403, so a page the operator merely visits cannot drive
|
|
779
|
+
generation on their server or enumerate the loaded adapters — CORS alone would only stop
|
|
780
|
+
that page *reading* the reply, not sending the request. Requests that carry no `Origin` at
|
|
781
|
+
all — curl, the OpenAI/Anthropic SDKs, a reverse proxy — are unaffected, and `Host` is not
|
|
782
|
+
checked on these routes, so a proxy can still front them under its own hostname.
|
|
@@ -646,6 +646,8 @@ The judge is Soup's own OpenAI-compatible `JudgeEvaluator` adapted to TRL's
|
|
|
646
646
|
`BasePairwiseJudge` (swap-debiased: a winner is only recorded when both A,B and
|
|
647
647
|
B,A orders agree). Recipe: `online-dpo-smollm2-135m`. Proof-of-mechanism was
|
|
648
648
|
validated on SmolLM2-135M with a synthetic judge (not a production RLHF claim; #286).
|
|
649
|
+
An `https://` judge URL uses `OPENAI_API_KEY` only when its host is `api.openai.com`; other
|
|
650
|
+
hosts are called as an OpenAI-compatible server without that key.
|
|
649
651
|
|
|
650
652
|
|
|
651
653
|
## Weighted Multi-Objective Preference Loss
|
|
@@ -18,7 +18,7 @@ from pathlib import Path
|
|
|
18
18
|
from typing import Callable, Optional
|
|
19
19
|
|
|
20
20
|
from soup_cli.cans.schema import DeployTarget, Manifest
|
|
21
|
-
from soup_cli.cans.unpack import extract_can, inspect_can
|
|
21
|
+
from soup_cli.cans.unpack import extract_can, inspect_can, read_config
|
|
22
22
|
from soup_cli.utils.paths import is_under_cwd
|
|
23
23
|
|
|
24
24
|
_RUN_TIMEOUT_SECONDS = 60 * 60 * 24 # 24h max — generous; user kills with ^C
|
|
@@ -130,10 +130,27 @@ def _deploy_target(target: DeployTarget, extract_dir: Path) -> int:
|
|
|
130
130
|
"--name", target.name,
|
|
131
131
|
])
|
|
132
132
|
if target.kind == "gguf":
|
|
133
|
-
# Already extracted — just confirm presence
|
|
133
|
+
# Already extracted — just confirm presence, but verify the manifest's
|
|
134
|
+
# path really resolves inside extract_dir first. ``target.path`` comes
|
|
135
|
+
# from the can, so an absolute path (pathlib drops the left operand
|
|
136
|
+
# when the right one is absolute), a ``..`` segment, or a symlink
|
|
137
|
+
# planted in the can would otherwise reach an arbitrary file on disk.
|
|
138
|
+
# Same containment pattern as the kind=ollama branch above; the
|
|
139
|
+
# DeployTarget field validator is the first line, this is the second.
|
|
134
140
|
if not target.path:
|
|
135
141
|
raise ValueError("deploy_target kind=gguf requires 'path'")
|
|
136
|
-
|
|
142
|
+
extract_real = os.path.realpath(str(extract_dir))
|
|
143
|
+
gguf_real = os.path.realpath(str(extract_dir / target.path))
|
|
144
|
+
try:
|
|
145
|
+
common = os.path.commonpath([extract_real, gguf_real])
|
|
146
|
+
except ValueError: # different drives on Windows — never contained
|
|
147
|
+
common = ""
|
|
148
|
+
if common != extract_real or gguf_real == extract_real:
|
|
149
|
+
raise ValueError(
|
|
150
|
+
f"deploy gguf path '{target.path}' escapes the can extract "
|
|
151
|
+
f"dir - refusing"
|
|
152
|
+
)
|
|
153
|
+
gguf_path = Path(gguf_real)
|
|
137
154
|
if not gguf_path.exists():
|
|
138
155
|
raise FileNotFoundError(f"deploy gguf path not found: {gguf_path}")
|
|
139
156
|
return 0
|
|
@@ -180,6 +197,10 @@ def run_can(
|
|
|
180
197
|
|
|
181
198
|
# Read manifest first — surface schema errors before any side effects.
|
|
182
199
|
manifest = inspect_can(str(src))
|
|
200
|
+
# The extracted config.yaml is handed to ``soup train``, whose loader has
|
|
201
|
+
# no size or expansion limit of its own; read it through the capped reader
|
|
202
|
+
# first so an oversized or alias-amplified config is refused here.
|
|
203
|
+
read_config(str(src))
|
|
183
204
|
|
|
184
205
|
if not yes:
|
|
185
206
|
if confirm_callback is None:
|
|
@@ -8,6 +8,8 @@ from typing import Literal, Optional
|
|
|
8
8
|
|
|
9
9
|
from pydantic import BaseModel, Field, field_validator
|
|
10
10
|
|
|
11
|
+
from soup_cli.utils.yaml_limits import check_expanded_nodes
|
|
12
|
+
|
|
11
13
|
CAN_FORMAT_VERSION = 3 # v0.71.3 #182: attestations field (additive over v2)
|
|
12
14
|
SUPPORTED_CAN_FORMAT_VERSIONS = (1, 2, 3)
|
|
13
15
|
|
|
@@ -28,6 +30,11 @@ def validate_attestation_statement(stmt: object) -> dict:
|
|
|
28
30
|
"""
|
|
29
31
|
if not isinstance(stmt, dict):
|
|
30
32
|
raise ValueError("attestation must be a dict (in-toto Statement)")
|
|
33
|
+
# Before json.dumps: a statement loaded from YAML may share references
|
|
34
|
+
# (anchors / aliases) whose serialised form is exponentially larger. Every
|
|
35
|
+
# node costs at least one byte of JSON, so a statement within the byte cap
|
|
36
|
+
# below has fewer nodes than _MAX_ATTESTATION_BYTES and always passes.
|
|
37
|
+
check_expanded_nodes(stmt, "attestation", limit=_MAX_ATTESTATION_BYTES)
|
|
31
38
|
type_field = stmt.get("_type")
|
|
32
39
|
predicate_type = stmt.get("predicateType")
|
|
33
40
|
if not isinstance(type_field, str) or not type_field:
|
|
@@ -11,14 +11,54 @@ import yaml
|
|
|
11
11
|
|
|
12
12
|
from soup_cli.cans.schema import Manifest
|
|
13
13
|
from soup_cli.utils.paths import is_under_cwd
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
from soup_cli.utils.yaml_limits import check_yaml_expanded_size
|
|
15
|
+
|
|
16
|
+
#: Largest ``manifest.yaml`` read into memory. A manifest holds a handful of
|
|
17
|
+
#: short fields plus at most 64 attestations of <= 1 MiB each, so a real one is
|
|
18
|
+
#: far below this.
|
|
19
|
+
MAX_MANIFEST_BYTES = 16 * 1024 * 1024
|
|
20
|
+
#: Largest ``config.yaml`` read into memory; a training config is kilobytes.
|
|
21
|
+
MAX_CONFIG_BYTES = 1 * 1024 * 1024
|
|
22
|
+
#: Most members ``extract_can`` will write. ``soup can pack`` writes four.
|
|
23
|
+
MAX_EXTRACT_MEMBERS = 10_000
|
|
24
|
+
#: Largest total declared size of the regular files ``extract_can`` writes.
|
|
25
|
+
#: ``soup can pack`` / ``fork`` write only small text members and refuse a can
|
|
26
|
+
#: over 100 MB compressed, but a hand-assembled can may carry a GGUF for a
|
|
27
|
+
#: ``deploy_targets`` entry (``cans/run.py:_deploy_target``). GGUF weights are
|
|
28
|
+
#: already quantised and barely compress, and an 8B model at Q4_K_M is ~4.9 GB,
|
|
29
|
+
#: so 8 GiB covers that case with margin while bounding what a small gzip
|
|
30
|
+
#: stream can expand to on disk (deflate reaches ~1000:1 on repetitive input).
|
|
31
|
+
MAX_EXTRACT_BYTES = 8 * 1024 * 1024 * 1024
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _read_text_member(
|
|
35
|
+
tar: tarfile.TarFile, name: str, max_bytes: int,
|
|
36
|
+
) -> tuple[str, int]:
|
|
37
|
+
"""Return ``(text, byte_length)`` of a regular UTF-8 member, size-capped."""
|
|
38
|
+
try:
|
|
39
|
+
member = tar.getmember(name)
|
|
40
|
+
except KeyError as exc:
|
|
41
|
+
raise ValueError(f"can has no member '{name}'") from exc
|
|
42
|
+
if not member.isfile():
|
|
43
|
+
raise ValueError(f"member '{name}' in can is not a regular file")
|
|
44
|
+
if member.size > max_bytes:
|
|
45
|
+
raise ValueError(
|
|
46
|
+
f"member '{name}' in can is too large "
|
|
47
|
+
f"({member.size} > {max_bytes} bytes)"
|
|
48
|
+
)
|
|
18
49
|
extracted = tar.extractfile(member)
|
|
19
50
|
if extracted is None:
|
|
20
51
|
raise ValueError(f"cannot read member '{name}' from can")
|
|
21
|
-
|
|
52
|
+
# The header size is not trusted alone: the read itself is bounded.
|
|
53
|
+
raw = extracted.read(max_bytes + 1)
|
|
54
|
+
if len(raw) > max_bytes:
|
|
55
|
+
raise ValueError(
|
|
56
|
+
f"member '{name}' in can is too large (> {max_bytes} bytes)"
|
|
57
|
+
)
|
|
58
|
+
try:
|
|
59
|
+
return raw.decode("utf-8"), len(raw)
|
|
60
|
+
except UnicodeDecodeError as exc:
|
|
61
|
+
raise ValueError(f"member '{name}' in can is not valid UTF-8: {exc}") from exc
|
|
22
62
|
|
|
23
63
|
|
|
24
64
|
def inspect_can(path: str) -> Manifest:
|
|
@@ -33,8 +73,11 @@ def inspect_can(path: str) -> Manifest:
|
|
|
33
73
|
if not can_path.exists():
|
|
34
74
|
raise FileNotFoundError(f"can not found: {path}")
|
|
35
75
|
with tarfile.open(can_path, mode="r:gz") as tar:
|
|
36
|
-
manifest_text = _read_text_member(
|
|
76
|
+
manifest_text, manifest_bytes = _read_text_member(
|
|
77
|
+
tar, "manifest.yaml", MAX_MANIFEST_BYTES,
|
|
78
|
+
)
|
|
37
79
|
data = yaml.safe_load(manifest_text) or {}
|
|
80
|
+
check_yaml_expanded_size(data, "manifest.yaml", source_bytes=manifest_bytes)
|
|
38
81
|
return Manifest(**data)
|
|
39
82
|
|
|
40
83
|
|
|
@@ -46,8 +89,9 @@ def read_config(path: str) -> dict[str, Any]:
|
|
|
46
89
|
if not can_path.exists():
|
|
47
90
|
raise FileNotFoundError(f"can not found: {path}")
|
|
48
91
|
with tarfile.open(can_path, mode="r:gz") as tar:
|
|
49
|
-
cfg_text = _read_text_member(tar, "config.yaml")
|
|
92
|
+
cfg_text, cfg_bytes = _read_text_member(tar, "config.yaml", MAX_CONFIG_BYTES)
|
|
50
93
|
data = yaml.safe_load(cfg_text) or {}
|
|
94
|
+
check_yaml_expanded_size(data, "config.yaml", source_bytes=cfg_bytes)
|
|
51
95
|
if not isinstance(data, dict):
|
|
52
96
|
raise ValueError("config.yaml must deserialise to a mapping")
|
|
53
97
|
return data
|
|
@@ -100,5 +144,30 @@ def extract_can(path: str, dest_dir: str) -> Path:
|
|
|
100
144
|
dest = Path(dest_dir)
|
|
101
145
|
dest.mkdir(parents=True, exist_ok=True)
|
|
102
146
|
with tarfile.open(can_path, mode="r:gz") as tar:
|
|
147
|
+
_check_extract_bounds(tar)
|
|
103
148
|
_safe_extract(tar, dest)
|
|
104
149
|
return dest
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _check_extract_bounds(tar: tarfile.TarFile) -> None:
|
|
153
|
+
"""Refuse a can whose member count or total file size is over the limits.
|
|
154
|
+
|
|
155
|
+
Runs before anything is written, so a refused can leaves no partial
|
|
156
|
+
output. Iterates lazily so the count stops the header scan early.
|
|
157
|
+
"""
|
|
158
|
+
count = 0
|
|
159
|
+
total = 0
|
|
160
|
+
for member in tar:
|
|
161
|
+
count += 1
|
|
162
|
+
if count > MAX_EXTRACT_MEMBERS:
|
|
163
|
+
raise ValueError(
|
|
164
|
+
f"can has too many members (> {MAX_EXTRACT_MEMBERS}); "
|
|
165
|
+
"refusing to extract"
|
|
166
|
+
)
|
|
167
|
+
if member.isfile():
|
|
168
|
+
total += member.size
|
|
169
|
+
if total > MAX_EXTRACT_BYTES:
|
|
170
|
+
raise ValueError(
|
|
171
|
+
f"can expands to more than {MAX_EXTRACT_BYTES} bytes; "
|
|
172
|
+
"refusing to extract"
|
|
173
|
+
)
|