soup-cli 0.71.26__tar.gz → 0.71.28__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.71.26 → soup_cli-0.71.28}/CHANGELOG.md +105 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/CONTRIBUTING.md +3 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/CONTRIBUTORS.md +6 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/PKG-INFO +24 -16
- {soup_cli-0.71.26 → soup_cli-0.71.28}/README.md +19 -15
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/commands.md +40 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/data.md +46 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/pyproject.toml +7 -3
- soup_cli-0.71.28/src/soup_cli/__init__.py +3 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/schema.py +4 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cli.py +17 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cloud/modal.py +6 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0550.py +31 -2
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/bench.py +5 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data.py +18 -12
- soup_cli-0.71.28/src/soup_cli/commands/data_doctor.py +337 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/diagnose.py +21 -6
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/eval.py +31 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/export.py +8 -8
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/fetch.py +4 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/generate.py +20 -5
- soup_cli-0.71.28/src/soup_cli/commands/mcp.py +62 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/serve.py +38 -7
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/train.py +177 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/formats.py +43 -9
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/loader.py +6 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/parsers.py +4 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/checkpoint_intelligence.py +6 -4
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/custom.py +4 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/gate.py +41 -29
- soup_cli-0.71.28/src/soup_cli/mcp_server/__init__.py +9 -0
- soup_cli-0.71.28/src/soup_cli/mcp_server/registry.py +924 -0
- soup_cli-0.71.28/src/soup_cli/mcp_server/server.py +82 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/common.py +8 -8
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/callback.py +87 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/store.py +39 -8
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/bco.py +7 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/classifier.py +1 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/distill.py +36 -13
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/dpo.py +7 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/embedding.py +1 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/grpo.py +10 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/ipo.py +11 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/kto.py +7 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/orpo.py +7 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/ppo.py +32 -12
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/pretrain.py +1 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/reward_model.py +1 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/sft.py +44 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/simpo.py +7 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/app.py +12 -7
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/active_sampler.py +7 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/block_expansion.py +15 -4
- soup_cli-0.71.28/src/soup_cli/utils/data_doctor.py +927 -0
- soup_cli-0.71.28/src/soup_cli/utils/data_lint.py +484 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_pipeline.py +47 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deploy_measure.py +26 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_kernels.py +4 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_gate_hook.py +2 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gguf_quant.py +9 -4
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/license_matrix.py +5 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_stages.py +6 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mod.py +140 -16
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/namespace_pin.py +24 -8
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ollama.py +6 -6
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/preference_combine.py +56 -5
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/registry.py +4 -2
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reward_hack_control.py +13 -6
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/rl_checkpoint.py +41 -1
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sglang.py +5 -2
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/terraform_plan.py +17 -2
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/webhooks.py +23 -7
- soup_cli-0.71.28/tests/test_code_review_critical.py +334 -0
- soup_cli-0.71.28/tests/test_code_review_deferred.py +177 -0
- soup_cli-0.71.28/tests/test_code_review_high.py +413 -0
- soup_cli-0.71.28/tests/test_code_review_medium_low.py +97 -0
- soup_cli-0.71.28/tests/test_code_review_recurring.py +110 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval_gate.py +12 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_a_wave1.py +7 -0
- soup_cli-0.71.28/tests/test_trainer_init.py +1230 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0560.py +8 -3
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07126.py +7 -2
- soup_cli-0.71.28/tests/test_v07127.py +2190 -0
- soup_cli-0.71.28/tests/test_v07128.py +938 -0
- soup_cli-0.71.26/src/soup_cli/__init__.py +0 -3
- soup_cli-0.71.26/tests/test_trainer_init.py +0 -160
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.dockerignore +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.gitignore +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.mailmap +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/AGENTS.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/CODEOWNERS +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/Dockerfile +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/LICENSE +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/NOTICE +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/SECURITY.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docker-compose.yml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/README.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/evaluation.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/models.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/training.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/README.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/soup.png +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/schema.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/chat.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/code.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/medical.yaml +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/__init__.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/conftest.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_audio.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bco.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bench.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_callback.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cans.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_chat.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cli.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_config.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cost.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_diff.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_display.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_errors.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_export.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_formats.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_generate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_infer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_init.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_kto.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_loader.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_merge.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_moe.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_packing.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_performance.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_profile.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_progress.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_push.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_qat.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_registry.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_relora.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_replay.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_resume.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_runs.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_serve.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tui.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07123.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07124.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07125.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_validator.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_vision.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_warmup.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_why.py +0 -0
- {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,111 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.28] - 2026-07-04
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **MCP server (`soup mcp serve`)** — drive Soup from any Model Context Protocol
|
|
19
|
+
client (Claude Code / Cursor / Cline / Continue) over stdio. No fine-tuning
|
|
20
|
+
CLI ships an MCP server. Exposes 14 read-only tools as JSON — `advise`,
|
|
21
|
+
`data_inspect` / `data_validate` / `data_score` / `data_doctor`,
|
|
22
|
+
`recipes_search` / `recipes_show`, `runs_list` / `runs_show`,
|
|
23
|
+
`registry_list` / `registry_show`, `profile`, `diagnose_evidence`,
|
|
24
|
+
`ship_evidence` — plus two **plan-only** mutating tools (`train_start`,
|
|
25
|
+
`export`) gated behind `--allow-mutating` (they render the exact command that
|
|
26
|
+
would run; they never execute). The official `mcp` SDK is behind a new
|
|
27
|
+
`[mcp]` extra (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI
|
|
28
|
+
stays light. Security: stdio-only (no network listener); every path argument
|
|
29
|
+
re-enters cwd-containment + symlink rejection; output is control-char
|
|
30
|
+
sanitized; errors are path-free; string / size / int bounds enforced.
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
- The DPO / IPO / KTO / BCO trainers now apply configured vocabulary expansion
|
|
34
|
+
(`data.add_new_tokens` / `data.new_special_tokens`) via the shared
|
|
35
|
+
`apply_vocab_expansion()` helper during setup, consistent with the SFT path —
|
|
36
|
+
they previously ignored it. Closes #292
|
|
37
|
+
([#293](https://github.com/MakazhanAlpamys/Soup/pull/293) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
|
|
38
|
+
- The ORPO / SimPO / GRPO trainers now also apply configured vocabulary
|
|
39
|
+
expansion via the shared `apply_vocab_expansion()` helper — completing
|
|
40
|
+
consistent vocab-expansion behavior across every SFT/preference/RL trainer.
|
|
41
|
+
Closes #294
|
|
42
|
+
([#295](https://github.com/MakazhanAlpamys/Soup/pull/295) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
|
|
43
|
+
|
|
44
|
+
## [0.71.27] - 2026-07-03
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
- **Fine-tune Doctor** — kill the top *silent* fine-tune failures before a
|
|
48
|
+
single training step; no competitor (Unsloth/Axolotl/LlamaFactory) ships
|
|
49
|
+
any of these three:
|
|
50
|
+
- `soup data doctor <data> --model <id|path>` — chat-template
|
|
51
|
+
compatibility report over 8 checks: `chat_template` present,
|
|
52
|
+
`template_render`s cleanly, has `{% generation %}` markers,
|
|
53
|
+
`eos_in_labels` (the **#1 "model never stops generating" bug** — every
|
|
54
|
+
assistant turn's trained span must actually contain an EOS/EOT token;
|
|
55
|
+
checks every turn, not just the last), `bos_duplication` (template +
|
|
56
|
+
tokenizer both prepending BOS), `system_role` support (Mistral-style
|
|
57
|
+
templates reject a leading system turn), `unknown_roles`, and
|
|
58
|
+
`truncation_risk` (p95 rendered length vs `max_length`). Same OK / MINOR
|
|
59
|
+
/ MAJOR taxonomy as `soup diagnose`; exit 0 = OK/MINOR, exit 2 = MAJOR.
|
|
60
|
+
`--train-on-responses-only` / `--train-on-messages-with-train-field`
|
|
61
|
+
select the same masking strategy `soup train` would use, so the report
|
|
62
|
+
and `--show-mask` never disagree about what's actually trained.
|
|
63
|
+
- `soup data doctor ... --show-mask N` — render N sample rows with
|
|
64
|
+
per-token trained/masked colouring through the REAL collator path
|
|
65
|
+
(answer-only / per-message-train-field / RAFT span-mask) — not a
|
|
66
|
+
reimplementation — so an assistant-mask bug is visible instantly.
|
|
67
|
+
- `soup data lint <data>` — preference-data linter for
|
|
68
|
+
dpo/orpo/simpo/ipo/bco/kto: `length_bias` (chosen systematically longer
|
|
69
|
+
than rejected — the **#1 silent DPO degradation**, reported as a
|
|
70
|
+
Cohen's d effect size), `label_imbalance` (KTO desirable:undesirable
|
|
71
|
+
ratio), `near_duplicates` (MinHash/LSH, reuses the `soup data dedup`
|
|
72
|
+
kernel), `identical_pairs` (chosen == rejected — zero preference
|
|
73
|
+
signal), and `prompt_leak` (the prompt echoed verbatim inside the
|
|
74
|
+
completion — a common synthetic-data pipeline bug). Optional `--model`
|
|
75
|
+
for exact token-length bias (default: word count).
|
|
76
|
+
- Validated live against the real `HuggingFaceTB/SmolLM2-135M-Instruct`
|
|
77
|
+
tokenizer on Windows + RTX 3050 — this smoke pass found and fixed two
|
|
78
|
+
genuine bugs beyond what synthetic fixtures alone caught: an EOS check
|
|
79
|
+
that required the EOS token to be the *literal last* trained token
|
|
80
|
+
(real templates often have a trailing formatting token after the
|
|
81
|
+
closing tag that stays inside the trained span), and two call sites
|
|
82
|
+
that only caught `(ValueError, TypeError)` around a tokenizer's
|
|
83
|
+
`apply_chat_template` when a real Jinja `raise_exception()`
|
|
84
|
+
(Mistral-style no-system-role guard) raises
|
|
85
|
+
`jinja2.exceptions.TemplateError`.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
- Harden `commands/diagnose.py`'s `--evidence` loader against a TOCTOU
|
|
89
|
+
symlink swap: opens with `O_NOFOLLOW` and size-checks the open fd via
|
|
90
|
+
`os.fstat` instead of `os.path.getsize` on the path before the open —
|
|
91
|
+
backports the hardened loader shipped for `soup ship` in v0.71.25 (closes
|
|
92
|
+
v0.71.25 known-limitation (4)).
|
|
93
|
+
- Harden judge-model URL validation against a hostname prefix bypass
|
|
94
|
+
(`http://localhost.attacker.com`) — `GateTask._valid_judge_url` /
|
|
95
|
+
`_parse_judge_url` now use `urllib.parse.urlparse` + hostname checks instead
|
|
96
|
+
of `startswith`. Closes #283
|
|
97
|
+
([#288](https://github.com/MakazhanAlpamys/Soup/pull/288) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
|
|
98
|
+
- `SFTTrainerWrapper` now applies configured vocabulary expansion
|
|
99
|
+
(`data.add_new_tokens` / `data.new_special_tokens`) and resizes the model
|
|
100
|
+
embeddings during initialization — previously these fields were accepted by
|
|
101
|
+
the schema but silently ignored. Closes #289
|
|
102
|
+
([#287](https://github.com/MakazhanAlpamys/Soup/pull/287) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
|
|
103
|
+
- Vision and audio SFT paths now apply that same configured vocabulary
|
|
104
|
+
expansion (`data.add_new_tokens` / `data.new_special_tokens`) via the shared
|
|
105
|
+
`apply_vocab_expansion()` helper, consistent with the text SFT path — they
|
|
106
|
+
previously ignored it. Closes #290
|
|
107
|
+
([#291](https://github.com/MakazhanAlpamys/Soup/pull/291) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
|
|
108
|
+
|
|
109
|
+
### Security
|
|
110
|
+
- `soup data doctor` strips C0 control characters (keeping tab/newline/CR)
|
|
111
|
+
from dataset-derived content before it reaches the terminal — Rich's
|
|
112
|
+
`markup.escape()` only neutralises `[...]` tag syntax, not raw escape
|
|
113
|
+
sequences, so an untrusted training row (e.g. an unknown `role` field, or
|
|
114
|
+
`--show-mask`'s decoded token text on a byte-level BPE tokenizer) could
|
|
115
|
+
otherwise carry a literal ESC byte through to the terminal (title-bar /
|
|
116
|
+
OSC-8 link spoofing, or obscuring a MAJOR verdict via cursor tricks).
|
|
117
|
+
`--output` JSON is unaffected (`json.dumps` already escapes control
|
|
118
|
+
characters).
|
|
119
|
+
|
|
15
120
|
## [0.71.26] - 2026-07-01
|
|
16
121
|
|
|
17
122
|
### Added
|
|
@@ -116,11 +116,11 @@ src/soup_cli/
|
|
|
116
116
|
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
|
|
117
117
|
data/traces/ - Trace-to-Preference harvester (v0.26.0)
|
|
118
118
|
data/collators.py - CrossDocCollator for sample packing (v0.33.0)
|
|
119
|
-
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict
|
|
119
|
+
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint
|
|
120
120
|
templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
|
|
121
121
|
ui/ - Web UI (FastAPI + HTML/JS SPA)
|
|
122
122
|
|
|
123
|
-
tests/ - Test suite (
|
|
123
|
+
tests/ - Test suite (305 files, 15140 tests)
|
|
124
124
|
examples/ - Real-world config examples and datasets
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -150,7 +150,7 @@ pytest tests/test_data.py::test_detect_alpaca_format -v
|
|
|
150
150
|
pytest tests/ --cov=soup_cli --cov-report=html
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
### Test Files (
|
|
153
|
+
### Test Files (305 files)
|
|
154
154
|
|
|
155
155
|
> A representative sample of the suite below. The full table lives in
|
|
156
156
|
> [`.claude/CLAUDE.md`](.claude/CLAUDE.md); run `pytest tests/ -v` for the complete list.
|
|
@@ -44,6 +44,12 @@ Listed by first contribution. PR numbers link the work.
|
|
|
44
44
|
- Unit tests for the `warmup.py` auto-warmup-steps helper ([#274](https://github.com/MakazhanAlpamys/Soup/pull/274))
|
|
45
45
|
- **Kondamwar Akshaya Shrikant** ([@Akshaya-reddy18](https://github.com/Akshaya-reddy18))
|
|
46
46
|
- Friendlier error messages — richer CUDA-OOM hint + Hugging Face gated-repo and `trust_remote_code` mappings + tests ([#282](https://github.com/MakazhanAlpamys/Soup/pull/282))
|
|
47
|
+
- **Darsh** ([@CODING-DARSH](https://github.com/CODING-DARSH))
|
|
48
|
+
- Harden judge-URL validation against hostname prefix bypass (`startswith` → `urlparse`) in `eval/gate.py` ([#288](https://github.com/MakazhanAlpamys/Soup/pull/288))
|
|
49
|
+
- Apply configured vocabulary expansion (`data.add_new_tokens` / `new_special_tokens`) during SFT trainer init ([#287](https://github.com/MakazhanAlpamys/Soup/pull/287))
|
|
50
|
+
- Reuse the shared vocab-expansion helper in the vision + audio SFT paths ([#291](https://github.com/MakazhanAlpamys/Soup/pull/291))
|
|
51
|
+
- Honor configured vocab expansion in the DPO / IPO / KTO / BCO trainers ([#293](https://github.com/MakazhanAlpamys/Soup/pull/293))
|
|
52
|
+
- Honor configured vocab expansion in the ORPO / SimPO / GRPO trainers ([#295](https://github.com/MakazhanAlpamys/Soup/pull/295))
|
|
47
53
|
|
|
48
54
|
---
|
|
49
55
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.71.
|
|
3
|
+
Version: 0.71.28
|
|
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
|
|
@@ -29,6 +29,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'all'
|
|
|
29
29
|
Requires-Dist: datasets>=2.14.0; extra == 'all'
|
|
30
30
|
Requires-Dist: datasketch>=1.6.0; extra == 'all'
|
|
31
31
|
Requires-Dist: fastapi>=0.104.0; extra == 'all'
|
|
32
|
+
Requires-Dist: mcp>=1.2.0; extra == 'all'
|
|
32
33
|
Requires-Dist: peft>=0.7.0; extra == 'all'
|
|
33
34
|
Requires-Dist: torch>=2.0.0; extra == 'all'
|
|
34
35
|
Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'all'
|
|
@@ -60,6 +61,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'dev'
|
|
|
60
61
|
Requires-Dist: cryptography>=41.0.0; extra == 'dev'
|
|
61
62
|
Requires-Dist: datasets>=2.14.0; extra == 'dev'
|
|
62
63
|
Requires-Dist: httpx>=0.24.0; extra == 'dev'
|
|
64
|
+
Requires-Dist: mcp>=1.2.0; extra == 'dev'
|
|
63
65
|
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
64
66
|
Requires-Dist: peft>=0.7.0; extra == 'dev'
|
|
65
67
|
Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
|
|
@@ -80,6 +82,8 @@ Provides-Extra: gptq
|
|
|
80
82
|
Requires-Dist: auto-gptq>=0.7.0; extra == 'gptq'
|
|
81
83
|
Provides-Extra: liger
|
|
82
84
|
Requires-Dist: liger-kernel>=0.3.0; extra == 'liger'
|
|
85
|
+
Provides-Extra: mcp
|
|
86
|
+
Requires-Dist: mcp>=1.2.0; extra == 'mcp'
|
|
83
87
|
Provides-Extra: mix
|
|
84
88
|
Requires-Dist: scikit-optimize>=0.9.0; extra == 'mix'
|
|
85
89
|
Provides-Extra: mlx
|
|
@@ -189,21 +193,25 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
189
193
|
|
|
190
194
|
## What's New
|
|
191
195
|
|
|
192
|
-
**v0.71.
|
|
193
|
-
|
|
194
|
-
- **
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
- **
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
196
|
+
**v0.71.28 — Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
|
|
197
|
+
|
|
198
|
+
- **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
|
|
199
|
+
`recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
|
|
200
|
+
`diagnose_evidence`, `ship_evidence` — your agent can inspect data, search recipes, read runs,
|
|
201
|
+
and get a ship verdict without you leaving the chat.
|
|
202
|
+
- **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
|
|
203
|
+
mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
|
|
204
|
+
render the exact command that would run. Every path argument re-enters cwd containment +
|
|
205
|
+
symlink rejection; output is control-char sanitized; errors are path-free.
|
|
206
|
+
- **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
|
|
207
|
+
(`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
|
|
208
|
+
- **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
|
|
209
|
+
call` end-to-end on Windows + RTX 3050 — read tools return real JSON, the mutating tools
|
|
210
|
+
refuse without the flag, and a path-traversal argument is rejected.
|
|
211
|
+
|
|
212
|
+
```jsonc
|
|
213
|
+
// .mcp.json (Claude Code) or claude_desktop_config.json
|
|
214
|
+
{ "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
|
|
207
215
|
```
|
|
208
216
|
|
|
209
217
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
@@ -49,21 +49,25 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.71.
|
|
53
|
-
|
|
54
|
-
- **
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- **
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
52
|
+
**v0.71.28 — Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
|
|
53
|
+
|
|
54
|
+
- **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
|
|
55
|
+
`recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
|
|
56
|
+
`diagnose_evidence`, `ship_evidence` — your agent can inspect data, search recipes, read runs,
|
|
57
|
+
and get a ship verdict without you leaving the chat.
|
|
58
|
+
- **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
|
|
59
|
+
mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
|
|
60
|
+
render the exact command that would run. Every path argument re-enters cwd containment +
|
|
61
|
+
symlink rejection; output is control-char sanitized; errors are path-free.
|
|
62
|
+
- **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
|
|
63
|
+
(`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
|
|
64
|
+
- **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
|
|
65
|
+
call` end-to-end on Windows + RTX 3050 — read tools return real JSON, the mutating tools
|
|
66
|
+
refuse without the flag, and a path-traversal argument is rejected.
|
|
67
|
+
|
|
68
|
+
```jsonc
|
|
69
|
+
// .mcp.json (Claude Code) or claude_desktop_config.json
|
|
70
|
+
{ "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
|
|
67
71
|
```
|
|
68
72
|
|
|
69
73
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
@@ -68,6 +68,9 @@ soup sweep --config soup.yaml --param lr=... Hyperparameter search
|
|
|
68
68
|
soup diff --model-a ./a --model-b ./b Compare two models
|
|
69
69
|
soup data inspect <path> View dataset stats
|
|
70
70
|
soup data validate <path> Check format (auto-detect)
|
|
71
|
+
soup data doctor <path> --model <id> Chat-template compat report: 8 checks, OK/MINOR/MAJOR
|
|
72
|
+
soup data doctor <path> --model <id> --show-mask N Per-token trained/masked colouring via the real collator
|
|
73
|
+
soup data lint <path> Preference-data linter: length bias, near-dups, chosen==rejected
|
|
71
74
|
soup data convert <path> --to chatml Convert between formats
|
|
72
75
|
soup data merge data1.jsonl data2.jsonl Combine datasets
|
|
73
76
|
soup data dedup <path> --threshold 0.8 Remove duplicates (MinHash)
|
|
@@ -81,7 +84,8 @@ soup data generate ... --quality-pipeline Auto validate + filter + dedup
|
|
|
81
84
|
soup data augment <path> --strategy rephrase|translate|style [--provider ollama|vllm --model <m> --base-url <url>] LLM-driven augmentation
|
|
82
85
|
soup data from-traces --logs l.jsonl --format langchain --signal thumbs_up --output p.jsonl Preference pairs from traces
|
|
83
86
|
soup data from-traces ... --judge --min-confidence 0.7 LLM-judge confidence filter
|
|
84
|
-
soup data review prefs.jsonl --sample 10 Preview preference
|
|
87
|
+
soup data review prefs.jsonl --sample 10 Preview preference pairs
|
|
88
|
+
soup data filter <path> --coherence 0.3 Quality filter (perplexity/coherence)
|
|
85
89
|
soup data sample <path> --n 1000 Random sample subset
|
|
86
90
|
soup data sample <path> --n 1000 --strategy diverse Cluster-based diverse sampling
|
|
87
91
|
soup data sample <path> --n 1000 --strategy hard Sample hardest examples
|
|
@@ -152,6 +156,8 @@ soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP ver
|
|
|
152
156
|
soup ship --evidence ev.json [--output v.json] Decide offline from pre-computed scores (no model load)
|
|
153
157
|
soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via LLM-as-a-judge
|
|
154
158
|
soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 + recorded base scores
|
|
159
|
+
soup mcp serve MCP server over stdio (drive Soup from Claude Code / Cursor / Cline; requires [mcp] extra) (v0.71.28)
|
|
160
|
+
soup mcp serve --allow-mutating Also expose plan-only train_start / export tools (never execute) (v0.71.28)
|
|
155
161
|
soup tui Full-screen Textual dashboard (requires [tui] extra)
|
|
156
162
|
soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
|
|
157
163
|
soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
|
|
@@ -263,4 +269,37 @@ soup version [--full] [--json] Show version (--full: system info,
|
|
|
263
269
|
soup --verbose <command> Full traceback on errors
|
|
264
270
|
```
|
|
265
271
|
|
|
272
|
+
## Fine-tune from your coding agent (MCP)
|
|
273
|
+
|
|
274
|
+
`soup mcp serve` runs a [Model Context Protocol](https://modelcontextprotocol.io)
|
|
275
|
+
server over **stdio**, so any MCP client — Claude Code, Cursor, Cline, Continue —
|
|
276
|
+
can drive Soup conversationally. Install the extra first:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
pip install 'soup-cli[mcp]'
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Register it with your client. For **Claude Code** (`.mcp.json` in the repo) or
|
|
283
|
+
the **Claude Desktop** config (`claude_desktop_config.json`):
|
|
284
|
+
|
|
285
|
+
```json
|
|
286
|
+
{
|
|
287
|
+
"mcpServers": {
|
|
288
|
+
"soup": { "command": "soup", "args": ["mcp", "serve"] }
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
The server exposes 14 read-only tools — `advise`, `data_inspect`,
|
|
294
|
+
`data_validate`, `data_score`, `data_doctor`, `recipes_search`, `recipes_show`,
|
|
295
|
+
`runs_list`, `runs_show`, `registry_list`, `registry_show`, `profile`,
|
|
296
|
+
`diagnose_evidence`, `ship_evidence` — each returning JSON. Two **plan-only**
|
|
297
|
+
mutating tools (`train_start`, `export`) are gated behind `--allow-mutating`
|
|
298
|
+
(`"args": ["mcp", "serve", "--allow-mutating"]`); even then they only render the
|
|
299
|
+
exact command that would run — they never execute training or export.
|
|
300
|
+
|
|
301
|
+
**Security:** stdio only (no network listener); every path argument stays under
|
|
302
|
+
the working directory and rejects symlinks; tool output is control-char
|
|
303
|
+
sanitized; error messages never leak filesystem paths.
|
|
304
|
+
|
|
266
305
|
|
|
@@ -637,3 +637,49 @@ written per node; resume rehydrates from per-node sidecars. Failed rows logged w
|
|
|
637
637
|
redacted reasons (paths stripped, capped at 256 chars).
|
|
638
638
|
|
|
639
639
|
|
|
640
|
+
## Fine-tune Doctor (`soup data doctor`)
|
|
641
|
+
|
|
642
|
+
Chat-template compatibility report — catches the top *silent* fine-tuning failures
|
|
643
|
+
before a single training step:
|
|
644
|
+
|
|
645
|
+
```bash
|
|
646
|
+
soup data doctor ./data/train.jsonl --model meta-llama/Llama-3.1-8B-Instruct
|
|
647
|
+
|
|
648
|
+
# Render N sample rows with per-token trained/masked colouring, through the REAL
|
|
649
|
+
# collator path (answer-only / per-message-train-field / RAFT span-mask)
|
|
650
|
+
soup data doctor ./data/train.jsonl --model meta-llama/Llama-3.1-8B-Instruct --show-mask 5
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
Eight checks, same OK/MINOR/MAJOR taxonomy as `soup diagnose` (exit 0 on OK/MINOR,
|
|
654
|
+
exit 2 on MAJOR): `chat_template` (tokenizer has one), `template_render` (renders
|
|
655
|
+
cleanly on a sample), `generation_markers` (`{% generation %}` support),
|
|
656
|
+
`eos_in_labels` — the **#1 "model never stops generating" bug**: every trained
|
|
657
|
+
assistant turn must actually contain an EOS/EOT token, checked across the *whole*
|
|
658
|
+
trained span, not just the last turn — `bos_duplication` (template + tokenizer both
|
|
659
|
+
prepending BOS), `system_role` (Mistral-style templates that reject a leading system
|
|
660
|
+
turn), `unknown_roles`, and `truncation_risk` (p95 rendered length vs
|
|
661
|
+
`data.max_length`). `--train-on-responses-only` / `--train-on-messages-with-train-field`
|
|
662
|
+
select the same masking strategy `soup train` would use, so the report and
|
|
663
|
+
`--show-mask` preview can never disagree about what's actually trained.
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
## Preference-Data Linter (`soup data lint`)
|
|
667
|
+
|
|
668
|
+
Catches the top silent degradations in DPO/ORPO/SimPO/IPO/BCO/KTO preference data:
|
|
669
|
+
|
|
670
|
+
```bash
|
|
671
|
+
soup data lint ./data/prefs.jsonl
|
|
672
|
+
soup data lint ./data/prefs.jsonl --model meta-llama/Llama-3.1-8B-Instruct # exact token-length bias, not word count
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
Five checks: `length_bias` — the **#1 silent DPO degradation**: `chosen`
|
|
676
|
+
systematically longer than `rejected`, reported as a Cohen's d effect size —
|
|
677
|
+
`label_imbalance` (KTO desirable:undesirable ratio), `near_duplicates`
|
|
678
|
+
(MinHash/LSH, reuses the `soup data dedup` kernel; requires
|
|
679
|
+
`pip install 'soup-cli[data]'`, degrades to an advisory skip otherwise),
|
|
680
|
+
`identical_pairs` (`chosen == rejected` — zero preference signal), and
|
|
681
|
+
`prompt_leak` (the prompt echoed verbatim inside the completion, a common
|
|
682
|
+
synthetic-data pipeline bug). Same OK/MINOR/MAJOR taxonomy and exit codes as
|
|
683
|
+
`soup data doctor`.
|
|
684
|
+
|
|
685
|
+
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "soup-cli"
|
|
7
|
-
version = "0.71.
|
|
7
|
+
version = "0.71.28"
|
|
8
8
|
description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -47,14 +47,14 @@ train = [
|
|
|
47
47
|
"accelerate>=0.25.0",
|
|
48
48
|
]
|
|
49
49
|
# v0.71.0 — convenience meta-extra pulling the main optional stacks.
|
|
50
|
-
all = ["soup-cli[train,serve,ui,data]"]
|
|
50
|
+
all = ["soup-cli[train,serve,ui,data,mcp]"]
|
|
51
51
|
eval = ["lm-eval>=0.4.0"]
|
|
52
52
|
data = ["datasketch>=1.6.0"]
|
|
53
53
|
wandb = ["wandb>=0.15.0,<0.18.0"]
|
|
54
54
|
# Self-references `[train]` so CI / contributors get the full training stack
|
|
55
55
|
# (CI runs `pip install -e ".[dev]"`; without this every test would fail at
|
|
56
56
|
# `import torch`).
|
|
57
|
-
dev = ["soup-cli[train]", "cryptography>=41.0.0", "reportlab>=4.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
|
|
57
|
+
dev = ["soup-cli[train,mcp]", "cryptography>=41.0.0", "reportlab>=4.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
|
|
58
58
|
ui = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
59
59
|
serve = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
60
60
|
serve-fast = ["vllm>=0.4.0", "fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
@@ -102,6 +102,10 @@ compile = ["dspy-ai>=2.5.0", "textgrad>=0.1.0", "gepa>=0.0.1"]
|
|
|
102
102
|
# Lazy-imported; only needed for `--cloud-submit` (plan-only render needs no
|
|
103
103
|
# dependency). Modal auth is via `modal setup`.
|
|
104
104
|
modal = ["modal>=0.60.0"]
|
|
105
|
+
# v0.71.28 - `soup mcp serve` MCP server. The official `mcp` python SDK is
|
|
106
|
+
# lazy-imported (only src/soup_cli/mcp_server/server.py touches it), so the CLI
|
|
107
|
+
# stays light without it. Floor pinned to guard against SDK API churn.
|
|
108
|
+
mcp = ["mcp>=1.2.0"]
|
|
105
109
|
|
|
106
110
|
[project.scripts]
|
|
107
111
|
soup = "soup_cli.cli:run"
|
|
@@ -82,6 +82,10 @@ class DeployTarget(BaseModel):
|
|
|
82
82
|
raise ValueError("deploy path contains null byte")
|
|
83
83
|
if value.startswith("/") or value.startswith("\\"):
|
|
84
84
|
raise ValueError(f"deploy path '{value}' must be relative")
|
|
85
|
+
# Windows drive-absolute (``C:\...`` / ``C:/...``) is absolute too but
|
|
86
|
+
# starts with a letter, so it slipped past the ``/`` / ``\`` check.
|
|
87
|
+
if len(value) >= 2 and value[1] == ":" and value[0].isalpha():
|
|
88
|
+
raise ValueError(f"deploy path '{value}' must be relative")
|
|
85
89
|
# Normalise separators first, then split — a mixed-separator path
|
|
86
90
|
# like ``foo/..\\bar`` would otherwise slip past a single-separator
|
|
87
91
|
# split because ``"..\\bar"`` != ``".."``.
|
|
@@ -510,6 +510,23 @@ app.add_typer(
|
|
|
510
510
|
help="RA-DIT two-stage orchestrator: retriever -> generator (v0.71.10).",
|
|
511
511
|
)
|
|
512
512
|
|
|
513
|
+
# v0.71.27 — Fine-tune Doctor: chat-template doctor + loss-mask X-ray +
|
|
514
|
+
# preference linter.
|
|
515
|
+
from soup_cli.commands import data_doctor as _data_doctor_cmd # noqa: E402
|
|
516
|
+
|
|
517
|
+
data.app.command(name="doctor")(_data_doctor_cmd.doctor)
|
|
518
|
+
data.app.command(name="lint")(_data_doctor_cmd.lint)
|
|
519
|
+
|
|
520
|
+
# v0.71.28 — MCP server: drive Soup from any MCP client (Claude Code / Cursor /
|
|
521
|
+
# Cline / Continue) over stdio.
|
|
522
|
+
from soup_cli.commands import mcp as _mcp_cmd # noqa: E402
|
|
523
|
+
|
|
524
|
+
app.add_typer(
|
|
525
|
+
_mcp_cmd.app,
|
|
526
|
+
name="mcp",
|
|
527
|
+
help="Model Context Protocol server - drive Soup from any MCP client (v0.71.28).",
|
|
528
|
+
)
|
|
529
|
+
|
|
513
530
|
|
|
514
531
|
def _rewrite_advise_argv(argv: list) -> list:
|
|
515
532
|
"""Inject `run` between `advise` and a non-subcommand first argument.
|
|
@@ -196,7 +196,12 @@ def render_modal_stub(
|
|
|
196
196
|
"@app.local_entrypoint()\n"
|
|
197
197
|
"def main() -> None:\n"
|
|
198
198
|
" train.remote()\n"
|
|
199
|
-
|
|
199
|
+
# Reference the already-repr()-embedded ``_LOCAL_OUTPUT`` via a runtime
|
|
200
|
+
# f-string in the GENERATED code — no user value is interpolated into
|
|
201
|
+
# the stub source here. (Interpolating raw ``{output_dir}`` was a code-
|
|
202
|
+
# injection hole; ``{output_dir!r}`` alone would still break for a path
|
|
203
|
+
# containing a quote because the repr is nested inside a "..." literal.)
|
|
204
|
+
' print(f"Training submitted; download checkpoints to {_LOCAL_OUTPUT}")\n'
|
|
200
205
|
)
|
|
201
206
|
|
|
202
207
|
|
|
@@ -43,7 +43,7 @@ def register(app: typer.Typer, console: Console) -> None:
|
|
|
43
43
|
try:
|
|
44
44
|
rows = load_advise_dataset(data)
|
|
45
45
|
except (FileNotFoundError, ValueError, TypeError) as exc:
|
|
46
|
-
console.print(f"[red]Cannot read dataset:[/] {exc}")
|
|
46
|
+
console.print(f"[red]Cannot read dataset:[/] {escape(str(exc))}")
|
|
47
47
|
raise typer.Exit(1) from exc
|
|
48
48
|
|
|
49
49
|
try:
|
|
@@ -105,7 +105,7 @@ def register(app: typer.Typer, console: Console) -> None:
|
|
|
105
105
|
try:
|
|
106
106
|
rows = load_advise_dataset(data)
|
|
107
107
|
except (FileNotFoundError, ValueError, TypeError) as exc:
|
|
108
|
-
console.print(f"[red]Cannot read dataset:[/] {exc}")
|
|
108
|
+
console.print(f"[red]Cannot read dataset:[/] {escape(str(exc))}")
|
|
109
109
|
raise typer.Exit(1) from exc
|
|
110
110
|
|
|
111
111
|
try:
|
|
@@ -254,6 +254,15 @@ def register(app: typer.Typer, console: Console) -> None:
|
|
|
254
254
|
False, "--json-only",
|
|
255
255
|
help="Suppress Rich output; emit a single JSON verdict line.",
|
|
256
256
|
),
|
|
257
|
+
suite: str = typer.Option(
|
|
258
|
+
None, "--suite",
|
|
259
|
+
help=(
|
|
260
|
+
"Locked eval suite (from `soup eval lock`) to validate as a gate "
|
|
261
|
+
"precondition — a missing / unparseable suite BLOCKS the check "
|
|
262
|
+
"(exit 1). cwd-contained. The generated pre-push hook passes "
|
|
263
|
+
"$GATE_SUITE here so the locked suite is actually enforced."
|
|
264
|
+
),
|
|
265
|
+
),
|
|
257
266
|
) -> None:
|
|
258
267
|
"""Run-vs-run regression check (paired-bootstrap CI).
|
|
259
268
|
|
|
@@ -265,6 +274,26 @@ def register(app: typer.Typer, console: Console) -> None:
|
|
|
265
274
|
"""
|
|
266
275
|
import json as _json
|
|
267
276
|
|
|
277
|
+
# The locked suite is a hard precondition when supplied: validate it
|
|
278
|
+
# exists, is under cwd, and parses. Previously the hook wrote $GATE_SUITE
|
|
279
|
+
# but never used it, so a deleted / tampered locked suite silently
|
|
280
|
+
# passed the gate.
|
|
281
|
+
if suite:
|
|
282
|
+
from soup_cli.utils.eval_lock_coverage import load_locked_suite
|
|
283
|
+
from soup_cli.utils.paths import is_under_cwd
|
|
284
|
+
|
|
285
|
+
if not is_under_cwd(suite):
|
|
286
|
+
console.print(f"[red]--suite is outside cwd:[/] {escape(str(suite))}")
|
|
287
|
+
raise typer.Exit(1)
|
|
288
|
+
try:
|
|
289
|
+
load_locked_suite(suite)
|
|
290
|
+
except (FileNotFoundError, ValueError, OSError) as exc:
|
|
291
|
+
console.print(
|
|
292
|
+
f"[red]Locked eval suite invalid — gate blocked:[/] "
|
|
293
|
+
f"{escape(str(exc))}"
|
|
294
|
+
)
|
|
295
|
+
raise typer.Exit(1) from exc
|
|
296
|
+
|
|
268
297
|
from soup_cli.experiment.tracker import ExperimentTracker
|
|
269
298
|
from soup_cli.utils.eval_gate_hook import (
|
|
270
299
|
GateThresholds,
|
|
@@ -194,6 +194,11 @@ def bench(
|
|
|
194
194
|
start_load = time.time()
|
|
195
195
|
try:
|
|
196
196
|
model_obj, tokenizer = _load_model(str(model_path), base, device)
|
|
197
|
+
except typer.Exit:
|
|
198
|
+
# typer.Exit subclasses RuntimeError, so the broad except below would
|
|
199
|
+
# swallow an already-reported CLI exit and mis-print "Failed to load
|
|
200
|
+
# model: 1". Let it propagate unchanged.
|
|
201
|
+
raise
|
|
197
202
|
except (OSError, ImportError, RuntimeError, ValueError) as exc:
|
|
198
203
|
console.print(f"[red]Failed to load model:[/] {exc}")
|
|
199
204
|
raise typer.Exit(1) from exc
|
|
@@ -754,11 +754,12 @@ def sample_data(
|
|
|
754
754
|
if output is None:
|
|
755
755
|
out_path = file_path.parent / f"{file_path.stem}_sampled_{strategy}.jsonl"
|
|
756
756
|
else:
|
|
757
|
+
from soup_cli.utils.paths import is_under_cwd
|
|
758
|
+
|
|
757
759
|
out_path = Path(output).resolve()
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
except ValueError:
|
|
760
|
+
# realpath + commonpath (is_under_cwd) — Path.resolve()+relative_to()
|
|
761
|
+
# breaks on Windows 8.3 short names.
|
|
762
|
+
if not is_under_cwd(output):
|
|
762
763
|
console.print("[red]Output path must be under the current working directory.[/]")
|
|
763
764
|
raise typer.Exit(1)
|
|
764
765
|
|
|
@@ -812,6 +813,13 @@ def split_data(
|
|
|
812
813
|
console.print("[red]Specify at least one of --val or --test.[/]")
|
|
813
814
|
raise typer.Exit(1)
|
|
814
815
|
|
|
816
|
+
# Reject negatives: a negative val/test slipped past the `>= total` check
|
|
817
|
+
# and produced a negative slice (e.g. --val -10 sent 90 rows to val, 10 to
|
|
818
|
+
# train — a silently inverted split).
|
|
819
|
+
if (val is not None and val < 0) or (test is not None and test < 0):
|
|
820
|
+
console.print("[red]--val and --test must be non-negative.[/]")
|
|
821
|
+
raise typer.Exit(1)
|
|
822
|
+
|
|
815
823
|
data = load_raw_data(file_path)
|
|
816
824
|
if not data:
|
|
817
825
|
console.print("[red]Dataset is empty.[/]")
|
|
@@ -1265,25 +1273,23 @@ def download_dataset(
|
|
|
1265
1273
|
raise typer.Exit(1)
|
|
1266
1274
|
|
|
1267
1275
|
# Resolve output path
|
|
1276
|
+
from soup_cli.utils.paths import is_under_cwd
|
|
1277
|
+
|
|
1268
1278
|
if output is None:
|
|
1269
1279
|
ds_name = dataset_id.split("/")[-1] if "/" in dataset_id else dataset_id
|
|
1270
1280
|
# Strip embedded path separators to prevent traversal
|
|
1271
1281
|
ds_name = Path(ds_name).name
|
|
1272
1282
|
out_path = (Path.cwd() / f"{ds_name}.jsonl").resolve()
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
except ValueError:
|
|
1283
|
+
# realpath + commonpath (is_under_cwd) — Path.resolve()+relative_to()
|
|
1284
|
+
# breaks on Windows 8.3 short names.
|
|
1285
|
+
if not is_under_cwd(out_path):
|
|
1277
1286
|
console.print(
|
|
1278
1287
|
"[red]Derived output path escapes working directory.[/]"
|
|
1279
1288
|
)
|
|
1280
1289
|
raise typer.Exit(1)
|
|
1281
1290
|
else:
|
|
1282
1291
|
out_path = Path(output).resolve()
|
|
1283
|
-
|
|
1284
|
-
try:
|
|
1285
|
-
out_path.relative_to(cwd)
|
|
1286
|
-
except ValueError:
|
|
1292
|
+
if not is_under_cwd(output):
|
|
1287
1293
|
console.print(
|
|
1288
1294
|
"[red]Output path must be under the current working directory.[/]"
|
|
1289
1295
|
)
|