soup-cli 0.71.29__tar.gz → 0.71.30__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.29 → soup_cli-0.71.30}/CHANGELOG.md +38 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/CONTRIBUTING.md +3 -3
- {soup_cli-0.71.29 → soup_cli-0.71.30}/PKG-INFO +21 -16
- {soup_cli-0.71.29 → soup_cli-0.71.30}/README.md +20 -15
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/README.md +1 -1
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/commands.md +1 -1
- soup_cli-0.71.30/docs/superpowers/plans/2026-07-05-prm-guided-grpo.md +133 -0
- soup_cli-0.71.30/docs/superpowers/specs/2026-07-05-prm-guided-grpo-design.md +152 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/training.md +56 -1
- {soup_cli-0.71.29 → soup_cli-0.71.30}/pyproject.toml +1 -1
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/schema.py +75 -0
- soup_cli-0.71.30/src/soup_cli/envs/__init__.py +18 -0
- soup_cli-0.71.30/src/soup_cli/envs/_common.py +29 -0
- soup_cli-0.71.30/src/soup_cli/envs/calculator.py +41 -0
- soup_cli-0.71.30/src/soup_cli/envs/guess_number.py +44 -0
- soup_cli-0.71.30/src/soup_cli/envs/retrieval_qa.py +54 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/recipes/catalog.py +99 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/grpo.py +51 -31
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/prm.py +58 -2
- soup_cli-0.71.30/src/soup_cli/utils/prm_reward.py +373 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_recipes.py +3 -2
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07124.py +3 -3
- soup_cli-0.71.30/tests/test_v07130.py +797 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.dockerignore +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.gitignore +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.mailmap +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/AGENTS.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/CODEOWNERS +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/Dockerfile +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/LICENSE +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/NOTICE +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/SECURITY.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docker-compose.yml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/data.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/evaluation.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/models.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/superpowers/plans/2026-07-05-soup-shrink-depth-prune.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/superpowers/specs/2026-07-05-soup-shrink-depth-prune-design.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/README.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/soup.png +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/chat.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/code.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/medical.yaml +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/__init__.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/conftest.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_audio.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bco.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bench.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_callback.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cans.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_chat.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cli.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_config.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cost.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_diff.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_display.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_errors.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_export.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_formats.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_generate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_infer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_init.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_kto.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_loader.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_merge.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_moe.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_packing.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_performance.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_profile.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_progress.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_push.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_qat.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_registry.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_relora.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_replay.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_resume.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_runs.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_serve.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tui.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07123.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07125.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07126.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07127.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07128.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07129.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_validator.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_vision.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_warmup.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_why.py +0 -0
- {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,44 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.30] - 2026-07-05
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **PRM-guided GRPO** — use a trained Process Reward Model as the *per-step*
|
|
19
|
+
reward inside GRPO (the o1-era process-supervision signal). Set
|
|
20
|
+
`training.prm_reward: <PRM dir|id>` (a model produced by `soup train`
|
|
21
|
+
`task=prm`) and `training.prm_aggregate: min|prod|last`; the PRM splits each
|
|
22
|
+
generated completion into reasoning steps, scores every step with its reward
|
|
23
|
+
head, and folds the per-step scores into one scalar reward that GRPO
|
|
24
|
+
optimises. The PRM reward *replaces* `reward_fn` and rides the existing
|
|
25
|
+
reward-shaping + reward-hack-mitigation seam, so the v0.71.26 controller
|
|
26
|
+
observes it. Cross-validators gate `task='grpo'` + `backend='transformers'` +
|
|
27
|
+
`modality='text'`. Default aggregation is `min` (weakest-link); `prod`
|
|
28
|
+
assumes calibrated `[0,1]` step scores.
|
|
29
|
+
- **Bundled rollout environments** — three pure-Python toy environments
|
|
30
|
+
(`soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`) exposing a
|
|
31
|
+
`rollout(prompts)` entry point so the live `openenv` GRPO rollout path runs
|
|
32
|
+
out-of-the-box: `training.rollout_backend=openenv` +
|
|
33
|
+
`training.rollout_func=soup_cli.envs.calculator:rollout`. Three ready-made
|
|
34
|
+
recipes added (`grpo-env-calculator` / `grpo-env-retrieval-qa` /
|
|
35
|
+
`grpo-env-guess-number`); catalog 134 → 137.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- **`soup train task=prm` producer conformance** (surfaced by the v0.71.30 live
|
|
39
|
+
smoke): the PRM trainer now casts its reward head to the base-model dtype
|
|
40
|
+
(bf16 CUDA runs previously crashed on the first `compute_loss`), saves the
|
|
41
|
+
tokenizer alongside the model (so a PRM checkpoint is loadable standalone),
|
|
42
|
+
and returns the standard trainer-result shape (previously the CLI crashed with
|
|
43
|
+
a `KeyError: 'initial_loss'` right after saving).
|
|
44
|
+
|
|
45
|
+
### Notes
|
|
46
|
+
- Proof-of-mechanism only: validated on a tiny model (SmolLM2-135M) with a tiny
|
|
47
|
+
synthetic PRM and synthetic reward — not a production reward-model claim
|
|
48
|
+
(scale ask tracked in #286). The bundled environments are deterministic
|
|
49
|
+
single-shot *seeders*, not interactive multi-turn model-in-the-loop episodes
|
|
50
|
+
(the live `openenv` contract passes only prompts). Step split is a newline
|
|
51
|
+
heuristic; PRM completions are scored one forward pass each.
|
|
52
|
+
|
|
15
53
|
## [0.71.29] - 2026-07-05
|
|
16
54
|
|
|
17
55
|
### Added
|
|
@@ -110,17 +110,17 @@ src/soup_cli/
|
|
|
110
110
|
experiment/ - SQLite experiment tracking
|
|
111
111
|
eval/ - Eval platform (custom tasks, LLM judge, human eval, leaderboard)
|
|
112
112
|
migrate/ - Config migration (LLaMA-Factory, Axolotl, Unsloth)
|
|
113
|
-
recipes/ - Ready-made configs for popular models (
|
|
113
|
+
recipes/ - Ready-made configs for popular models (137 recipes)
|
|
114
114
|
autopilot/ - Zero-config decision engine (v0.25.0)
|
|
115
115
|
registry/ - Model Registry (hashing, store, diff, attach) (v0.26.0 + v0.33.0)
|
|
116
116
|
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
|
|
117
117
|
data/traces/ - Trace-to-Preference harvester (v0.26.0)
|
|
118
118
|
data/collators.py - CrossDocCollator for sample packing (v0.33.0)
|
|
119
|
-
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint
|
|
119
|
+
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink
|
|
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 (307 files, 15334 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.30
|
|
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
|
|
@@ -193,22 +193,27 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
193
193
|
|
|
194
194
|
## What's New
|
|
195
195
|
|
|
196
|
-
**v0.71.
|
|
196
|
+
**v0.71.30 — Process-supervised RL: PRM-guided GRPO.** Use a trained Process Reward Model to score each *reasoning step* of a GRPO completion — the o1-era training signal — plus bundled toy environments so the openenv rollout path runs out-of-the-box.
|
|
197
|
+
|
|
198
|
+
- **PRM as the GRPO reward.** Point `training.prm_reward` at a PRM you trained with
|
|
199
|
+
`soup train task=prm`; it splits each completion into steps, scores every step with the PRM's
|
|
200
|
+
reward head, and folds them (`min` / `prod` / `last`) into one reward that GRPO optimises —
|
|
201
|
+
replacing `reward_fn`. It rides the reward-shaping + reward-hack-mitigation seam, so the
|
|
202
|
+
v0.71.26 controller still watches it.
|
|
203
|
+
- **Bundled rollout environments.** `soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`
|
|
204
|
+
each expose a `rollout(prompts)` entry point; wire one with `rollout_backend=openenv` +
|
|
205
|
+
`rollout_func=soup_cli.envs.calculator:rollout` (three ready-made `grpo-env-*` recipes ship it).
|
|
206
|
+
- **Producer fixes too.** `soup train task=prm` now saves its tokenizer and no longer crashes on
|
|
207
|
+
its own summary — a PRM checkpoint is loadable standalone.
|
|
208
|
+
- **Proof-of-mechanism, honestly.** Live-validated on SmolLM2-135M (CPU): the PRM reward scores
|
|
209
|
+
good completions above bad and drives GRPO's advantages (`rewards/prm_reward` logged). Tiny
|
|
210
|
+
model + synthetic PRM — not a production reward-model claim (scale help wanted: #286).
|
|
197
211
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
ship a single dense smaller model — not a base + adapter.
|
|
204
|
-
- **A verdict, not a dashboard.** Every run ends in **SHIP** or **DON'T SHIP** on a
|
|
205
|
-
before/after perplexity ratio (`exit 0 = SHIP`, `2 = DON'T`, `1 = error`), so it drops into CI.
|
|
206
|
-
- **Runs on a laptop GPU.** Live-validated on Windows + RTX 3050 with SmolLM2-135M: drop 25 %
|
|
207
|
-
(30 → 22 layers, 21 % params) and drop-4 + CPU heal (perplexity recovered to ×1.35).
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
soup shrink --model HuggingFaceTB/SmolLM2-135M-Instruct --drop-ratio 0.25 \
|
|
211
|
-
--calib calib.jsonl --heal heal.jsonl --heal-steps 200 -o shrunk --device cpu
|
|
212
|
+
```yaml
|
|
213
|
+
task: grpo
|
|
214
|
+
training:
|
|
215
|
+
prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir
|
|
216
|
+
prm_aggregate: min # weakest-link (default) | prod | last
|
|
212
217
|
```
|
|
213
218
|
|
|
214
219
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
@@ -49,22 +49,27 @@ 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
|
-
|
|
52
|
+
**v0.71.30 — Process-supervised RL: PRM-guided GRPO.** Use a trained Process Reward Model to score each *reasoning step* of a GRPO completion — the o1-era training signal — plus bundled toy environments so the openenv rollout path runs out-of-the-box.
|
|
53
|
+
|
|
54
|
+
- **PRM as the GRPO reward.** Point `training.prm_reward` at a PRM you trained with
|
|
55
|
+
`soup train task=prm`; it splits each completion into steps, scores every step with the PRM's
|
|
56
|
+
reward head, and folds them (`min` / `prod` / `last`) into one reward that GRPO optimises —
|
|
57
|
+
replacing `reward_fn`. It rides the reward-shaping + reward-hack-mitigation seam, so the
|
|
58
|
+
v0.71.26 controller still watches it.
|
|
59
|
+
- **Bundled rollout environments.** `soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`
|
|
60
|
+
each expose a `rollout(prompts)` entry point; wire one with `rollout_backend=openenv` +
|
|
61
|
+
`rollout_func=soup_cli.envs.calculator:rollout` (three ready-made `grpo-env-*` recipes ship it).
|
|
62
|
+
- **Producer fixes too.** `soup train task=prm` now saves its tokenizer and no longer crashes on
|
|
63
|
+
its own summary — a PRM checkpoint is loadable standalone.
|
|
64
|
+
- **Proof-of-mechanism, honestly.** Live-validated on SmolLM2-135M (CPU): the PRM reward scores
|
|
65
|
+
good completions above bad and drives GRPO's advantages (`rewards/prm_reward` logged). Tiny
|
|
66
|
+
model + synthetic PRM — not a production reward-model claim (scale help wanted: #286).
|
|
64
67
|
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
```yaml
|
|
69
|
+
task: grpo
|
|
70
|
+
training:
|
|
71
|
+
prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir
|
|
72
|
+
prm_aggregate: min # weakest-link (default) | prod | last
|
|
68
73
|
```
|
|
69
74
|
|
|
70
75
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
@@ -8,7 +8,7 @@ feature reference — every `soup` capability, grouped by area.
|
|
|
8
8
|
| Guide | Covers |
|
|
9
9
|
|---|---|
|
|
10
10
|
| [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
|
|
11
|
-
| [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
|
|
11
|
+
| [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning, depth pruning + distill-heal (`soup shrink`) |
|
|
12
12
|
| [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
|
|
13
13
|
| [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
|
|
14
14
|
| [Evaluation & probes](evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, `soup ship` verdict, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
|
|
@@ -133,7 +133,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
|
|
|
133
133
|
soup migrate --from axolotl config.yml Import config from Axolotl
|
|
134
134
|
soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
|
|
135
135
|
soup migrate --from llamafactory c.yaml --dry-run Preview without writing
|
|
136
|
-
soup recipes list List all
|
|
136
|
+
soup recipes list List all 137 ready-made recipes
|
|
137
137
|
soup recipes show llama3.1-8b-sft Print recipe YAML
|
|
138
138
|
soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
|
|
139
139
|
soup recipes search "reasoning" Search by keyword/task/size
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# PRM-guided GRPO + bundled rollout envs — Implementation Plan
|
|
2
|
+
|
|
3
|
+
> **For agentic workers:** REQUIRED SUB-SKILL: superpowers:test-driven-development, task-by-task. Steps use checkbox (`- [ ]`) syntax.
|
|
4
|
+
|
|
5
|
+
**Goal:** Let a trained Soup PRM score each reasoning step of a GRPO completion as the reward signal, and bundle 3 pure-python toy environments that seed the live `openenv` rollout path out-of-the-box.
|
|
6
|
+
|
|
7
|
+
**Architecture:** A pure-kernel + torch-lazy `PRMScorer` in `utils/prm_reward.py` becomes the GRPO `reward_fn` when `training.prm_reward` is set (replacing the configured reward, riding the existing shaping+buffer seam). Three `soup_cli/envs/*.py` modules expose `rollout(prompts)` entry points wired via `training.rollout_func`. Schema fields + cross-validators gate both.
|
|
8
|
+
|
|
9
|
+
**Tech Stack:** Python 3.10+, Pydantic v2, torch/transformers/safetensors (lazy), TRL GRPO, pytest.
|
|
10
|
+
|
|
11
|
+
## Global Constraints
|
|
12
|
+
|
|
13
|
+
- Line length 100 (ruff E,F,I,N,W). No bare `print()` — use `rich.console.Console`.
|
|
14
|
+
- Lazy imports for torch/transformers/peft/safetensors inside functions, never module-level.
|
|
15
|
+
- Path containment: `os.path.realpath` + `os.path.commonpath`, NOT `Path.resolve()+relative_to()`.
|
|
16
|
+
- Pydantic v2 models in `config/schema.py`; assert specific error keywords in tests.
|
|
17
|
+
- Test file: `tests/test_v07130.py`. Use `assert result.exit_code == 0, (result.output, repr(result.exception))`.
|
|
18
|
+
- Version target: `0.71.29 → 0.71.30` (bump in `pyproject.toml` + `src/soup_cli/__init__.py`).
|
|
19
|
+
- Proof-of-mechanism honesty: tiny model / synthetic data only; scale ask extends #286.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### Task 1: PRM reward pure kernels
|
|
24
|
+
|
|
25
|
+
**Files:**
|
|
26
|
+
- Create: `src/soup_cli/utils/prm_reward.py`
|
|
27
|
+
- Test: `tests/test_v07130.py`
|
|
28
|
+
|
|
29
|
+
**Interfaces:**
|
|
30
|
+
- Produces: `split_steps(text: str) -> list[str]`, `aggregate_step_scores(scores: list[float], mode: str) -> float`, module constants `_MAX_STEPS`, `_MAX_STEP_CHARS`, `AGGREGATE_MODES: tuple[str,...]`.
|
|
31
|
+
|
|
32
|
+
- [ ] Step 1: Write failing tests `TestSplitSteps` (newline split; drop empty/whitespace; count cap `_MAX_STEPS`; per-step char cap; non-str→`[]`) and `TestAggregate` (min/prod/last correctness; empty→0.0; single; non-finite→treated safe; bad mode `ValueError` names modes; bool reject).
|
|
33
|
+
- [ ] Step 2: Run — expect ImportError / fail.
|
|
34
|
+
- [ ] Step 3: Implement kernels (no top-level torch). `split_steps`: `str.splitlines()`, strip, drop empties, truncate each to `_MAX_STEP_CHARS`, cap list to `_MAX_STEPS`. `aggregate_step_scores`: validate mode in `AGGREGATE_MODES`; empty→0.0; `min`→min, `last`→scores[-1], `prod`→math.prod; coerce non-finite to 0.0.
|
|
35
|
+
- [ ] Step 4: Run tests → PASS.
|
|
36
|
+
- [ ] Step 5: `ruff check` + commit `feat(prm): PRM reward pure kernels (split_steps/aggregate) (v0.71.30)`.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### Task 2: Schema fields + cross-validators
|
|
41
|
+
|
|
42
|
+
**Files:**
|
|
43
|
+
- Modify: `src/soup_cli/config/schema.py` (TrainingConfig fields near `reward_fn` ~L1043; field_validator; SoupConfig cross-validator near `_validate_rollout_backend` ~L4183)
|
|
44
|
+
- Test: `tests/test_v07130.py`
|
|
45
|
+
|
|
46
|
+
**Interfaces:**
|
|
47
|
+
- Produces: `TrainingConfig.prm_reward: Optional[str]`, `TrainingConfig.prm_aggregate: Literal["min","prod","last"]`; a `SoupConfig` `model_validator(mode="after")` `_validate_prm_reward`.
|
|
48
|
+
|
|
49
|
+
- [ ] Step 1: Write failing `TestPrmSchema` — happy config (task=grpo, transformers, text, prm_reward set, prm_aggregate=prod) parses via `load_config_from_string`; rejects: task≠grpo ("requires task='grpo'"), backend=mlx/unsloth ("transformers"), modality≠text ("modality='text'"), `prm_aggregate` non-default while `prm_reward None` (footgun keyword), null-byte prm_reward, oversize prm_reward.
|
|
50
|
+
- [ ] Step 2: Run → fail (fields absent).
|
|
51
|
+
- [ ] Step 3: Add fields + `field_validator("prm_reward", mode="before")` (null-byte/non-str/len≤512 reject) + SoupConfig `_validate_prm_reward` cross-validator (gates task/backend/modality; footgun on aggregate). Mirror `_validate_rollout_backend`.
|
|
52
|
+
- [ ] Step 4: Run → PASS.
|
|
53
|
+
- [ ] Step 5: ruff + commit `feat(prm): schema prm_reward/prm_aggregate + cross-validators (v0.71.30)`.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Task 3: PRMScorer + build_prm_reward_fn (torch-lazy load + scoring)
|
|
58
|
+
|
|
59
|
+
**Files:**
|
|
60
|
+
- Modify: `src/soup_cli/utils/prm_reward.py`
|
|
61
|
+
- Test: `tests/test_v07130.py`
|
|
62
|
+
|
|
63
|
+
**Interfaces:**
|
|
64
|
+
- Consumes: `split_steps`, `aggregate_step_scores` (Task 1); `TrainingConfig` (Task 2).
|
|
65
|
+
- Produces: `PRMScorer(prm_path, aggregate, device="cpu", trust_remote_code=False)` with `__call__(completions, **kwargs) -> list[float]` and `__name__="prm_reward"`; `build_prm_reward_fn(tcfg, device, trust_remote_code) -> PRMScorer`; `load_reward_head_weights(prm_path) -> dict` helper.
|
|
66
|
+
|
|
67
|
+
- [ ] Step 1: Write failing `TestPRMScorer` — fixture: build a tiny `AutoModelForCausalLM` from a 2-layer config, attach `reward_head=nn.Linear(hidden,1)`, `save_pretrained(tmp)`; `PRMScorer(tmp,"min","cpu")` scores `[[{"role":"assistant","content":"step1\nstep2"}]]` → list len 1 of finite float. "not a PRM" fixture (base with no reward_head) → friendly `ValueError`/`RuntimeError` naming "reward_head". `build_prm_reward_fn` returns callable with `__name__=="prm_reward"`; outside-cwd path → containment reject.
|
|
68
|
+
- [ ] Step 2: Run → fail.
|
|
69
|
+
- [ ] Step 3: Implement. `load_reward_head_weights`: iterate `*.safetensors` in dir via `safetensors.safe_open`, collect `reward_head.*` tensors; empty→raise. `PRMScorer._ensure_loaded`: lazy tokenizer + `AutoModelForCausalLM.from_pretrained`, `reward_head=nn.Linear(hidden,1)`, `load_state_dict` the head, `eval()`+`requires_grad_(False)`+`.to(device)`. `__call__`: per completion → render prompt (from `kwargs["prompts"]`) + steps, tokenize, `no_grad` `output_hidden_states` forward, gather boundary hidden, `reward_head`→scalars, `aggregate_step_scores`. `build_prm_reward_fn`: realpath+commonpath containment for local paths, trust_remote_code probe+warn.
|
|
70
|
+
- [ ] Step 4: Run → PASS.
|
|
71
|
+
- [ ] Step 5: ruff + commit `feat(prm): PRMScorer + build_prm_reward_fn (safetensors head load) (v0.71.30)`.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### Task 4: GRPO integration
|
|
76
|
+
|
|
77
|
+
**Files:**
|
|
78
|
+
- Modify: `src/soup_cli/trainer/grpo.py` (`setup()`, the `load_reward_fn` block ~L224-229)
|
|
79
|
+
- Test: `tests/test_v07130.py`
|
|
80
|
+
|
|
81
|
+
**Interfaces:**
|
|
82
|
+
- Consumes: `build_prm_reward_fn` (Task 3).
|
|
83
|
+
|
|
84
|
+
- [ ] Step 1: Write failing `TestGrpoPrmWiring` — construct a SoupConfig with `prm_reward` set, monkeypatch `build_prm_reward_fn` to a sentinel, call the reward-selection path (extract a small helper `_select_reward_fn(tcfg, device, trust)` if cleaner, or assert via the setup path with mocked model load), assert the PRM scorer is chosen (not `load_reward_fn`).
|
|
85
|
+
- [ ] Step 2: Run → fail.
|
|
86
|
+
- [ ] Step 3: In `setup()`: `if tcfg.prm_reward is not None: reward_fn = build_prm_reward_fn(tcfg, self.device, self._trust_remote_code) else: reward_fn = load_reward_fn(...)`. Keep the shaping+buffer wrapping downstream unchanged.
|
|
87
|
+
- [ ] Step 4: Run → PASS.
|
|
88
|
+
- [ ] Step 5: ruff + commit `feat(prm): wire PRM reward into GRPO setup (v0.71.30)`.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
### Task 5: Bundled rollout envs
|
|
93
|
+
|
|
94
|
+
**Files:**
|
|
95
|
+
- Create: `src/soup_cli/envs/__init__.py`, `calculator.py`, `retrieval_qa.py`, `guess_number.py`
|
|
96
|
+
- Test: `tests/test_v07130.py`
|
|
97
|
+
|
|
98
|
+
**Interfaces:**
|
|
99
|
+
- Produces: `soup_cli.envs.calculator:rollout`, `...retrieval_qa:rollout`, `...guess_number:rollout` — each `rollout(prompts) -> list[{"prompt": str, "answer": str}]`, deterministic (seeded `random.Random`), no I/O.
|
|
100
|
+
|
|
101
|
+
- [ ] Step 1: Write failing `TestEnvs` — each `rollout([])` returns non-empty rows; every row passes `agent_rollout._normalise_rollout_rows(rows, "openenv")`; determinism (two calls equal); calculator answers verified (parse "a OP b" from prompt, compute, assert == answer).
|
|
102
|
+
- [ ] Step 2: Run → fail.
|
|
103
|
+
- [ ] Step 3: Implement 3 modules. Each builds a fixed count of {prompt, answer} rows via `random.Random(seed)` (fixed seed → deterministic; no `Math.random`/wall-clock). calculator: arithmetic; retrieval_qa: doc+question, answer=span; guess_number: constraint deduction puzzles with a unique integer answer.
|
|
104
|
+
- [ ] Step 4: Run → PASS.
|
|
105
|
+
- [ ] Step 5: ruff + commit `feat(envs): bundled calculator/retrieval-qa/guess-number rollout envs (v0.71.30)`.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Task 6: Recipes + no-top-level-torch AST test
|
|
110
|
+
|
|
111
|
+
**Files:**
|
|
112
|
+
- Modify: `src/soup_cli/recipes/catalog.py` (+3 GRPO env recipes)
|
|
113
|
+
- Test: `tests/test_v07130.py`
|
|
114
|
+
|
|
115
|
+
- [ ] Step 1: Write failing `TestRecipes` (3 new recipe names resolve + their YAML parses via `load_config_from_string`) + `TestNoTopLevelTorch` (AST-parse `utils/prm_reward.py`, assert no top-level `import torch/transformers/peft`).
|
|
116
|
+
- [ ] Step 2: Run → fail.
|
|
117
|
+
- [ ] Step 3: Add `grpo-env-calculator` / `grpo-env-retrieval-qa` / `grpo-env-guess-number` RecipeMeta entries (SmolLM2-135M, task=grpo, rollout_backend=openenv, rollout_func=`soup_cli.envs.*:rollout`, reward_fn=math/accuracy). Confirm the no-top-level-torch already holds.
|
|
118
|
+
- [ ] Step 4: Run → PASS.
|
|
119
|
+
- [ ] Step 5: ruff + commit `feat(recipes): 3 GRPO env recipes + AST purity test (v0.71.30)`.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Task 7: Release docs (Release Checklist steps 7-13)
|
|
124
|
+
|
|
125
|
+
Version bump (`pyproject.toml` + `__init__.py` → 0.71.30); CHANGELOG; CLAUDE.md (arch line for `utils/prm_reward.py` + `envs/`, schema field list, CLI/train notes, recipe count 134→137, test-count refs, history-roll to `.claude/history/release-notes.md` + `tests-index.md`); README What's New; `docs/training.md` + `docs/commands.md`; CONTRIBUTING counts; plan.md flip. Handled after Tasks 1-6 pass the 5-review round + Step-6 smoke.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Self-review
|
|
130
|
+
|
|
131
|
+
- **Spec coverage:** Part A schema (T2) + kernels (T1) + scorer (T3) + wiring (T4); Part B envs (T5) + recipes (T6); docs (T7). ✅
|
|
132
|
+
- **Type consistency:** `split_steps`/`aggregate_step_scores` (T1) consumed by `PRMScorer` (T3); `build_prm_reward_fn` (T3) consumed by grpo (T4); `rollout` signature uniform (T5). ✅
|
|
133
|
+
- **Placeholders:** none — each task has concrete test targets + implementation sketch (full code written during TDD RED/GREEN).
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# v0.71.30 — PRM-guided GRPO + bundled rollout envs — Design
|
|
2
|
+
|
|
3
|
+
**Status:** approved 2026-07-05
|
|
4
|
+
**Slot:** v0.71.30 (first `[ ]` patch in `.claude/plan.md`)
|
|
5
|
+
**Type:** net-new mechanism (PRM-as-per-step-reward adapter + bundled envs package)
|
|
6
|
+
|
|
7
|
+
## Pitch
|
|
8
|
+
|
|
9
|
+
Use a trained PRM (the v0.53.11 `PRMTrainerWrapper`, live) as a **per-step reward inside
|
|
10
|
+
GRPO** — the o1-era process-supervision training signal. Plus bundle 3 pure-python toy
|
|
11
|
+
"environments" so the live `openenv` rollout path (#125) runs out-of-the-box.
|
|
12
|
+
|
|
13
|
+
**Honesty constraint (this is an RL feature — cannot ship schema-only):** validation is
|
|
14
|
+
**proof-of-mechanism only** on a tiny model (SmolLM2-135M) + a tiny synthetic PRM. It is NOT
|
|
15
|
+
a 7B / real-PRM / production claim. Scale ask extends #286. State this loudly in the PR,
|
|
16
|
+
CHANGELOG, release notes, and CLAUDE.md known-limitations. Mirrors the v0.71.26 framing.
|
|
17
|
+
|
|
18
|
+
## Decisions locked
|
|
19
|
+
|
|
20
|
+
- **PRM reward role = sole reward (replace).** When `training.prm_reward` is set, the PRM
|
|
21
|
+
scorer becomes THE reward function, replacing `reward_fn`. Simplest wiring — drops into the
|
|
22
|
+
existing single-fn shaping + buffer seam. Matches the "PRM reward curve" smoke.
|
|
23
|
+
- **PRM artifact = Soup-trained PRM only (v1).** Load base `AutoModelForCausalLM`, re-attach
|
|
24
|
+
`reward_head=nn.Linear(hidden,1)`, and load its weights from the saved `model.safetensors`
|
|
25
|
+
(`reward_head.*` keys). HF `AutoModelForSequenceClassification(num_labels=1)` interop is a
|
|
26
|
+
deferred follow-up.
|
|
27
|
+
- **Envs = deterministic single-shot seeders**, not interactive multi-turn episodes. The live
|
|
28
|
+
`openenv` contract calls `fn(seed_prompts)` — model/tokenizer are NOT passed — so an env is a
|
|
29
|
+
prompt+answer *generator* scored by the existing `accuracy`/`math` reward.
|
|
30
|
+
- **Aggregation default = `min`** (weakest-link; Lightman et al. "Let's Verify Step by Step").
|
|
31
|
+
- **Step split = newline heuristic (v1).**
|
|
32
|
+
|
|
33
|
+
## Reuse map (verified in-repo 2026-07-05)
|
|
34
|
+
|
|
35
|
+
- Reward seam: `trainer/grpo.py::setup()` loads a single `reward_fn` via
|
|
36
|
+
`rewards.load_reward_fn(spec)`, then optionally wraps with
|
|
37
|
+
`reward_hack_control.apply_reward_shaping` + `rl_signal_buffer.wrap_reward_funcs(buffer)`
|
|
38
|
+
(the v0.71.26 mitigation seam). A PRM reward is just a `(completions, **kwargs) -> list[float]`
|
|
39
|
+
callable → rides that seam unchanged.
|
|
40
|
+
- PRM artifact: `trainer/prm.py::PRMTrainerWrapper` sets `base_model.reward_head =
|
|
41
|
+
nn.Linear(hidden,1,bias=True)` and `save_model`s the full model → the head weights live inside
|
|
42
|
+
`model.safetensors` under `reward_head.*` (base `from_pretrained` drops them as "unexpected").
|
|
43
|
+
- Scoring math mirror: `PRMTrainerWrapper.compute_loss` — forward `output_hidden_states=True`,
|
|
44
|
+
gather `last_hidden` at step-boundary positions, project via `reward_head`.
|
|
45
|
+
- Rollout: `utils/agent_rollout.py::launch_rollout` — `openenv` resolves `rollout_func`
|
|
46
|
+
(`module:fn`) and calls `fn(seed_prompts)`; rows go through `_normalise_rollout_rows`
|
|
47
|
+
(caps + anti-smuggle → `{prompt, answer?}`-only).
|
|
48
|
+
- Schema patterns: `rollout_func` field_validator + `_validate_rollout_backend` cross-validator;
|
|
49
|
+
`verifiable_domain` `reward_fn` cross-validator (`schema.py`).
|
|
50
|
+
|
|
51
|
+
## Part A — PRM reward
|
|
52
|
+
|
|
53
|
+
### Schema (`config/schema.py`, `TrainingConfig`)
|
|
54
|
+
|
|
55
|
+
- `prm_reward: Optional[str] = None` — path (or HF id) to a Soup-trained PRM.
|
|
56
|
+
`field_validator(mode="before")` rejects null-byte / non-str / oversize (shape only;
|
|
57
|
+
filesystem containment enforced at load, TOCTOU-safe).
|
|
58
|
+
- `prm_aggregate: Literal["min","prod","last"] = "min"`.
|
|
59
|
+
- `SoupConfig` cross-validator: `prm_reward` set ⇒ `task=='grpo'`, `backend=='transformers'`
|
|
60
|
+
(reward runs a transformers forward — mlx/unsloth rejected), `modality=='text'`;
|
|
61
|
+
`prm_aggregate != "min"` while `prm_reward is None` → footgun reject.
|
|
62
|
+
|
|
63
|
+
### New module `utils/prm_reward.py` (NO top-level torch)
|
|
64
|
+
|
|
65
|
+
- `split_steps(text: str) -> list[str]` — newline heuristic v1; drop empty/whitespace; cap
|
|
66
|
+
count (`_MAX_STEPS`) and per-step chars. Pure.
|
|
67
|
+
- `aggregate_step_scores(scores: list[float], mode: str) -> float` — min/prod/last;
|
|
68
|
+
empty→0.0; non-finite-safe; bad-mode `ValueError`; bool guard. Pure kernel.
|
|
69
|
+
- `PRMScorer` — stateful callable:
|
|
70
|
+
- `__init__(prm_path, aggregate, device, trust_remote_code)` — stores config, no load yet.
|
|
71
|
+
- `_ensure_loaded()` — lazy: tokenizer + base `AutoModelForCausalLM` (dtype per device),
|
|
72
|
+
re-attach `reward_head`, load `reward_head.*` from any `*.safetensors` in the dir via
|
|
73
|
+
`safetensors.safe_open` (friendly error if absent), `eval()` + `requires_grad_(False)`,
|
|
74
|
+
move to device.
|
|
75
|
+
- `__call__(completions, **kwargs) -> list[float]` — per completion: render + prepend the
|
|
76
|
+
`prompts` kwarg as leading context (best-effort), `split_steps`, one `no_grad`
|
|
77
|
+
`output_hidden_states` forward, gather boundary hidden, `reward_head` → per-step scalars,
|
|
78
|
+
`aggregate_step_scores`. Per-completion loop (no batching — fine for tiny; perf follow-up).
|
|
79
|
+
- `build_prm_reward_fn(tcfg, device, trust_remote_code) -> PRMScorer` — validates local-path
|
|
80
|
+
containment (realpath + commonpath under cwd), `trust_remote_code` probe+warn, returns scorer.
|
|
81
|
+
|
|
82
|
+
### Integration (`trainer/grpo.py::setup()`)
|
|
83
|
+
|
|
84
|
+
One insertion before `load_reward_fn`: if `tcfg.prm_reward is not None` →
|
|
85
|
+
`reward_fn = build_prm_reward_fn(tcfg, self.device, self._trust_remote_code)` instead of
|
|
86
|
+
`load_reward_fn(...)`. The existing `apply_reward_shaping` + `wrap_reward_funcs` wrapping applies
|
|
87
|
+
unchanged → the v0.71.26 mitigation controller + `mitigation_log.jsonl` observe the PRM reward.
|
|
88
|
+
|
|
89
|
+
## Part B — bundled rollout envs
|
|
90
|
+
|
|
91
|
+
### New package `soup_cli/envs/`
|
|
92
|
+
|
|
93
|
+
Each module exposes `rollout(prompts) -> list[{"prompt", "answer"}]`, deterministic (seeded RNG,
|
|
94
|
+
no I/O / no network), usable as `soup_cli.envs.<name>:rollout` in `training.rollout_func`:
|
|
95
|
+
|
|
96
|
+
- `calculator.py` — arithmetic problems, answer = the number (`math`/`accuracy` reward).
|
|
97
|
+
- `retrieval_qa.py` — short document + question, answer = a span (`accuracy` reward).
|
|
98
|
+
- `guess_number.py` — single-shot number-**deduction** puzzles (constraints → unique answer;
|
|
99
|
+
honestly framed as deducible, not interactive guessing).
|
|
100
|
+
|
|
101
|
+
Rows flow through the existing `_normalise_rollout_rows` → replace the GRPO prompt dataset.
|
|
102
|
+
|
|
103
|
+
### Recipes (`recipes/catalog.py`, +3 → 137)
|
|
104
|
+
|
|
105
|
+
`grpo-env-calculator` / `grpo-env-retrieval-qa` / `grpo-env-guess-number` — SmolLM2-135M base,
|
|
106
|
+
`rollout_backend=openenv` + `rollout_func=soup_cli.envs.*:rollout` + reward. Parse-clean.
|
|
107
|
+
|
|
108
|
+
## Data flow
|
|
109
|
+
|
|
110
|
+
- **PRM:** dataset prompts → GRPO generates N completions → `PRMScorer(completions, prompts)` →
|
|
111
|
+
per completion: split steps → PRM forward → gather boundary hidden → `reward_head` → per-step
|
|
112
|
+
scalars → `aggregate(min/prod/last)` → scalar reward list → GRPO advantages.
|
|
113
|
+
- **Envs:** `rollout_func` seeds `{prompt, answer}` rows → replace GRPO prompt dataset → GRPO
|
|
114
|
+
trains with `accuracy`/`math` reward.
|
|
115
|
+
|
|
116
|
+
## Tests (`tests/test_v07130.py`)
|
|
117
|
+
|
|
118
|
+
- `split_steps` (newlines / empties / whitespace / count cap / char cap / non-str guard).
|
|
119
|
+
- `aggregate_step_scores` (min/prod/last correctness, empty→0, single, non-finite defensive,
|
|
120
|
+
bad-mode reject, bool guard).
|
|
121
|
+
- Schema parse + every cross-validator (task≠grpo, mlx/unsloth, modality≠text, footgun,
|
|
122
|
+
null-byte/oversize) — assert specific keywords.
|
|
123
|
+
- `PRMScorer` against a tiny **real saved PRM fixture** (2-layer CausalLM + reward_head →
|
|
124
|
+
`save_pretrained` → load → score → finite list of right length); "not a PRM" friendly error.
|
|
125
|
+
- grpo wiring: `prm_reward` set → PRM scorer built (inject/monkeypatch, CPU tiny).
|
|
126
|
+
- Each env's rows pass `_normalise_rollout_rows`; determinism; answers correct
|
|
127
|
+
(calculator arithmetic verified).
|
|
128
|
+
- 3 recipes parse via `load_config_from_string`; count bump.
|
|
129
|
+
- No-top-level-torch AST test on `utils/prm_reward.py`.
|
|
130
|
+
|
|
131
|
+
## Security
|
|
132
|
+
|
|
133
|
+
- `prm_reward` local path: realpath + commonpath containment under cwd at load; `safe_open`
|
|
134
|
+
(safetensors — no pickle) for the reward_head weights; O_NOFOLLOW where reading. HF id (no
|
|
135
|
+
local path) allowed via `from_pretrained`. `trust_remote_code=False` probe+warn.
|
|
136
|
+
- Bounds: `_MAX_STEPS`, per-step char cap, aggregate mode allowlist.
|
|
137
|
+
- Envs: pure python, deterministic, no I/O / no network; rows re-validated by
|
|
138
|
+
`_normalise_rollout_rows` (caps + anti-smuggle).
|
|
139
|
+
|
|
140
|
+
## Known limitations (release notes + CLAUDE.md)
|
|
141
|
+
|
|
142
|
+
1. Proof-of-mechanism only — tiny PRM, synthetic data; scale ask extends #286.
|
|
143
|
+
2. Envs are deterministic single-shot seeders, not interactive multi-turn model-in-the-loop
|
|
144
|
+
episodes — the live `openenv` contract passes only `prompts`.
|
|
145
|
+
3. Step split = newline heuristic (v1); PRM scored per-completion, no batching (perf follow-up).
|
|
146
|
+
4. PRM artifact v1 = Soup-trained format only (HF SeqClassification interop deferred).
|
|
147
|
+
|
|
148
|
+
## Smoke (RTX 3050 / CPU)
|
|
149
|
+
|
|
150
|
+
Train a tiny PRM on synthetic step-labelled math → GRPO on SmolLM2-135M with `prm_reward`,
|
|
151
|
+
reward curve logged (mitigation log reused); one env end-to-end GRPO run (mirrors #125). Plus
|
|
152
|
+
every validator-reject config.
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
- [EBFT / GDPO Loss Variants](#ebft--gdpo-loss-variants)
|
|
16
16
|
- [GRPO Objective Variants](#grpo-objective-variants)
|
|
17
17
|
- [Process Reward Model (PRM)](#process-reward-model-prm)
|
|
18
|
+
- [PRM-guided GRPO (process-supervised RL)](#prm-guided-grpo-process-supervised-rl)
|
|
18
19
|
- [Weighted Multi-Objective Preference Loss](#weighted-multi-objective-preference-loss)
|
|
19
20
|
- [MoE Model Support](#moe-model-support)
|
|
20
21
|
- [Vision / Multimodal Fine-tuning](#vision--multimodal-fine-tuning)
|
|
@@ -343,7 +344,61 @@ training:
|
|
|
343
344
|
|
|
344
345
|
The trainer loads `AutoModelForCausalLM`, attaches an `nn.Linear(hidden, 1)`
|
|
345
346
|
reward head, and computes MSE between predicted scalars at step-boundary tokens
|
|
346
|
-
and the per-step labels.
|
|
347
|
+
and the per-step labels. The reward head is saved inside the model checkpoint
|
|
348
|
+
(`reward_head.*` in `model.safetensors`) and the tokenizer is saved alongside it,
|
|
349
|
+
so the resulting directory is loadable standalone.
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
## PRM-guided GRPO (process-supervised RL)
|
|
353
|
+
|
|
354
|
+
Use a trained PRM as the **per-step reward** inside GRPO — the o1-era
|
|
355
|
+
process-supervision signal. Set `training.prm_reward` to a PRM directory (a
|
|
356
|
+
`task=prm` checkpoint) or HF id; the PRM splits each generated completion into
|
|
357
|
+
reasoning steps (newline heuristic), scores every step with its reward head, and
|
|
358
|
+
folds the per-step scores into one scalar reward that GRPO optimises. It
|
|
359
|
+
**replaces** `reward_fn` and rides the existing reward-shaping +
|
|
360
|
+
reward-hack-mitigation seam, so the v0.71.26 controller still observes it (TRL
|
|
361
|
+
logs it as `rewards/prm_reward`).
|
|
362
|
+
|
|
363
|
+
```yaml
|
|
364
|
+
task: grpo
|
|
365
|
+
backend: transformers # required (the PRM reward runs a transformers forward)
|
|
366
|
+
modality: text # required
|
|
367
|
+
data:
|
|
368
|
+
format: chatml
|
|
369
|
+
train: ./grpo_prompts.jsonl
|
|
370
|
+
training:
|
|
371
|
+
prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir (or HF id)
|
|
372
|
+
prm_aggregate: min # weakest-link (default) | prod | last
|
|
373
|
+
num_generations: 4
|
|
374
|
+
grpo_beta: 0.04
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
`prm_aggregate='min'` (weakest-link, the standard PRM aggregation) is the safe
|
|
378
|
+
default; `prod` assumes calibrated `[0,1]` step scores (Soup's PRM head is
|
|
379
|
+
trained with unconstrained MSE, so `prod` can blow up on uncalibrated labels).
|
|
380
|
+
|
|
381
|
+
**Bundled rollout environments.** Three deterministic pure-Python toy
|
|
382
|
+
environments seed the openenv rollout path out-of-the-box — pair any of them
|
|
383
|
+
with `rollout_backend=openenv`:
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
training:
|
|
387
|
+
rollout_backend: openenv
|
|
388
|
+
rollout_func: soup_cli.envs.calculator:rollout # or retrieval_qa / guess_number
|
|
389
|
+
reward_fn: verifiable
|
|
390
|
+
verifiable_domain: math
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
Ready-made recipes: `grpo-env-calculator`, `grpo-env-retrieval-qa`,
|
|
394
|
+
`grpo-env-guess-number`. The environments are deterministic single-shot
|
|
395
|
+
prompt/answer *seeders* (the live openenv contract passes only the seed prompts,
|
|
396
|
+
not the model) — not interactive multi-turn episodes.
|
|
397
|
+
|
|
398
|
+
**Scope:** proof-of-mechanism only — validated on SmolLM2-135M with a tiny
|
|
399
|
+
synthetic PRM (the PRM reward scores good completions above bad and drives GRPO's
|
|
400
|
+
advantages). Not a production reward-model claim; scale validation is help-wanted
|
|
401
|
+
(#286).
|
|
347
402
|
|
|
348
403
|
|
|
349
404
|
## Weighted Multi-Objective Preference Loss
|