soup-cli 0.75.1__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.1 → soup_cli-0.75.2}/CHANGELOG.md +22 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/PKG-INFO +15 -22
- {soup_cli-0.75.1 → soup_cli-0.75.2}/README.md +14 -21
- {soup_cli-0.75.1 → soup_cli-0.75.2}/README.tr.md +17 -25
- {soup_cli-0.75.1 → soup_cli-0.75.2}/pyproject.toml +1 -1
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/generate.py +12 -4
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ship.py +25 -14
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/schema.py +16 -1
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/vllm.py +4 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/gate.py +9 -1
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/judge.py +10 -1
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/app.py +18 -3
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/net_guard.py +81 -0
- soup_cli-0.75.2/tests/test_issue616_net_guard_is_shared.py +436 -0
- soup_cli-0.75.2/tests/test_outbound_endpoint_ip_literals.py +734 -0
- soup_cli-0.75.1/tests/test_issue616_net_guard_is_shared.py +0 -208
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.dockerignore +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.gitattributes +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/FUNDING.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/constraints/transformers-floor.txt +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/pull_request_template.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/dependency-drift.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/recipe-repo-ids.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.gitignore +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.mailmap +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/AGENTS.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/CODEOWNERS +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/CONTRIBUTING.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/Dockerfile +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/LICENSE +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/NOTICE +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/SECURITY.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/README.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/bench_validator.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-395-second-stack-vram.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-655-pinned-store-accounting.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-674-quest-w4a4-sft.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-h100-validation.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-qwen4-ple-m4-max.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.0-layer-streaming.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.2-nf4.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.3-breadth.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.4-preference-losses.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.73.1-measured-vram-fit.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.73.2-leg2-scoring.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/bitexact.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/bnb_repro.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/fsdp_sharding_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/issue331_qlora_scope.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/issue395_second_stack_vram.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/mlx_sft_smoke.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/probe-v0.73.0-what-bounds-streaming.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/run-m1-8gb-mlx-sft.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/run-t4-colab-free-tier.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/changelog.d/README.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docker-compose.yml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/README.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/assets/layer-streaming.gif +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/assets/web-ui-new-training.png +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/autodistill.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/commands.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/compliance.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/data.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/evaluation.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/models.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/serving-and-export.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/training.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/README.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/README.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/notebooks/proof-4gb.ipynb +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/assemble_changelog.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/autodistill_b1_hardware_smoke.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/check_recipe_repo_ids.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/generate_recipe_snapshot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/soup.png +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/soup_logo_svg.svg +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/capture.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/contract.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/fingerprints.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/mlx_worker.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/publisher.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/_common.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/lambda_labs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/reward.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/backend_support.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/unknown_keys.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/over_refusal.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/calculator.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/guess_number.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/aider_polyglot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/execution.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/_trl_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_masking.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_optim.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/stream_setup.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/safe_html.js +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/argv_redaction.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_artifact.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_checkpoint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_stream.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_pull.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_shard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream_runtime.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_request_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/oq_affine.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/plotext_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/process_liveness.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_ple.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_stress.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_synth.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/safe_regex.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/seeding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/terminal.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/yaml_limits.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/chat.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/code.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/medical.yaml +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/__init__.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/_windows_ci.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/conftest.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/capture_token.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/consumption_ledger.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/plan.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/shard_manifest.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/student_rollout_capture_token.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/issue204_langfuse_observations_v2_page.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/recipe_config_snapshots.json +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/mcp_roundtrip.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_adapter_trusted_key_backend.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_adapters.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_align_trainable_dtype.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_argv_redaction_bundled_shorts.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_audio.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_audit_log_option_masking.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_autopilot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bco.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bench.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_build_dag.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_callback.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_deploy_target_containment.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_output_control_bytes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_read_limits.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cans.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_chat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_chat_template.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_help_assertions_are_ansi_safe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_startup_is_light.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cloud_output_dir_containment.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_config.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_config_regex_limits.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_contributing_test_counts_are_digit_free.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cost.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_curriculum.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_augment.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_sample.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_split.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_tools.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_demo_bundle_metadata.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_device_map_distributed.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_diff.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_display.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_doctor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_embedding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_errors.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_examples_configs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_export.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_formats.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_generate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_gpu.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_grpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_hub_push_credentials.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_infer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_init.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ipo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue1005_peft021_canonical_names.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue1005_peft021_review_round.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue144_gguf_export.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue204_langfuse_pull.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_display_bridge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_harness_bridge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_val_loss_producer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue264_cloud.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue296_network_transport.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_kwargs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_train.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue302_vision_pad_token.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue304_cross_tokenizer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue308_callback_subclass.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue316_refusal_apostrophe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue316_suites.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue320_lazy_callback_import.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue322_mcp2_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue323_trl_kwarg_drift.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue327_logits_estimate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue330_mix_recipe_train_loadable.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue332_vllm_prompt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue334_fa3_detection.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue336_deepspeed_lora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue339_load_dtype.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue341_seed_and_fullft.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue348_calibrated_logits_wiring.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue349_measured_fit.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue350_fsdp_qlora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue352_fsdp_peft_checkpoint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue353_mlx_seed_warning.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue353_seed_every_task.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue359_deepspeed_guard_coverage.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue360_sglang_prompt_finish_reason.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue367_live_eval_quantization.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue369_canonical_named_parameters.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue372_no_reexec_hint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue373_fsdp_sharding_probe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue374_stream_disk_preflight.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue377_lisa_train_embeddings.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue382_windows_ci_guard_is_shared.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue385_stream_dtype.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue389_torchao_error.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue390_expandable_segments_reason.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue392_mlx_target_keys.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue394_mlx_runtime_isolation.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue401_orphaned_run_reconcile.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue402_restart_capacity.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue404_baseline_scorer_stamp.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue423_mlx_device_detection.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue424_windows_liveness.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue427_qwen35_text_modality.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue433_meta_adapter_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue441_coerce_token_ids.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue443_interleave_wiring.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue459_interleave_streaming_hub.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue477_qwen38_catalog.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue487_changelog_fragments.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue491_frozen_base_load_dtype.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue502_qwen35_transformers5.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue505_launching_window_blocks_restart.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue524_launching_reconcile.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue531_stream_base_provenance.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue532_supervised_token_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue533_offline_hf_materialization.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue534_apple_nvme.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue546_transient_finite_metric.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue549_bon_resume.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue550_bon_offline.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue555_bon_stream_resume.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue563_mps_bf16_training.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue565_grpo_reward_metadata.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue567_grpo_mps_bf16.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue571_qwen4_exp.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue573_qwen4_expert_lora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_capture.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_contract.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_fingerprints.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_mlx_worker.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_publisher.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue599_telemetry_dns_ssrf.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue600_abbreviated_ipv4_ssrf.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue602_qwen4_ple_streaming.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue621_recipe_snapshot.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue623_stream_pin_allocation.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue627_unknown_config_keys.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue633_ansi_in_highlighted_output.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue634_mlx_resume.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue636_torch_floor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue642_sweep_dry_run.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue649_batch_probe_peak_gate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue654_batch_probe_uncovered_branches.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue676_non_dict_messages.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue677_recipe_repo_id_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue681_uld_id_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue682_uld_loss_label_mask.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue683_mlx_response_masking.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue684_mlx_grad_accumulation.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue685_mlx_grad_checkpoint.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue686_mlx_optimizer_schedule.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue687_ui_auth.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue688_ui_drain.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue689_hub_streaming.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue690_embedding_trainer_attrs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue691_sft_packing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue695_validate_agrees_with_loader.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue700_embedding_lora_zero.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue721_ppo_config_forwarding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue723_sequence_gspo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue724_loraplus_optimizer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue724_loraplus_wiring_coverage.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue731_ui_docs_bind.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue748_config_fields_reach_a_consumer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue752_cli_commands_called_as_functions.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue755_backend_support_registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue771_validator_fast_path.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue775_path_containment_ratchet.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue781_inference_bos.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue811_data_validate_exit_codes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue91_aider_eval.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue99_apple_monitor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_judge_key_scoping.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_kto.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_lambda_submit_interrupt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_loader.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_local_request_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_log_level.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_capacity_all_runs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_digest_no_follow.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_execute.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_plan_inputs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_post_spawn_failure.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_merge.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_migrate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mii_serve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_dispatch.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_max_grad_norm.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_modal_stub_outputs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_moe.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_ffd_placement.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_no_foreign_license_headers.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_orpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_packing.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_performance.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_plotext_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ppo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_pretrain.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_profile.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_profiling.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_progress.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_push.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_qat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quant_check.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quickstart.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_qwen35_streaming.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_readme_translation_sync.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipe_count_is_synced.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_registry.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_relora.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_replay.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_requires_python_bound.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_resume.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_rlvr.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_run_cost.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_runs.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_runs_clean_keep_weights.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_safe_regex.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_semantic_split.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_serve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_serve_local_request_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_server_generate.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sglang_trust_contract.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_simpo.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_stream_multi_gpu_guard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sweep.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_telemetry_ssrf.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tracker.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_training_speed.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_transformers_floor_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trl_preference_config_contract.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trl_version_compat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tui.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_rendering_escapes.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_security_headers.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_unsloth.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0420.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0450.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0490.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0510.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0520.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0530.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v05310.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v05311.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0532.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0533.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0534.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0535.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0536.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0537.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0538.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0539.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0540.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0550.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0560.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0580.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0590.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07110.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07111.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07112.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07113.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07114.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07115.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07116.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07117.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07118.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07119.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0712.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07120.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07121.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07122.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07123.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07124.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07125.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07126.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07127.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07128.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07129.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0713.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07130.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07131.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07132.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07133.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07134.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07135.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07136.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07137.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07138.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07139.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0714.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07140.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07141.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07141_telemetry_prompt.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0715.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0716.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0717.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0718.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0719.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07200.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07201.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07202.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07203.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07204.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07300.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07302.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_val_loss_end_to_end.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_validator.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_version_sync.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_vision.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_warmup.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_why.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_windows_encoding.py +0 -0
- {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_yaml_expanded_limit.py +0 -0
|
@@ -12,6 +12,28 @@ 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
|
+
|
|
15
37
|
## [0.75.1] - 2026-09-21
|
|
16
38
|
|
|
17
39
|
### Fixed
|
|
@@ -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,27 +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
|
-
terminate the Lambda instance. The controller was previously killed a quarter of a
|
|
259
|
-
second later, which could leave a paid instance running (Linux/macOS).
|
|
260
|
-
- **Upgrading changes a few defaults.** `soup push --hub modelscope` and `--hub modelers`
|
|
261
|
-
read `MODELSCOPE_API_TOKEN` and `MODELERS_TOKEN` rather than `HF_TOKEN`, so one hub's
|
|
262
|
-
token is never offered to another; and an `https` judge URL whose host is not
|
|
263
|
-
`api.openai.com` is treated as an OpenAI-compatible server and called without
|
|
264
|
-
`OPENAI_API_KEY`.
|
|
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`.
|
|
265
258
|
|
|
266
259
|
> Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
|
|
267
260
|
> crash in the native extension before Soup runs at all.
|
|
@@ -87,27 +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
|
-
terminate the Lambda instance. The controller was previously killed a quarter of a
|
|
105
|
-
second later, which could leave a paid instance running (Linux/macOS).
|
|
106
|
-
- **Upgrading changes a few defaults.** `soup push --hub modelscope` and `--hub modelers`
|
|
107
|
-
read `MODELSCOPE_API_TOKEN` and `MODELERS_TOKEN` rather than `HF_TOKEN`, so one hub's
|
|
108
|
-
token is never offered to another; and an `https` judge URL whose host is not
|
|
109
|
-
`api.openai.com` is treated as an OpenAI-compatible server and called without
|
|
110
|
-
`OPENAI_API_KEY`.
|
|
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`.
|
|
111
104
|
|
|
112
105
|
> Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
|
|
113
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,30 +88,22 @@ yerine altyapıyla boğuşarak geçiriyor. Soup bunu çözer.
|
|
|
88
88
|
|
|
89
89
|
## Yenilikler
|
|
90
90
|
|
|
91
|
-
**v0.75.
|
|
92
|
-
bir
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
Lambda örneğini sonlandırmasını bekliyor. Denetleyici eskiden çeyrek saniye sonra
|
|
108
|
-
öldürülüyordu, bu da ücretli bir örneğin çalışmaya devam etmesine yol açabiliyordu
|
|
109
|
-
(Linux/macOS).
|
|
110
|
-
- **Yükseltmek birkaç varsayılanı değiştiriyor.** `soup push --hub modelscope` ve
|
|
111
|
-
`--hub modelers`, `HF_TOKEN` yerine `MODELSCOPE_API_TOKEN` ve `MODELERS_TOKEN` okuyor;
|
|
112
|
-
böylece bir hub'ın belirteci hiçbir zaman başka bir hub'a sunulmuyor. Ayrıca ana
|
|
113
|
-
makinesi `api.openai.com` olmayan bir `https` yargıç URL'si, OpenAI uyumlu bir sunucu
|
|
114
|
-
olarak kabul edilip `OPENAI_API_KEY` olmadan çağrılıyor.
|
|
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.
|
|
115
107
|
|
|
116
108
|
> Yalnızca Python **3.10–3.12**. 3.13+ sürümlerinde pip, Soup daha hiç çalışmadan yerel
|
|
117
109
|
> eklentide çöken, test edilmemiş PyTorch tekerleklerini çözümlüyordu.
|
|
@@ -710,17 +710,21 @@ def _generate_openai(
|
|
|
710
710
|
|
|
711
711
|
base_url = api_base or "https://api.openai.com/v1"
|
|
712
712
|
|
|
713
|
-
# Validate api_base to prevent SSRF (block non-HTTPS remote URLs
|
|
713
|
+
# Validate api_base to prevent SSRF (block non-HTTPS remote URLs and
|
|
714
|
+
# private / link-local / reserved IP literals; 0.0.0.0 is not loopback)
|
|
714
715
|
if api_base:
|
|
715
716
|
from urllib.parse import urlparse
|
|
716
717
|
|
|
718
|
+
from soup_cli.utils.net_guard import LOOPBACK_HOSTS, refuse_private_ip_literal
|
|
719
|
+
|
|
717
720
|
parsed = urlparse(api_base)
|
|
718
|
-
is_local = parsed.hostname in
|
|
721
|
+
is_local = parsed.hostname in LOOPBACK_HOSTS
|
|
719
722
|
if not is_local and parsed.scheme != "https":
|
|
720
723
|
raise ValueError(
|
|
721
724
|
f"api_base must use HTTPS for remote APIs (got {parsed.scheme}://). "
|
|
722
725
|
"HTTP is only allowed for localhost."
|
|
723
726
|
)
|
|
727
|
+
refuse_private_ip_literal(parsed.hostname, label="api_base")
|
|
724
728
|
|
|
725
729
|
if generation_prompt is None:
|
|
726
730
|
generation_prompt = _build_generation_prompt(prompt, count, fmt, seed_examples)
|
|
@@ -849,21 +853,25 @@ def _generate_server(
|
|
|
849
853
|
|
|
850
854
|
base_url = api_base or "http://localhost:8000/v1"
|
|
851
855
|
|
|
852
|
-
# Validate api_base to prevent SSRF — only allow http/https, block remote
|
|
856
|
+
# Validate api_base to prevent SSRF — only allow http/https, block remote
|
|
857
|
+
# non-HTTPS and private / link-local / reserved IP literals
|
|
853
858
|
if api_base:
|
|
854
859
|
from urllib.parse import urlparse
|
|
855
860
|
|
|
861
|
+
from soup_cli.utils.net_guard import LOOPBACK_HOSTS, refuse_private_ip_literal
|
|
862
|
+
|
|
856
863
|
parsed = urlparse(api_base)
|
|
857
864
|
if parsed.scheme not in ("http", "https"):
|
|
858
865
|
raise ValueError(
|
|
859
866
|
f"api_base must use HTTP or HTTPS scheme (got {parsed.scheme}://)"
|
|
860
867
|
)
|
|
861
|
-
is_local = parsed.hostname in
|
|
868
|
+
is_local = parsed.hostname in LOOPBACK_HOSTS
|
|
862
869
|
if not is_local and parsed.scheme != "https":
|
|
863
870
|
raise ValueError(
|
|
864
871
|
f"api_base must use HTTPS for remote APIs (got {parsed.scheme}://). "
|
|
865
872
|
"HTTP is only allowed for localhost."
|
|
866
873
|
)
|
|
874
|
+
refuse_private_ip_literal(parsed.hostname, label="api_base")
|
|
867
875
|
|
|
868
876
|
# Strip trailing /v1 if present (we add it to the endpoint path)
|
|
869
877
|
base_url = base_url.rstrip("/")
|
|
@@ -167,12 +167,22 @@ def _validate_judge_model_url(url: str) -> None:
|
|
|
167
167
|
"""SSRF guard for --judge-model: urlparse hostname check (not startswith).
|
|
168
168
|
|
|
169
169
|
Blocks the ``http://localhost.attacker.com`` prefix-bypass that a bare
|
|
170
|
-
``startswith("http://localhost")`` check would allow through
|
|
170
|
+
``startswith("http://localhost")`` check would allow through, and refuses a
|
|
171
|
+
private / link-local / reserved IP literal as a usage error before any
|
|
172
|
+
measurement runs.
|
|
171
173
|
"""
|
|
172
174
|
from urllib.parse import urlparse
|
|
173
175
|
|
|
176
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
177
|
+
|
|
174
178
|
parsed = urlparse(url)
|
|
175
|
-
if parsed.scheme
|
|
179
|
+
if parsed.scheme == "ollama":
|
|
180
|
+
return
|
|
181
|
+
if parsed.scheme == "https":
|
|
182
|
+
try:
|
|
183
|
+
refuse_private_ip_literal(parsed.hostname, label="--judge-model")
|
|
184
|
+
except ValueError as exc:
|
|
185
|
+
_fail(str(exc), _EXIT_USAGE)
|
|
176
186
|
return
|
|
177
187
|
if parsed.scheme == "http" and parsed.hostname in ("localhost", "127.0.0.1"):
|
|
178
188
|
return
|
|
@@ -1004,21 +1014,22 @@ def _verdict_live(
|
|
|
1004
1014
|
# would be an unbounded number of full model passes.
|
|
1005
1015
|
noise_floor_runs = _validate_noise_floor_flag(noise_floor_runs)
|
|
1006
1016
|
|
|
1017
|
+
# Judge modes need a judge model. Validate it BEFORE the base and tuned
|
|
1018
|
+
# models load and before the noise floor is measured (it scores the leg-1
|
|
1019
|
+
# task axis through the judge as well, #403) — a missing or refused judge
|
|
1020
|
+
# URL is a usage error, not a runtime one discovered after a model load.
|
|
1021
|
+
if task_mode == "judge_score":
|
|
1022
|
+
if not judge_model:
|
|
1023
|
+
_fail("--task-mode judge_score needs --judge-model <url>", _EXIT_USAGE)
|
|
1024
|
+
_validate_judge_model_url(judge_model)
|
|
1025
|
+
elif task_mode == "pairwise":
|
|
1026
|
+
if not judge_model:
|
|
1027
|
+
_fail("--task-mode pairwise needs --judge-model <url>", _EXIT_USAGE)
|
|
1028
|
+
_validate_judge_model_url(judge_model)
|
|
1029
|
+
|
|
1007
1030
|
tuned_id = tuned if tuned else base
|
|
1008
1031
|
try:
|
|
1009
1032
|
base_gen, tuned_gen = _resolve_generators(base, tuned, adapter, device, quantization)
|
|
1010
|
-
# Judge modes need a judge model. Validate it BEFORE measuring the
|
|
1011
|
-
# noise floor, which now scores the leg-1 task axis through the judge as
|
|
1012
|
-
# well (#403) — a missing / malformed judge is a usage error (exit 2),
|
|
1013
|
-
# not a runtime one discovered mid-measurement.
|
|
1014
|
-
if task_mode == "judge_score":
|
|
1015
|
-
if not judge_model:
|
|
1016
|
-
_fail("--task-mode judge_score needs --judge-model <url>", _EXIT_USAGE)
|
|
1017
|
-
_validate_judge_model_url(judge_model)
|
|
1018
|
-
elif task_mode == "pairwise":
|
|
1019
|
-
if not judge_model:
|
|
1020
|
-
_fail("--task-mode pairwise needs --judge-model <url>", _EXIT_USAGE)
|
|
1021
|
-
_validate_judge_model_url(judge_model)
|
|
1022
1033
|
|
|
1023
1034
|
measured_floor: Optional[NoiseFloor] = None
|
|
1024
1035
|
if noise_floor_runs is not None:
|
|
@@ -1449,7 +1449,12 @@ class TrainingConfig(BaseModel):
|
|
|
1449
1449
|
@field_validator("online_dpo_judge", mode="before")
|
|
1450
1450
|
@classmethod
|
|
1451
1451
|
def _validate_online_dpo_judge_field(cls, value: Any) -> Optional[str]:
|
|
1452
|
-
"""v0.71.31 — shape
|
|
1452
|
+
"""v0.71.31 — shape validation; the full SSRF policy runs at trainer setup.
|
|
1453
|
+
|
|
1454
|
+
A private / link-local / reserved IP literal in an http(s) judge URL is
|
|
1455
|
+
refused here as well, so a shared soup.yaml naming one fails at load
|
|
1456
|
+
instead of after the model download.
|
|
1457
|
+
"""
|
|
1453
1458
|
if value is None:
|
|
1454
1459
|
return None
|
|
1455
1460
|
if isinstance(value, bool) or not isinstance(value, str):
|
|
@@ -1462,6 +1467,16 @@ class TrainingConfig(BaseModel):
|
|
|
1462
1467
|
raise ValueError("online_dpo_judge must not contain null bytes")
|
|
1463
1468
|
if len(value) > 512:
|
|
1464
1469
|
raise ValueError("online_dpo_judge must be <= 512 chars")
|
|
1470
|
+
from urllib.parse import urlparse
|
|
1471
|
+
|
|
1472
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
1473
|
+
|
|
1474
|
+
try:
|
|
1475
|
+
parsed = urlparse(value)
|
|
1476
|
+
except ValueError as exc:
|
|
1477
|
+
raise ValueError("online_dpo_judge is not a valid URL") from exc
|
|
1478
|
+
if parsed.scheme in ("http", "https"):
|
|
1479
|
+
refuse_private_ip_literal(parsed.hostname, label="online_dpo_judge")
|
|
1465
1480
|
return value
|
|
1466
1481
|
|
|
1467
1482
|
# v0.71.32 — ASR (Whisper) fine-tuning knobs.
|
|
@@ -18,9 +18,12 @@ def validate_vllm_url(base_url: str) -> None:
|
|
|
18
18
|
Reuses the same validation as the server provider:
|
|
19
19
|
- Scheme must be http or https
|
|
20
20
|
- HTTP is only allowed for localhost
|
|
21
|
+
- A private / link-local / reserved IP literal is refused on any scheme
|
|
21
22
|
|
|
22
23
|
Raises ValueError if validation fails.
|
|
23
24
|
"""
|
|
25
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
26
|
+
|
|
24
27
|
parsed = urlparse(base_url)
|
|
25
28
|
if parsed.scheme not in ("http", "https"):
|
|
26
29
|
raise ValueError(
|
|
@@ -36,6 +39,7 @@ def validate_vllm_url(base_url: str) -> None:
|
|
|
36
39
|
f"vLLM URL must use HTTPS for remote servers (got {parsed.scheme}://). "
|
|
37
40
|
"HTTP is only allowed for localhost."
|
|
38
41
|
)
|
|
42
|
+
refuse_private_ip_literal(parsed.hostname, label="vLLM URL")
|
|
39
43
|
|
|
40
44
|
|
|
41
45
|
def generate_vllm(
|
|
@@ -94,7 +94,15 @@ class GateTask(BaseModel):
|
|
|
94
94
|
# Allowlist of schemes — SSRF hardening consistent with the project.
|
|
95
95
|
parsed = urlparse(value)
|
|
96
96
|
|
|
97
|
-
if parsed.scheme
|
|
97
|
+
if parsed.scheme == "ollama":
|
|
98
|
+
return value
|
|
99
|
+
|
|
100
|
+
if parsed.scheme == "https":
|
|
101
|
+
# A private IP literal is refused when the suite is parsed, so a
|
|
102
|
+
# suite file cannot name one any more than --judge-model can.
|
|
103
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
104
|
+
|
|
105
|
+
refuse_private_ip_literal(parsed.hostname, label="judge_model URL")
|
|
98
106
|
return value
|
|
99
107
|
|
|
100
108
|
if (parsed.scheme == "http" and parsed.hostname in {"localhost", "127.0.0.1"}):
|
|
@@ -127,10 +127,17 @@ def load_rubric(path: Path) -> dict:
|
|
|
127
127
|
|
|
128
128
|
|
|
129
129
|
def validate_judge_api_base(api_base: Optional[str]) -> None:
|
|
130
|
-
"""SSRF protection for judge API base URL.
|
|
130
|
+
"""SSRF protection for judge API base URL.
|
|
131
|
+
|
|
132
|
+
``JudgeEvaluator`` calls this when it is constructed, so every judge it
|
|
133
|
+
builds is checked, whether the URL came from ``--api-base`` or from a
|
|
134
|
+
config file.
|
|
135
|
+
"""
|
|
131
136
|
if api_base is None:
|
|
132
137
|
return
|
|
133
138
|
|
|
139
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
140
|
+
|
|
134
141
|
parsed = urlparse(api_base)
|
|
135
142
|
if parsed.scheme not in ("http", "https"):
|
|
136
143
|
raise ValueError(
|
|
@@ -146,6 +153,8 @@ def validate_judge_api_base(api_base: Optional[str]) -> None:
|
|
|
146
153
|
"HTTP is only allowed for localhost. "
|
|
147
154
|
"Use HTTPS for remote URLs."
|
|
148
155
|
)
|
|
156
|
+
# ...and no private / link-local / reserved IP literal on either scheme.
|
|
157
|
+
refuse_private_ip_literal(parsed.hostname, label="judge URL")
|
|
149
158
|
|
|
150
159
|
|
|
151
160
|
def _build_judge_prompt(
|
|
@@ -944,17 +944,26 @@ def create_app(host: str = "127.0.0.1", port: int = 7860):
|
|
|
944
944
|
|
|
945
945
|
from fastapi.responses import StreamingResponse
|
|
946
946
|
|
|
947
|
+
from soup_cli.utils.net_guard import refuse_private_ip_literal
|
|
948
|
+
|
|
947
949
|
# Validate messages
|
|
948
950
|
if not req.messages:
|
|
949
951
|
raise HTTPException(status_code=400, detail="messages cannot be empty")
|
|
950
952
|
|
|
951
|
-
# SSRF protection: localhost-only HTTP, HTTPS for remote
|
|
952
|
-
|
|
953
|
+
# SSRF protection: localhost-only HTTP, HTTPS for remote, and no
|
|
954
|
+
# private / link-local / reserved IP literal on either scheme.
|
|
955
|
+
# 0.0.0.0 is the bind-any wildcard, not a loopback address.
|
|
956
|
+
try:
|
|
957
|
+
parsed = urlparse(req.endpoint)
|
|
958
|
+
except ValueError:
|
|
959
|
+
# e.g. an unbalanced or non-IPv6 bracketed host: a bad request,
|
|
960
|
+
# not a server error.
|
|
961
|
+
raise HTTPException(status_code=400, detail="endpoint is not a valid URL") from None
|
|
953
962
|
if parsed.scheme == "http":
|
|
954
963
|
import ipaddress as _ipaddr
|
|
955
964
|
|
|
956
965
|
host = parsed.hostname or ""
|
|
957
|
-
is_local = host
|
|
966
|
+
is_local = host == "localhost"
|
|
958
967
|
if not is_local:
|
|
959
968
|
try:
|
|
960
969
|
addr = _ipaddr.ip_address(host)
|
|
@@ -971,6 +980,12 @@ def create_app(host: str = "127.0.0.1", port: int = 7860):
|
|
|
971
980
|
status_code=400,
|
|
972
981
|
detail="Only HTTP (localhost) or HTTPS endpoints allowed",
|
|
973
982
|
)
|
|
983
|
+
try:
|
|
984
|
+
refuse_private_ip_literal(parsed.hostname, label="endpoint")
|
|
985
|
+
except ValueError as exc:
|
|
986
|
+
# The message is fixed text (the label is a constant); the
|
|
987
|
+
# endpoint itself is never echoed back.
|
|
988
|
+
raise HTTPException(status_code=400, detail=str(exc)) from None
|
|
974
989
|
|
|
975
990
|
# Validate bounds
|
|
976
991
|
if req.max_tokens > 16384:
|
|
@@ -46,6 +46,33 @@ import ipaddress
|
|
|
46
46
|
LOOPBACK_HOSTS = frozenset({"localhost", "127.0.0.1", "::1"})
|
|
47
47
|
|
|
48
48
|
|
|
49
|
+
def _ascii_spellings(host: str) -> list[str]:
|
|
50
|
+
"""``host`` plus the ASCII forms an HTTP client may turn it into.
|
|
51
|
+
|
|
52
|
+
A client IDNA-encodes a non-ASCII host before it resolves it: urllib and
|
|
53
|
+
:mod:`socket` through the stdlib codec (IDNA 2003, whose nameprep step
|
|
54
|
+
NFKC-folds and drops characters such as the soft hyphen), httpx through the
|
|
55
|
+
``idna`` package (IDNA 2008). Both treat U+3002, U+FF0E and U+FF61 as label
|
|
56
|
+
separators, so text that is not an IP literal as written -- ``10.0.0.1``
|
|
57
|
+
with U+3002 IDEOGRAPHIC FULL STOP in place of each dot, for instance -- can
|
|
58
|
+
be one once encoded. A form that fails to encode is skipped.
|
|
59
|
+
"""
|
|
60
|
+
if host.isascii():
|
|
61
|
+
return [host]
|
|
62
|
+
spellings = [host]
|
|
63
|
+
try:
|
|
64
|
+
spellings.append(host.encode("idna").decode("ascii"))
|
|
65
|
+
except UnicodeError:
|
|
66
|
+
pass
|
|
67
|
+
try:
|
|
68
|
+
import idna # noqa: PLC0415 — the encoder httpx uses; optional here
|
|
69
|
+
|
|
70
|
+
spellings.append(idna.encode(host.lower()).decode("ascii"))
|
|
71
|
+
except (ImportError, UnicodeError): # idna.IDNAError is a UnicodeError
|
|
72
|
+
pass
|
|
73
|
+
return spellings
|
|
74
|
+
|
|
75
|
+
|
|
49
76
|
def parse_ip_literal(host: str) -> ipaddress.IPv4Address | ipaddress.IPv6Address | None:
|
|
50
77
|
"""Parse ``host`` as an IP literal, or ``None`` if it isn't one.
|
|
51
78
|
|
|
@@ -55,7 +82,22 @@ def parse_ip_literal(host: str) -> ipaddress.IPv4Address | ipaddress.IPv6Address
|
|
|
55
82
|
library :func:`socket.inet_aton`. The latter is a pure in-process
|
|
56
83
|
string parser — no DNS lookup is performed. A hostname (``"localhost"``,
|
|
57
84
|
``"evil.example.com"``) returns ``None`` rather than being resolved.
|
|
85
|
+
|
|
86
|
+
A non-ASCII host is also read in the ASCII forms a client would connect to
|
|
87
|
+
(see :func:`_ascii_spellings`), and the first form that is an IP literal is
|
|
88
|
+
returned, so ``10.0.0.1`` written with ideographic full stops parses as
|
|
89
|
+
``10.0.0.1``.
|
|
58
90
|
"""
|
|
91
|
+
for spelling in _ascii_spellings(host):
|
|
92
|
+
addr = _parse_ascii_ip_literal(spelling)
|
|
93
|
+
if addr is not None:
|
|
94
|
+
return addr
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _parse_ascii_ip_literal(
|
|
99
|
+
host: str,
|
|
100
|
+
) -> ipaddress.IPv4Address | ipaddress.IPv6Address | None:
|
|
59
101
|
import socket # noqa: PLC0415 — lazy import (stdlib, negligible cost)
|
|
60
102
|
|
|
61
103
|
clean_host = host.rstrip(".")
|
|
@@ -77,6 +119,13 @@ def is_private_or_link_local(host: str) -> bool:
|
|
|
77
119
|
multicast / unspecified IP — the union of every guard's policy in this
|
|
78
120
|
repo, since consolidating stops being safe the moment a caller's
|
|
79
121
|
predicate is quietly narrower than the shared one it now uses.
|
|
122
|
+
|
|
123
|
+
Also any address ``ipaddress`` does not consider globally reachable
|
|
124
|
+
(``not is_global``) — that adds RFC 6598 shared address space,
|
|
125
|
+
``100.64.0.0/10``, which is neither ``is_private`` nor ``is_global`` —
|
|
126
|
+
and the deprecated IPv6 site-local block ``fec0::/10``, which
|
|
127
|
+
``ipaddress`` still reports as global. ``is_reserved`` stays: NAT64
|
|
128
|
+
``64:ff9b::/96`` IS ``is_global``.
|
|
80
129
|
"""
|
|
81
130
|
addr = parse_ip_literal(host)
|
|
82
131
|
if addr is None:
|
|
@@ -91,4 +140,36 @@ def is_private_or_link_local(host: str) -> bool:
|
|
|
91
140
|
or addr.is_unspecified
|
|
92
141
|
or addr.is_reserved
|
|
93
142
|
or addr.is_multicast
|
|
143
|
+
or not addr.is_global
|
|
144
|
+
or getattr(addr, "is_site_local", False)
|
|
94
145
|
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def refuse_private_ip_literal(host: str | None, *, label: str) -> None:
|
|
149
|
+
"""Raise ``ValueError`` if an outbound endpoint's host is a non-public IP.
|
|
150
|
+
|
|
151
|
+
``host`` is a URL's ``hostname``. It is refused when it is an IP literal, in
|
|
152
|
+
any spelling :func:`parse_ip_literal` accepts (IPv4-mapped IPv6 included),
|
|
153
|
+
that :func:`is_private_or_link_local` classifies as non-public, on every
|
|
154
|
+
scheme. Loopback stays allowed, because a server on the same machine
|
|
155
|
+
(Ollama, vLLM, ``soup serve``) is a supported target. A hostname passes
|
|
156
|
+
unchanged and is NOT resolved, so this narrows which addresses a URL can
|
|
157
|
+
name directly; it does not make internal services unreachable by name. An
|
|
158
|
+
empty or missing host passes too: the caller's scheme check owns that case.
|
|
159
|
+
``label`` names the setting in the message.
|
|
160
|
+
"""
|
|
161
|
+
clean = (host or "").strip().lower().rstrip(".")
|
|
162
|
+
if clean.startswith("[") and clean.endswith("]"):
|
|
163
|
+
clean = clean[1:-1]
|
|
164
|
+
if not clean or clean in LOOPBACK_HOSTS:
|
|
165
|
+
return
|
|
166
|
+
addr = parse_ip_literal(clean)
|
|
167
|
+
if addr is None:
|
|
168
|
+
return
|
|
169
|
+
mapped = getattr(addr, "ipv4_mapped", None)
|
|
170
|
+
if (mapped if mapped is not None else addr).is_loopback:
|
|
171
|
+
return
|
|
172
|
+
if is_private_or_link_local(clean):
|
|
173
|
+
raise ValueError(
|
|
174
|
+
f"{label}: private/link-local/reserved IP hosts are not allowed (SSRF protection)"
|
|
175
|
+
)
|