soup-cli 0.71.22__tar.gz → 0.71.23__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.22 → soup_cli-0.71.23}/.gitignore +1 -16
- {soup_cli-0.71.22 → soup_cli-0.71.23}/CHANGELOG.md +33 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/CONTRIBUTING.md +1 -1
- {soup_cli-0.71.22 → soup_cli-0.71.23}/PKG-INFO +14 -17
- {soup_cli-0.71.22 → soup_cli-0.71.23}/README.md +13 -16
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/commands.md +1 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/training.md +52 -4
- {soup_cli-0.71.22 → soup_cli-0.71.23}/pyproject.toml +1 -1
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cli.py +5 -0
- soup_cli-0.71.23/src/soup_cli/commands/spectrum.py +174 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/schema.py +143 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/sft.py +79 -43
- soup_cli-0.71.23/src/soup_cli/utils/freeze.py +142 -0
- soup_cli-0.71.23/src/soup_cli/utils/spectrum_scan.py +591 -0
- soup_cli-0.71.23/tests/test_v07123.py +908 -0
- soup_cli-0.71.22/src/soup_cli/utils/freeze.py +0 -73
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.dockerignore +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.mailmap +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/AGENTS.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/CODEOWNERS +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/Dockerfile +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/LICENSE +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/NOTICE +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/SECURITY.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docker-compose.yml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/README.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/data.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/evaluation.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/models.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/README.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/soup.png +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/chat.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/code.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/medical.yaml +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/__init__.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/conftest.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_audio.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bco.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bench.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_callback.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cans.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_chat.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cli.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_config.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cost.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_diff.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_display.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_errors.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_export.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_formats.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_generate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_infer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_init.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_kto.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_loader.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_merge.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_moe.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_packing.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_performance.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_profile.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_progress.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_push.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_qat.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_registry.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_relora.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_replay.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_resume.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_runs.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_serve.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tui.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_validator.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_vision.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_why.py +0 -0
- {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_windows_encoding.py +0 -0
|
@@ -41,22 +41,7 @@ report.xml
|
|
|
41
41
|
*.key
|
|
42
42
|
|
|
43
43
|
# Internal plan + Claude Code local dev instructions (not for repo)
|
|
44
|
-
.claude/
|
|
45
|
-
.claude/CLAUDE.md
|
|
46
|
-
.claude/settings.json
|
|
47
|
-
.claude/scheduled_tasks.lock
|
|
48
|
-
.claude/*.lock
|
|
49
|
-
.claude/settings.local.json
|
|
50
|
-
|
|
51
|
-
# ECC plugin (local only)
|
|
52
|
-
.claude/agents/
|
|
53
|
-
.claude/commands/
|
|
54
|
-
.claude/examples/
|
|
55
|
-
.claude/hooks/
|
|
56
|
-
.claude/mcp-configs/
|
|
57
|
-
.claude/rules/
|
|
58
|
-
.claude/skills/
|
|
59
|
-
.claude/settings.json
|
|
44
|
+
.claude/
|
|
60
45
|
.coverage
|
|
61
46
|
|
|
62
47
|
# Local scratch / temp scripts at repo root (e.g. _smoke.py, _scratch.py) — never committed
|
|
@@ -12,6 +12,39 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.23] - 2026-06-12
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Native Spectrum targeted training (closes #266).** A new `soup spectrum
|
|
19
|
+
scan` reads a model's `.safetensors` shards **one tensor at a time** (no
|
|
20
|
+
model load — peak RAM is the largest single weight matrix), computes a
|
|
21
|
+
singular-value SNR per weight matrix with a Marchenko-Pastur noise threshold
|
|
22
|
+
(arXiv:2406.06623), ranks layers within each module-type group and prints
|
|
23
|
+
the top `--top-percent` as a ready-to-paste `training.unfrozen_parameters`
|
|
24
|
+
YAML block. This lets you scan even a very large model's layer SNR on a CPU
|
|
25
|
+
box and then full-fine-tune only the high-signal layers.
|
|
26
|
+
- `soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn|all] [--output patch.yaml]`
|
|
27
|
+
— SNR table + the YAML patch; results cache at `~/.soup/spectrum/<slug>.json`
|
|
28
|
+
(override via `SOUP_SPECTRUM_CACHE_DIR`).
|
|
29
|
+
- New schema field `training.unfrozen_parameters: list[str]` — regex patterns
|
|
30
|
+
of parameter names to keep trainable; the SFT trainer freezes every
|
|
31
|
+
parameter then unfreezes the matched set (full fine-tuning, LoRA off).
|
|
32
|
+
Mutually exclusive with LoRA features / `freeze_layers` / `freeze_ratio` /
|
|
33
|
+
`train_router_only` / `expand_layers`; requires `task=sft`,
|
|
34
|
+
`backend=transformers`, `modality=text`, and `quantization=none`.
|
|
35
|
+
- The SNR kernel is pure-numpy and transpose-invariant (singular values are
|
|
36
|
+
identical for `W` and `W.T`); GPT-2 `Conv1D` naming
|
|
37
|
+
(`c_attn`/`c_fc`/`c_proj`) is recognised alongside Llama-style names.
|
|
38
|
+
- The existing `spectrum` trainer-plugin wrapper is untouched (back-compat).
|
|
39
|
+
LISA (per-step layer sampling) is tracked separately in #267.
|
|
40
|
+
|
|
41
|
+
### Security
|
|
42
|
+
- `soup spectrum scan` validates `unfrozen_parameters` patterns at parse time:
|
|
43
|
+
rejects nested-unbounded-quantifier regexes (ReDoS), null bytes, empties, and
|
|
44
|
+
caps count (50k) and length (512). Hub downloads route through the
|
|
45
|
+
SSRF-hardened, namespace-pinned `hubs.snapshot_download`; symlinked shards and
|
|
46
|
+
matrices above a 2^31-element SVD cap are skipped; `--output` stays under cwd.
|
|
47
|
+
|
|
15
48
|
## [0.71.22] - 2026-06-10
|
|
16
49
|
|
|
17
50
|
### Added
|
|
@@ -120,7 +120,7 @@ src/soup_cli/
|
|
|
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 (294 files, 14278 tests)
|
|
124
124
|
examples/ - Real-world config examples and datasets
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.71.
|
|
3
|
+
Version: 0.71.23
|
|
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
|
|
@@ -189,22 +189,19 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
189
189
|
|
|
190
190
|
## What's New
|
|
191
191
|
|
|
192
|
-
**v0.71.
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **Live-codec TTS via SNAC (Orpheus)** — encoding raw audio at train time (`data.format: audio`)
|
|
206
|
-
is validated for Orpheus: audio is duration- and byte-capped from `soundfile.info` **before**
|
|
207
|
-
decoding into RAM, and read through a symlink-safe file descriptor.
|
|
192
|
+
**v0.71.23 — Native Spectrum targeted training.** Fine-tune only the layers that matter — no 8×H100 needed to find them:
|
|
193
|
+
|
|
194
|
+
- **`soup spectrum scan --model <id|path> --top-percent 50`** — streams a model's weights one
|
|
195
|
+
tensor at a time (no model load, runs on a CPU box even for very large models) and computes a
|
|
196
|
+
singular-value signal-to-noise ratio per weight matrix (Marchenko-Pastur, arXiv:2406.06623).
|
|
197
|
+
- **Ready-to-paste patch** — prints a per-group SNR table and a `training.unfrozen_parameters`
|
|
198
|
+
YAML block; pipe it straight into your `soup.yaml`. Results cache under `~/.soup/spectrum/`.
|
|
199
|
+
- **Targeted full fine-tuning** — with `training.unfrozen_parameters` set, `soup train` freezes
|
|
200
|
+
every parameter and unfreezes only the matched high-SNR layers (full FT, LoRA off) — train
|
|
201
|
+
fewer parameters, keep more of the base model intact.
|
|
202
|
+
- **Honest guards** — the scan is pure-numpy and transpose-invariant; patterns are ReDoS-checked,
|
|
203
|
+
Hub downloads go through the SSRF-hardened loader, and the config gates `quantization: none` +
|
|
204
|
+
`task: sft` so a mis-set flag fails loudly, not silently.
|
|
208
205
|
|
|
209
206
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
210
207
|
|
|
@@ -49,22 +49,19 @@ 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
|
-
- **Live-codec TTS via SNAC (Orpheus)** — encoding raw audio at train time (`data.format: audio`)
|
|
66
|
-
is validated for Orpheus: audio is duration- and byte-capped from `soundfile.info` **before**
|
|
67
|
-
decoding into RAM, and read through a symlink-safe file descriptor.
|
|
52
|
+
**v0.71.23 — Native Spectrum targeted training.** Fine-tune only the layers that matter — no 8×H100 needed to find them:
|
|
53
|
+
|
|
54
|
+
- **`soup spectrum scan --model <id|path> --top-percent 50`** — streams a model's weights one
|
|
55
|
+
tensor at a time (no model load, runs on a CPU box even for very large models) and computes a
|
|
56
|
+
singular-value signal-to-noise ratio per weight matrix (Marchenko-Pastur, arXiv:2406.06623).
|
|
57
|
+
- **Ready-to-paste patch** — prints a per-group SNR table and a `training.unfrozen_parameters`
|
|
58
|
+
YAML block; pipe it straight into your `soup.yaml`. Results cache under `~/.soup/spectrum/`.
|
|
59
|
+
- **Targeted full fine-tuning** — with `training.unfrozen_parameters` set, `soup train` freezes
|
|
60
|
+
every parameter and unfreezes only the matched high-SNR layers (full FT, LoRA off) — train
|
|
61
|
+
fewer parameters, keep more of the base model intact.
|
|
62
|
+
- **Honest guards** — the scan is pure-numpy and transpose-invariant; patterns are ReDoS-checked,
|
|
63
|
+
Hub downloads go through the SSRF-hardened loader, and the config gates `quantization: none` +
|
|
64
|
+
`task: sft` so a mis-set flag fails loudly, not silently.
|
|
68
65
|
|
|
69
66
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
70
67
|
|
|
@@ -25,6 +25,7 @@ soup push --model ./output --repo user/name --collection user/coll-abc123 Add t
|
|
|
25
25
|
soup merge --adapter ./output Merge LoRA with base model
|
|
26
26
|
soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP shards into one safetensors (v0.71.14; --plan-only previews)
|
|
27
27
|
soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
|
|
28
|
+
soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
|
|
28
29
|
soup export --model ./output --format gguf Export to GGUF (Ollama)
|
|
29
30
|
soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
|
|
30
31
|
soup export --model ./output --format onnx Export to ONNX
|
|
@@ -1026,10 +1026,13 @@ prepends the family's emotion control string to the first user turn.
|
|
|
1026
1026
|
**Live-codec (hardware/dependency-gated).** Setting `data.format: audio` asks
|
|
1027
1027
|
the trainer to encode raw audio into codec tokens **at train time**, which needs
|
|
1028
1028
|
the family's heavyweight codec package (`snac` for Orpheus, `moshi` for
|
|
1029
|
-
Sesame-CSM, `xcodec2` for Llasa, `sparktts` for Spark, `outetts` for Oute).
|
|
1030
|
-
path
|
|
1031
|
-
|
|
1032
|
-
|
|
1029
|
+
Sesame-CSM, `xcodec2` for Llasa, `sparktts` for Spark, `outetts` for Oute). The
|
|
1030
|
+
**Orpheus** path is live — install `pip install snac` and a 24 kHz mono wav is
|
|
1031
|
+
encoded to SNAC codec tokens end-to-end (audio is duration- and byte-capped and
|
|
1032
|
+
read through an `O_NOFOLLOW` fd). The other four families still surface a
|
|
1033
|
+
friendly per-family `RuntimeError` naming the required `pip install` and are not
|
|
1034
|
+
yet validated on the maintainer's box — use the pre-encoded workflow above for a
|
|
1035
|
+
runnable fine-tune with those.
|
|
1033
1036
|
|
|
1034
1037
|
Five ready-made recipes ship: `orpheus-tts-sft`, `sesame-csm-tts`, `llasa-tts`,
|
|
1035
1038
|
`spark-tts`, `oute-tts` — copy with `soup recipes use <name>`. Cross-validators
|
|
@@ -1142,3 +1145,48 @@ rejected at the schema gate for non-supported arches and for `use_ring_attention
|
|
|
1142
1145
|
Pick one of MoD / LLaMA Pro / LongLoRA per run. (v0.71.12)
|
|
1143
1146
|
|
|
1144
1147
|
|
|
1148
|
+
## Spectrum — Targeted Training on Layer SNR (`soup spectrum scan`, v0.71.23)
|
|
1149
|
+
|
|
1150
|
+
Spectrum (arXiv:2406.06623) fine-tunes only the layers with the most signal. `soup spectrum scan`
|
|
1151
|
+
streams a model's `.safetensors` shards **one tensor at a time** — there is no model load, so it
|
|
1152
|
+
runs on a CPU box even for very large models — and computes a singular-value signal-to-noise ratio
|
|
1153
|
+
per weight matrix with a Marchenko-Pastur noise threshold. It ranks the layers within each
|
|
1154
|
+
module-type group and prints the top `--top-percent` as a ready-to-paste config block:
|
|
1155
|
+
|
|
1156
|
+
```bash
|
|
1157
|
+
soup spectrum scan --model HuggingFaceTB/SmolLM2-135M --top-percent 25 --modules mlp,attn -o patch.yaml
|
|
1158
|
+
```
|
|
1159
|
+
|
|
1160
|
+
```yaml
|
|
1161
|
+
# patch.yaml — paste into your soup.yaml
|
|
1162
|
+
training:
|
|
1163
|
+
unfrozen_parameters:
|
|
1164
|
+
- model.layers.0.mlp.down_proj
|
|
1165
|
+
- model.layers.29.self_attn.v_proj
|
|
1166
|
+
# ...
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
Then train with the patch — the SFT trainer freezes **every** parameter and unfreezes only the
|
|
1170
|
+
matched set (full fine-tuning, LoRA off):
|
|
1171
|
+
|
|
1172
|
+
```yaml
|
|
1173
|
+
base: HuggingFaceTB/SmolLM2-135M
|
|
1174
|
+
task: sft
|
|
1175
|
+
training:
|
|
1176
|
+
quantization: none # Spectrum trains float weights — quantization off
|
|
1177
|
+
unfrozen_parameters:
|
|
1178
|
+
- model.layers.0.mlp.down_proj
|
|
1179
|
+
- model.layers.29.self_attn.v_proj
|
|
1180
|
+
```
|
|
1181
|
+
|
|
1182
|
+
`unfrozen_parameters` entries are regex patterns matched against parameter names. It requires
|
|
1183
|
+
`task: sft`, `backend: transformers`, `modality: text`, and `quantization: none`, and is mutually
|
|
1184
|
+
exclusive with LoRA features (`use_dora` / `use_vera` / `moe_lora` / `relora_steps` / …) and the
|
|
1185
|
+
other freezing knobs (`freeze_layers` / `freeze_ratio` / `train_router_only` / `expand_layers`) —
|
|
1186
|
+
a conflicting combo is rejected loudly at config load. Scans cache under `~/.soup/spectrum/`
|
|
1187
|
+
(override with `SOUP_SPECTRUM_CACHE_DIR`); `--no-cache` skips it. `--modules mlp,attn` (vs the
|
|
1188
|
+
`all` default) is recommended for very large models — it skips the giant embedding/lm_head matrices.
|
|
1189
|
+
The SNR kernel is pure-numpy and transpose-invariant, so GPT-2 `Conv1D` weights score the same as
|
|
1190
|
+
Linear weights. (v0.71.23)
|
|
1191
|
+
|
|
1192
|
+
|
|
@@ -58,6 +58,7 @@ from soup_cli.commands import ( # noqa: E402
|
|
|
58
58
|
from soup_cli.commands import monitor as monitor_cmd # noqa: E402
|
|
59
59
|
from soup_cli.commands import quantize as quantize_cmd # noqa: E402
|
|
60
60
|
from soup_cli.commands import quickstart as quickstart_cmd # noqa: E402
|
|
61
|
+
from soup_cli.commands import spectrum as spectrum_cmd # noqa: E402
|
|
61
62
|
from soup_cli.commands import ( # noqa: E402
|
|
62
63
|
tui as tui_cmd,
|
|
63
64
|
)
|
|
@@ -136,6 +137,10 @@ app.add_typer(
|
|
|
136
137
|
app.command(name="history")(history.history)
|
|
137
138
|
app.command(name="why")(why_cmd.why)
|
|
138
139
|
app.command(name="tui")(tui_cmd.tui)
|
|
140
|
+
app.add_typer(
|
|
141
|
+
spectrum_cmd.app, name="spectrum",
|
|
142
|
+
help="Spectrum SNR scan for targeted training (v0.71.23).",
|
|
143
|
+
)
|
|
139
144
|
app.add_typer(
|
|
140
145
|
can.app, name="can",
|
|
141
146
|
help="Soup Cans: pack/inspect/verify/fork shareable .can artifacts.",
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"""soup spectrum — native Spectrum targeted-training scan (#266, v0.71.23).
|
|
2
|
+
|
|
3
|
+
``soup spectrum scan`` streams a model's ``.safetensors`` shards (NO model
|
|
4
|
+
load), computes a singular-value SNR per weight matrix (arXiv:2406.06623),
|
|
5
|
+
ranks layers within each module-type group and prints the top ``--top-percent``
|
|
6
|
+
as a ready-to-paste ``training.unfrozen_parameters`` YAML block. Paste it into
|
|
7
|
+
a ``soup.yaml`` to fine-tune only the high-SNR layers (full FT, LoRA off).
|
|
8
|
+
|
|
9
|
+
The scan is pure-numpy and runs on a CPU box even for very large models —
|
|
10
|
+
peak RSS is the largest single weight matrix, not the whole model.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from collections import defaultdict
|
|
15
|
+
from typing import TYPE_CHECKING, Optional
|
|
16
|
+
|
|
17
|
+
import typer
|
|
18
|
+
from rich.console import Console
|
|
19
|
+
from rich.markup import escape
|
|
20
|
+
from rich.panel import Panel
|
|
21
|
+
from rich.table import Table
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING: # static types only — the import is numpy-lazy at runtime
|
|
24
|
+
from soup_cli.utils.spectrum_scan import LayerSNR, ScanResult
|
|
25
|
+
|
|
26
|
+
console = Console()
|
|
27
|
+
|
|
28
|
+
app = typer.Typer(
|
|
29
|
+
no_args_is_help=True,
|
|
30
|
+
help="Spectrum SNR scan for targeted training (v0.71.23).",
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@app.callback()
|
|
35
|
+
def _spectrum() -> None:
|
|
36
|
+
"""Spectrum SNR scan for targeted training (v0.71.23).
|
|
37
|
+
|
|
38
|
+
An explicit callback keeps this a command group (Typer otherwise collapses
|
|
39
|
+
a single-command app and drops the ``scan`` subcommand name).
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _render_table(
|
|
44
|
+
result: "ScanResult", kept: list[str], top_percent: float
|
|
45
|
+
) -> None:
|
|
46
|
+
# Group by the same key as select_unfrozen_parameters (the layer-type
|
|
47
|
+
# signature), so the "Kept" column can never desync from the selection.
|
|
48
|
+
from soup_cli.utils.spectrum_scan import param_prefix
|
|
49
|
+
|
|
50
|
+
kept_set = set(kept)
|
|
51
|
+
groups: dict[str, list["LayerSNR"]] = defaultdict(list)
|
|
52
|
+
for layer in result.layers:
|
|
53
|
+
groups[layer.group].append(layer)
|
|
54
|
+
|
|
55
|
+
table = Table(
|
|
56
|
+
title=f"Spectrum SNR — {escape(result.model)} "
|
|
57
|
+
f"(top {top_percent:g}% per group)"
|
|
58
|
+
)
|
|
59
|
+
table.add_column("Type")
|
|
60
|
+
table.add_column("Group")
|
|
61
|
+
table.add_column("Layers", justify="right")
|
|
62
|
+
table.add_column("Kept", justify="right")
|
|
63
|
+
table.add_column("SNR min / mean / max", justify="right")
|
|
64
|
+
|
|
65
|
+
for group in sorted(groups):
|
|
66
|
+
items = groups[group]
|
|
67
|
+
snrs = [layer.snr for layer in items]
|
|
68
|
+
n_kept = sum(1 for layer in items if param_prefix(layer.name) in kept_set)
|
|
69
|
+
table.add_row(
|
|
70
|
+
items[0].module_type,
|
|
71
|
+
escape(group),
|
|
72
|
+
str(len(items)),
|
|
73
|
+
str(n_kept),
|
|
74
|
+
f"{min(snrs):.3f} / {sum(snrs) / len(snrs):.3f} / {max(snrs):.3f}",
|
|
75
|
+
)
|
|
76
|
+
console.print(table)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@app.command()
|
|
80
|
+
def scan(
|
|
81
|
+
model: str = typer.Option(
|
|
82
|
+
..., "--model", "-m", help="HF Hub id or local model directory."
|
|
83
|
+
),
|
|
84
|
+
top_percent: float = typer.Option(
|
|
85
|
+
50.0,
|
|
86
|
+
"--top-percent",
|
|
87
|
+
help="Keep the top N% of layers (by SNR) within each module type.",
|
|
88
|
+
),
|
|
89
|
+
modules: str = typer.Option(
|
|
90
|
+
"all",
|
|
91
|
+
"--modules",
|
|
92
|
+
help="Comma list of module types to scan: e.g. 'mlp,attn' — or 'all'.",
|
|
93
|
+
),
|
|
94
|
+
output: Optional[str] = typer.Option(
|
|
95
|
+
None,
|
|
96
|
+
"--output",
|
|
97
|
+
"-o",
|
|
98
|
+
help="Write the YAML patch to this path (must stay under cwd).",
|
|
99
|
+
),
|
|
100
|
+
no_cache: bool = typer.Option(
|
|
101
|
+
False, "--no-cache", help="Skip the ~/.soup/spectrum scan cache."
|
|
102
|
+
),
|
|
103
|
+
) -> None:
|
|
104
|
+
"""Scan a model's layer SNR and emit a ``training.unfrozen_parameters`` patch."""
|
|
105
|
+
import yaml
|
|
106
|
+
|
|
107
|
+
from soup_cli.utils.spectrum_scan import scan_model, select_unfrozen_parameters
|
|
108
|
+
|
|
109
|
+
if not (0 < top_percent <= 100):
|
|
110
|
+
console.print("[red]--top-percent must be in (0, 100].[/]")
|
|
111
|
+
raise typer.Exit(2)
|
|
112
|
+
|
|
113
|
+
# Validate the output path up front (before the scan work) so a bad
|
|
114
|
+
# destination fails fast rather than after a long scan.
|
|
115
|
+
if output is not None:
|
|
116
|
+
from soup_cli.utils.paths import enforce_under_cwd_and_no_symlink
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
enforce_under_cwd_and_no_symlink(output, "output")
|
|
120
|
+
except (ValueError, TypeError) as exc:
|
|
121
|
+
console.print(f"[red]{escape(str(exc))}[/]")
|
|
122
|
+
raise typer.Exit(2) from exc
|
|
123
|
+
|
|
124
|
+
try:
|
|
125
|
+
result = scan_model(model, modules=modules, use_cache=not no_cache)
|
|
126
|
+
except (ValueError, FileNotFoundError, RuntimeError, OSError) as exc:
|
|
127
|
+
console.print(f"[red]Spectrum scan failed:[/] {escape(str(exc))}")
|
|
128
|
+
raise typer.Exit(1) from exc
|
|
129
|
+
except Exception as exc: # hub validation / unexpected — friendly, no traceback
|
|
130
|
+
console.print(
|
|
131
|
+
f"[red]Spectrum scan failed:[/] "
|
|
132
|
+
f"{escape(type(exc).__name__)}: {escape(str(exc))}"
|
|
133
|
+
)
|
|
134
|
+
raise typer.Exit(1) from exc
|
|
135
|
+
|
|
136
|
+
if not result.layers:
|
|
137
|
+
console.print(
|
|
138
|
+
"[yellow]No scannable 2-D weight matrices found "
|
|
139
|
+
"(check --model and --modules).[/]"
|
|
140
|
+
)
|
|
141
|
+
raise typer.Exit(1)
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
kept = select_unfrozen_parameters(
|
|
145
|
+
result.layers, top_percent=top_percent, modules=modules
|
|
146
|
+
)
|
|
147
|
+
except ValueError as exc:
|
|
148
|
+
console.print(f"[red]{escape(str(exc))}[/]")
|
|
149
|
+
raise typer.Exit(2) from exc
|
|
150
|
+
|
|
151
|
+
_render_table(result, kept, top_percent)
|
|
152
|
+
|
|
153
|
+
yaml_block = yaml.safe_dump(
|
|
154
|
+
{"training": {"unfrozen_parameters": kept}},
|
|
155
|
+
default_flow_style=False,
|
|
156
|
+
sort_keys=False,
|
|
157
|
+
)
|
|
158
|
+
console.print(
|
|
159
|
+
Panel(
|
|
160
|
+
escape(yaml_block.rstrip()),
|
|
161
|
+
title="training.unfrozen_parameters",
|
|
162
|
+
border_style="cyan",
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
console.print(
|
|
166
|
+
f"[dim]{len(kept)} parameter group(s) unfrozen — paste the block above "
|
|
167
|
+
f"into your soup.yaml (full fine-tuning, LoRA off).[/]"
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
if output is not None:
|
|
171
|
+
from soup_cli.utils.paths import atomic_write_text
|
|
172
|
+
|
|
173
|
+
atomic_write_text(yaml_block, output, field="output")
|
|
174
|
+
console.print(f"[green]Wrote patch:[/] {escape(output)}")
|
|
@@ -9,6 +9,15 @@ from pydantic import BaseModel, Field, field_validator, model_validator
|
|
|
9
9
|
_MAX_LORA_RANK_PATTERN_KEYS = 256
|
|
10
10
|
_MAX_LORA_RANK_PATTERN_VALUE = 1024
|
|
11
11
|
|
|
12
|
+
# v0.71.23 #266 — Spectrum targeted-training unfrozen-parameter caps
|
|
13
|
+
_MAX_UNFROZEN_PARAMETERS = 50_000
|
|
14
|
+
_MAX_UNFROZEN_PATTERN_LEN = 512
|
|
15
|
+
# Reject nested-unbounded-quantifier regexes — e.g. ``(x+)+y`` / ``(a*)*`` —
|
|
16
|
+
# which catastrophically backtrack (ReDoS) when re.search'd against parameter
|
|
17
|
+
# names in apply_unfrozen_parameters. soup.yaml is shareable config, so the
|
|
18
|
+
# pattern *class* is rejected at parse time, not just compile failures.
|
|
19
|
+
_UNFROZEN_REDOS_RE = re.compile(r"\([^)]*[+*][^)]*\)\s*[+*]")
|
|
20
|
+
|
|
12
21
|
|
|
13
22
|
class LoraConfig(BaseModel):
|
|
14
23
|
r: int = Field(default=64, description="LoRA rank")
|
|
@@ -2319,6 +2328,62 @@ class TrainingConfig(BaseModel):
|
|
|
2319
2328
|
lt=1.0,
|
|
2320
2329
|
description="Freeze this fraction of layers (0.75 = freeze 75% from bottom).",
|
|
2321
2330
|
)
|
|
2331
|
+
# v0.71.23 #266 — Spectrum targeted training: full FT of selected params
|
|
2332
|
+
unfrozen_parameters: Optional[List[str]] = Field(
|
|
2333
|
+
default=None,
|
|
2334
|
+
description=(
|
|
2335
|
+
"Spectrum (#266) targeted training: regex patterns of parameter "
|
|
2336
|
+
"names to keep trainable — every other parameter is frozen. Full "
|
|
2337
|
+
"fine-tuning, LoRA off. Generate with `soup spectrum scan`. "
|
|
2338
|
+
"Mutually exclusive with LoRA features / freeze_layers / "
|
|
2339
|
+
"freeze_ratio / train_router_only; sft + transformers backend only."
|
|
2340
|
+
),
|
|
2341
|
+
)
|
|
2342
|
+
|
|
2343
|
+
@field_validator("unfrozen_parameters")
|
|
2344
|
+
@classmethod
|
|
2345
|
+
def _validate_unfrozen_parameters(
|
|
2346
|
+
cls, value: Optional[List[str]]
|
|
2347
|
+
) -> Optional[List[str]]:
|
|
2348
|
+
"""v0.71.23 #266 — caps + NUL + non-empty + regex-compilability."""
|
|
2349
|
+
if value is None:
|
|
2350
|
+
return None
|
|
2351
|
+
if len(value) > _MAX_UNFROZEN_PARAMETERS:
|
|
2352
|
+
raise ValueError(
|
|
2353
|
+
f"training.unfrozen_parameters: too many patterns "
|
|
2354
|
+
f"({len(value)} > {_MAX_UNFROZEN_PARAMETERS})"
|
|
2355
|
+
)
|
|
2356
|
+
for pat in value:
|
|
2357
|
+
# pydantic's List[str] already guarantees each entry is a str.
|
|
2358
|
+
if not pat:
|
|
2359
|
+
raise ValueError(
|
|
2360
|
+
"training.unfrozen_parameters entries must be non-empty"
|
|
2361
|
+
)
|
|
2362
|
+
if "\x00" in pat:
|
|
2363
|
+
raise ValueError(
|
|
2364
|
+
"training.unfrozen_parameters entries must not contain "
|
|
2365
|
+
"null bytes"
|
|
2366
|
+
)
|
|
2367
|
+
if len(pat) > _MAX_UNFROZEN_PATTERN_LEN:
|
|
2368
|
+
raise ValueError(
|
|
2369
|
+
f"training.unfrozen_parameters entries must be "
|
|
2370
|
+
f"<= {_MAX_UNFROZEN_PATTERN_LEN} chars"
|
|
2371
|
+
)
|
|
2372
|
+
try:
|
|
2373
|
+
re.compile(pat)
|
|
2374
|
+
except re.error as exc:
|
|
2375
|
+
raise ValueError(
|
|
2376
|
+
f"training.unfrozen_parameters: invalid regex {pat!r}: {exc}"
|
|
2377
|
+
) from exc
|
|
2378
|
+
if _UNFROZEN_REDOS_RE.search(pat):
|
|
2379
|
+
raise ValueError(
|
|
2380
|
+
f"training.unfrozen_parameters: pattern {pat!r} has nested "
|
|
2381
|
+
f"unbounded quantifiers (ReDoS risk). Use a literal "
|
|
2382
|
+
f"parameter-name prefix such as "
|
|
2383
|
+
f"'model.layers.0.mlp.down_proj' (run `soup spectrum scan`)."
|
|
2384
|
+
)
|
|
2385
|
+
return value
|
|
2386
|
+
|
|
2322
2387
|
# Sample packing — pack multiple short samples into one sequence
|
|
2323
2388
|
packing: bool = Field(
|
|
2324
2389
|
default=False,
|
|
@@ -3627,6 +3692,84 @@ class SoupConfig(BaseModel):
|
|
|
3627
3692
|
raise ValueError(str(exc)) from exc
|
|
3628
3693
|
return self
|
|
3629
3694
|
|
|
3695
|
+
@model_validator(mode="after")
|
|
3696
|
+
def _validate_unfrozen_parameters(self) -> "SoupConfig":
|
|
3697
|
+
"""v0.71.23 #266 — Spectrum targeted-training compatibility gates.
|
|
3698
|
+
|
|
3699
|
+
``unfrozen_parameters`` is full fine-tuning of a hand-picked parameter
|
|
3700
|
+
set (LoRA off), so it is mutually exclusive with the LoRA feature
|
|
3701
|
+
flags and with the other parameter-freezing mechanisms. Wired only in
|
|
3702
|
+
the transformers SFT trainer.
|
|
3703
|
+
"""
|
|
3704
|
+
tcfg = self.training
|
|
3705
|
+
if not tcfg.unfrozen_parameters:
|
|
3706
|
+
return self
|
|
3707
|
+
if self.task != "sft":
|
|
3708
|
+
raise ValueError(
|
|
3709
|
+
f"training.unfrozen_parameters (Spectrum targeted training) "
|
|
3710
|
+
f"requires task='sft'; got task={self.task!r}"
|
|
3711
|
+
)
|
|
3712
|
+
if self.backend != "transformers":
|
|
3713
|
+
raise ValueError(
|
|
3714
|
+
f"training.unfrozen_parameters requires backend='transformers'; "
|
|
3715
|
+
f"got backend={self.backend!r}"
|
|
3716
|
+
)
|
|
3717
|
+
if self.modality != "text":
|
|
3718
|
+
raise ValueError(
|
|
3719
|
+
f"training.unfrozen_parameters requires modality='text' "
|
|
3720
|
+
f"(the Spectrum branch is wired in the text SFT trainer); "
|
|
3721
|
+
f"got modality={self.modality!r}"
|
|
3722
|
+
)
|
|
3723
|
+
if tcfg.quantization != "none":
|
|
3724
|
+
raise ValueError(
|
|
3725
|
+
f"training.unfrozen_parameters (Spectrum full fine-tuning) "
|
|
3726
|
+
f"requires quantization='none' (got {tcfg.quantization!r}); "
|
|
3727
|
+
f"quantized weights cannot be trained directly. For a quantized "
|
|
3728
|
+
f"run, drop unfrozen_parameters and use LoRA (QLoRA)."
|
|
3729
|
+
)
|
|
3730
|
+
freeze_conflicts = []
|
|
3731
|
+
if tcfg.freeze_layers is not None:
|
|
3732
|
+
freeze_conflicts.append("freeze_layers")
|
|
3733
|
+
if tcfg.freeze_ratio is not None:
|
|
3734
|
+
freeze_conflicts.append("freeze_ratio")
|
|
3735
|
+
if tcfg.train_router_only:
|
|
3736
|
+
freeze_conflicts.append("train_router_only")
|
|
3737
|
+
if tcfg.expand_layers is not None:
|
|
3738
|
+
freeze_conflicts.append("expand_layers")
|
|
3739
|
+
if tcfg.freeze_trainable_layers is not None:
|
|
3740
|
+
freeze_conflicts.append("freeze_trainable_layers")
|
|
3741
|
+
if freeze_conflicts:
|
|
3742
|
+
raise ValueError(
|
|
3743
|
+
f"training.unfrozen_parameters is mutually exclusive with "
|
|
3744
|
+
f"{', '.join(freeze_conflicts)} (each independently selects "
|
|
3745
|
+
f"which parameters train)"
|
|
3746
|
+
)
|
|
3747
|
+
lcfg = tcfg.lora
|
|
3748
|
+
lora_conflicts = []
|
|
3749
|
+
if lcfg.use_dora:
|
|
3750
|
+
lora_conflicts.append("lora.use_dora")
|
|
3751
|
+
if lcfg.use_vera:
|
|
3752
|
+
lora_conflicts.append("lora.use_vera")
|
|
3753
|
+
if lcfg.use_olora:
|
|
3754
|
+
lora_conflicts.append("lora.use_olora")
|
|
3755
|
+
if lcfg.use_rslora:
|
|
3756
|
+
lora_conflicts.append("lora.use_rslora")
|
|
3757
|
+
if tcfg.moe_lora:
|
|
3758
|
+
lora_conflicts.append("moe_lora")
|
|
3759
|
+
if tcfg.use_longlora:
|
|
3760
|
+
lora_conflicts.append("use_longlora")
|
|
3761
|
+
if tcfg.relora_steps is not None:
|
|
3762
|
+
lora_conflicts.append("relora_steps")
|
|
3763
|
+
if tcfg.loraplus_lr_ratio is not None:
|
|
3764
|
+
lora_conflicts.append("loraplus_lr_ratio")
|
|
3765
|
+
if lora_conflicts:
|
|
3766
|
+
raise ValueError(
|
|
3767
|
+
f"training.unfrozen_parameters (Spectrum full fine-tuning, "
|
|
3768
|
+
f"LoRA off) is mutually exclusive with LoRA features: "
|
|
3769
|
+
f"{', '.join(lora_conflicts)}"
|
|
3770
|
+
)
|
|
3771
|
+
return self
|
|
3772
|
+
|
|
3630
3773
|
@model_validator(mode="after")
|
|
3631
3774
|
def _validate_rollout_backend(self) -> "SoupConfig":
|
|
3632
3775
|
"""v0.50.0 Part C — ``rollout_backend`` requires task='grpo' and a
|