soup-cli 0.71.39__tar.gz → 0.71.40__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.39 → soup_cli-0.71.40}/CHANGELOG.md +39 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/CONTRIBUTING.md +1 -1
- {soup_cli-0.71.39 → soup_cli-0.71.40}/PKG-INFO +26 -18
- {soup_cli-0.71.39 → soup_cli-0.71.40}/README.md +26 -18
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/commands.md +4 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/training.md +31 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/pyproject.toml +1 -1
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cli.py +12 -0
- soup_cli-0.71.40/src/soup_cli/commands/reward.py +225 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/schema.py +61 -4
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/calculator.py +2 -1
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/guess_number.py +1 -1
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/grpo.py +9 -3
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/rewards.py +41 -0
- soup_cli-0.71.40/src/soup_cli/utils/reward_synth.py +716 -0
- soup_cli-0.71.40/tests/test_v07140.py +855 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.dockerignore +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.gitignore +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.mailmap +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/AGENTS.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/CODEOWNERS +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/Dockerfile +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/LICENSE +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/NOTICE +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/SECURITY.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docker-compose.yml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/README.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/compliance.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/data.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/evaluation.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/models.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/README.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/soup.png +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/chat.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/code.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/medical.yaml +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/__init__.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/conftest.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_audio.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bco.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bench.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_callback.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cans.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_chat.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cli.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_config.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cost.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_diff.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_display.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_errors.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_export.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_formats.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_generate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_infer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_init.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_kto.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_loader.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_merge.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_moe.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_packing.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_performance.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_profile.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_progress.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_push.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_qat.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_registry.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_relora.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_replay.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_resume.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_runs.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_serve.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tui.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07123.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07124.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07125.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07126.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07127.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07128.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07129.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07130.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07131.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07132.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07133.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07134.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07135.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07136.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07137.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07138.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07139.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_validator.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_vision.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_warmup.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_why.py +0 -0
- {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,45 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.40] - 2026-07-19
|
|
16
|
+
|
|
17
|
+
**`soup reward synth`: auto-generate a deterministic reward verifier from your data.**
|
|
18
|
+
Point it at a JSONL of reference (gold) outputs and it infers a verifier, emits a
|
|
19
|
+
readable / committable `.py` reward function, and — the moat — *refuses* to emit one
|
|
20
|
+
that can't tell your references from auto-generated bad answers. Nothing in
|
|
21
|
+
TRL / Unsloth / Axolotl / OpenRLHF synthesizes a reward; every reward today is
|
|
22
|
+
hand-written, hand-picked, or a trained-weights artifact.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- **`soup reward synth <references.jsonl> -o reward.py`** — deterministic verifier
|
|
27
|
+
synthesis. Four families, auto-detected (or pick with `--kind`): `numeric`
|
|
28
|
+
(last-number / `\boxed{}` / `####` extraction, exact or `--tolerance`), `json_schema`
|
|
29
|
+
(induced keys + types + required), `regex` (positional char-classes over
|
|
30
|
+
equal-length golds), `tool_call` (per-tool `required`/`allowed` argument binding).
|
|
31
|
+
The emitted file is self-contained and rides `load_reward_fn`'s existing `.py`
|
|
32
|
+
path — no new trusted-exec surface; you read, edit, commit, and diff it.
|
|
33
|
+
- **Mandatory calibration report** — the synthesized verifier is loaded back and run
|
|
34
|
+
against its own references (must accept ≥90%) and auto-perturbed negatives (must
|
|
35
|
+
reject). A degenerate always-accept verifier is **refused** (`exit 2`), never
|
|
36
|
+
silently emitted. `--plan-only` reports the induced spec without writing;
|
|
37
|
+
`--output-report` persists the calibration JSON.
|
|
38
|
+
- **Comma-separated `reward_fn` (`"accuracy,format"`)** now trains — it resolves to a
|
|
39
|
+
reward *ensemble* (`GRPOTrainer(reward_funcs=[...])`, and unlocks the `rm_ensemble`
|
|
40
|
+
reward-hack detector which needs ≥2 rewards). GRPO-only, validated at config-parse
|
|
41
|
+
time. Fixes a recipe (`deepseek-v3-reasoning`) that shipped exactly this and
|
|
42
|
+
previously crashed with `Unknown reward function` (#311).
|
|
43
|
+
|
|
44
|
+
### Changed / Fixed
|
|
45
|
+
|
|
46
|
+
- `training.reward_fn` gains a field validator (null-byte / blank / oversize /
|
|
47
|
+
empty-comma-segment rejection) — the oldest arbitrary-code field was the least
|
|
48
|
+
guarded. Comma + `verifiable` without a `verifiable_domain` now fails at parse
|
|
49
|
+
time like the bare `verifiable` form.
|
|
50
|
+
- `envs/calculator.py` / `envs/guess_number.py` docstrings corrected: the reward is
|
|
51
|
+
`reward_fn: verifiable` + `verifiable_domain: math` (the bare `reward_fn='math'`
|
|
52
|
+
they showed was never valid).
|
|
53
|
+
|
|
15
54
|
## [0.71.39] - 2026-07-19
|
|
16
55
|
|
|
17
56
|
**"CI for weights, not prompts": close the evidence loop.** `soup ship`'s verdict is
|
|
@@ -120,7 +120,7 @@ src/soup_cli/
|
|
|
120
120
|
templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
|
|
121
121
|
ui/ - Web UI (FastAPI + HTML/JS SPA)
|
|
122
122
|
|
|
123
|
-
tests/ - Test suite (
|
|
123
|
+
tests/ - Test suite (318 files, 16490 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.40
|
|
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,29 +193,37 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
193
193
|
|
|
194
194
|
## What's New
|
|
195
195
|
|
|
196
|
-
**v0.71.
|
|
196
|
+
**v0.71.40 — `soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
|
|
197
197
|
|
|
198
|
-
- **
|
|
199
|
-
`--
|
|
200
|
-
|
|
201
|
-
- **
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
- **
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
|
|
198
|
+
- **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
|
|
199
|
+
exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
|
|
200
|
+
(per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
|
|
201
|
+
- **A calibration report is the moat.** The verifier is loaded back and run against its own references
|
|
202
|
+
(must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
|
|
203
|
+
is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
|
|
204
|
+
- **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
|
|
205
|
+
edit, commit, and diff it like any other reward.
|
|
206
|
+
- **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
|
|
207
|
+
the `rm_ensemble` reward-hack detector) — a recipe that shipped exactly this used to crash. (#311)
|
|
209
208
|
|
|
210
209
|
```bash
|
|
211
|
-
#
|
|
212
|
-
soup
|
|
210
|
+
# synth a verifier from reference answers, calibrate it, keep it only if it discriminates
|
|
211
|
+
soup reward synth references.jsonl -o reward.py --output-report calib.json
|
|
213
212
|
|
|
214
|
-
#
|
|
215
|
-
|
|
216
|
-
soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
|
|
213
|
+
# then train against the reward you just generated
|
|
214
|
+
# training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
|
|
217
215
|
```
|
|
218
216
|
|
|
217
|
+
<details>
|
|
218
|
+
<summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
|
|
219
|
+
|
|
220
|
+
`soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
|
|
221
|
+
run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
|
|
222
|
+
reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).
|
|
223
|
+
`soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
|
|
224
|
+
|
|
225
|
+
</details>
|
|
226
|
+
|
|
219
227
|
<details>
|
|
220
228
|
<summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
|
|
221
229
|
|
|
@@ -49,29 +49,37 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.71.
|
|
53
|
-
|
|
54
|
-
- **
|
|
55
|
-
`--
|
|
56
|
-
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
- **
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
|
|
52
|
+
**v0.71.40 — `soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
|
|
53
|
+
|
|
54
|
+
- **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
|
|
55
|
+
exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
|
|
56
|
+
(per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
|
|
57
|
+
- **A calibration report is the moat.** The verifier is loaded back and run against its own references
|
|
58
|
+
(must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
|
|
59
|
+
is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
|
|
60
|
+
- **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
|
|
61
|
+
edit, commit, and diff it like any other reward.
|
|
62
|
+
- **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
|
|
63
|
+
the `rm_ensemble` reward-hack detector) — a recipe that shipped exactly this used to crash. (#311)
|
|
65
64
|
|
|
66
65
|
```bash
|
|
67
|
-
#
|
|
68
|
-
soup
|
|
66
|
+
# synth a verifier from reference answers, calibrate it, keep it only if it discriminates
|
|
67
|
+
soup reward synth references.jsonl -o reward.py --output-report calib.json
|
|
69
68
|
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
|
|
69
|
+
# then train against the reward you just generated
|
|
70
|
+
# training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
|
|
73
71
|
```
|
|
74
72
|
|
|
73
|
+
<details>
|
|
74
|
+
<summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
|
|
75
|
+
|
|
76
|
+
`soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
|
|
77
|
+
run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
|
|
78
|
+
reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).
|
|
79
|
+
`soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
|
|
80
|
+
|
|
81
|
+
</details>
|
|
82
|
+
|
|
75
83
|
<details>
|
|
76
84
|
<summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
|
|
77
85
|
|
|
@@ -182,6 +182,10 @@ soup draft measure ... --min-acceptance 0.6 -o report.json Exit 2 below the flo
|
|
|
182
182
|
soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/ Distil a DENSE speculative-decoding draft + register it (v0.71.33)
|
|
183
183
|
soup draft distill ... --steps N --device cpu --force --plan-only Training budget / device / overwrite -o / render the config only
|
|
184
184
|
soup draft list List local drafts that `soup serve --auto-spec` will pick up (v0.71.33)
|
|
185
|
+
soup reward synth refs.jsonl -o reward.py Synthesize a deterministic reward verifier from gold outputs (v0.71.40)
|
|
186
|
+
soup reward synth ... --kind numeric|json_schema|regex|tool_call Force a verifier family (default: auto-detect)
|
|
187
|
+
soup reward synth ... --plan-only Report the induced spec + calibration plan; write nothing
|
|
188
|
+
soup reward synth ... --output-report r.json --min-discrimination 0.5 Save the calibration JSON / set the refusal threshold (exit 0 emit / 2 refuse / 1 error)
|
|
185
189
|
soup tui Full-screen Textual dashboard (requires [tui] extra)
|
|
186
190
|
soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
|
|
187
191
|
soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
|
|
@@ -866,6 +866,37 @@ training:
|
|
|
866
866
|
reward_fn: ./my_reward.py
|
|
867
867
|
```
|
|
868
868
|
|
|
869
|
+
**Reward ensembles** — list several rewards, comma-separated, and they combine (GRPO only).
|
|
870
|
+
This also unlocks the `rm_ensemble` reward-hack detector, which needs ≥ 2 rewards:
|
|
871
|
+
```yaml
|
|
872
|
+
training:
|
|
873
|
+
reward_fn: "accuracy,format" # both are scored every step
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
### Synthesize a verifier from your data (`soup reward synth`)
|
|
877
|
+
|
|
878
|
+
Don't hand-write a verifier — generate one from reference (gold) outputs. Soup infers a
|
|
879
|
+
*deterministic* verifier (numeric / JSON-schema / regex / tool-call), writes a readable, editable
|
|
880
|
+
`.py`, and **refuses to emit** one that can't tell your references from auto-generated bad answers
|
|
881
|
+
(the mandatory calibration report). The emitted file is a normal `reward_fn: reward.py`.
|
|
882
|
+
|
|
883
|
+
```bash
|
|
884
|
+
# infer + calibrate + emit (exit 0 kept, 2 refused, 1 error)
|
|
885
|
+
soup reward synth references.jsonl -o reward.py --output-report calib.json
|
|
886
|
+
|
|
887
|
+
# preview the induced spec without writing anything
|
|
888
|
+
soup reward synth references.jsonl --plan-only
|
|
889
|
+
|
|
890
|
+
# force a family instead of auto-detecting
|
|
891
|
+
soup reward synth answers.jsonl -o reward.py --kind numeric --tolerance 1e-6
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
References are a JSONL where each row's gold answer is in an `answer` field (override with
|
|
895
|
+
`--field`) or the last assistant turn of a `messages` list. `--min-discrimination` sets how
|
|
896
|
+
strongly the verifier must separate references from perturbed negatives before it's emitted.
|
|
897
|
+
v1 is deterministic families only — a `\boxed{}`/`####` marker helps the numeric verifier, and
|
|
898
|
+
completions are prompted to mark their answer (standard RLVR practice).
|
|
899
|
+
|
|
869
900
|
### Verifiable Rewards (RLVR)
|
|
870
901
|
|
|
871
902
|
Use `reward_fn: verifiable` with a `verifiable_domain` for deterministic, math-checkable rewards — no judge model, no heuristics. Great for GRPO on math, code, or structured-output tasks.
|
|
@@ -563,6 +563,18 @@ app.add_typer(
|
|
|
563
563
|
),
|
|
564
564
|
)
|
|
565
565
|
|
|
566
|
+
# v0.71.40 — `soup reward synth` auto-generate a deterministic verifier.
|
|
567
|
+
from soup_cli.commands import reward as _reward_cmd # noqa: E402
|
|
568
|
+
|
|
569
|
+
app.add_typer(
|
|
570
|
+
_reward_cmd.app,
|
|
571
|
+
name="reward",
|
|
572
|
+
help=(
|
|
573
|
+
"Synthesize a deterministic reward verifier from reference outputs, with "
|
|
574
|
+
"a calibration report that refuses degenerate verifiers (v0.71.40)."
|
|
575
|
+
),
|
|
576
|
+
)
|
|
577
|
+
|
|
566
578
|
|
|
567
579
|
def _rewrite_advise_argv(argv: list) -> list:
|
|
568
580
|
"""Inject `run` between `advise` and a non-subcommand first argument.
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"""soup reward — synthesize a deterministic reward verifier (v0.71.40).
|
|
2
|
+
|
|
3
|
+
soup reward synth <references.jsonl> -o reward.py
|
|
4
|
+
[--kind auto|numeric|json_schema|regex|tool_call]
|
|
5
|
+
|
|
6
|
+
Infers a deterministic verifier from a dataset of reference (gold) outputs, emits a
|
|
7
|
+
readable / committable ``.py`` that rides ``load_reward_fn``'s existing ``.py`` path,
|
|
8
|
+
and REFUSES to emit a degenerate verifier via a mandatory calibration report.
|
|
9
|
+
|
|
10
|
+
Exit codes mirror ``soup ship`` / ``soup shrink``: 0 = emitted, 2 = refused (the
|
|
11
|
+
verifier could not discriminate references from perturbed negatives), 1 = usage /
|
|
12
|
+
runtime error.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import math
|
|
19
|
+
import os
|
|
20
|
+
from typing import NoReturn, Optional
|
|
21
|
+
|
|
22
|
+
import typer
|
|
23
|
+
from rich.console import Console
|
|
24
|
+
from rich.markup import escape
|
|
25
|
+
from rich.panel import Panel
|
|
26
|
+
from rich.table import Table
|
|
27
|
+
|
|
28
|
+
from soup_cli.utils import reward_synth as rs
|
|
29
|
+
from soup_cli.utils.paths import atomic_write_text, enforce_under_cwd_and_no_symlink
|
|
30
|
+
|
|
31
|
+
app = typer.Typer(help="Synthesize a deterministic reward verifier from reference outputs.")
|
|
32
|
+
console = Console()
|
|
33
|
+
|
|
34
|
+
_MAX_INPUT_BYTES = 64 * 1024 * 1024
|
|
35
|
+
_MAX_ROWS = 1_000_000
|
|
36
|
+
_ALLOWED_KINDS = ("auto",) + rs.KINDS
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@app.callback()
|
|
40
|
+
def _reward() -> None:
|
|
41
|
+
"""Reward-verifier tooling. Forces ``synth`` to be a named subcommand (a
|
|
42
|
+
single-command Typer app otherwise collapses and eats the subcommand token)."""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _fail(message: str, code: int = 1) -> NoReturn:
|
|
46
|
+
"""Print a red error and exit (raises internally — a forgotten ``raise`` at a
|
|
47
|
+
call site can never silently become a no-op; mirrors ``commands/ship.py``)."""
|
|
48
|
+
console.print(f"[red]{escape(message)}[/]")
|
|
49
|
+
raise typer.Exit(code)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _read_jsonl(path: str, label: str) -> list[dict]:
|
|
53
|
+
"""Read a JSONL file: cwd-contained, O_NOFOLLOW, size- and row-capped."""
|
|
54
|
+
enforce_under_cwd_and_no_symlink(path, label)
|
|
55
|
+
flags = os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0)
|
|
56
|
+
try:
|
|
57
|
+
fd = os.open(path, flags)
|
|
58
|
+
except OSError as exc:
|
|
59
|
+
raise ValueError(f"{label} unreadable: {exc}") from exc
|
|
60
|
+
rows: list[dict] = []
|
|
61
|
+
with os.fdopen(fd, "r", encoding="utf-8") as handle:
|
|
62
|
+
if os.fstat(handle.fileno()).st_size > _MAX_INPUT_BYTES:
|
|
63
|
+
raise ValueError(f"{label} exceeds {_MAX_INPUT_BYTES} bytes")
|
|
64
|
+
for line in handle:
|
|
65
|
+
line = line.strip()
|
|
66
|
+
if not line:
|
|
67
|
+
continue
|
|
68
|
+
try:
|
|
69
|
+
row = json.loads(line)
|
|
70
|
+
except json.JSONDecodeError:
|
|
71
|
+
continue
|
|
72
|
+
if isinstance(row, dict):
|
|
73
|
+
rows.append(row)
|
|
74
|
+
if len(rows) >= _MAX_ROWS:
|
|
75
|
+
break
|
|
76
|
+
return rows
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _spec_summary(kind: str, spec: object) -> str:
|
|
80
|
+
"""One-line human summary of the induced spec (for --plan-only / the panel)."""
|
|
81
|
+
if kind == "numeric" and isinstance(spec, rs.NumericSpec):
|
|
82
|
+
return f"numeric (float={spec.is_float}, tolerance={spec.tolerance})"
|
|
83
|
+
if kind == "json_schema" and isinstance(spec, dict):
|
|
84
|
+
props = ", ".join(sorted(spec.get("properties", {}))) or "(none)"
|
|
85
|
+
return f"json_schema (type={spec.get('type')}, keys={props})"
|
|
86
|
+
if kind == "tool_call" and isinstance(spec, rs.ToolCallSpec):
|
|
87
|
+
return f"tool_call (names={list(spec.names)}, arg_keys={list(spec.arg_keys)})"
|
|
88
|
+
if kind == "regex":
|
|
89
|
+
return f"regex (pattern={spec})"
|
|
90
|
+
return kind
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _render_report_panel(report: rs.CalibrationReport, kind: str, out_path: str) -> Panel:
|
|
94
|
+
table = Table(show_header=False, box=None, pad_edge=False)
|
|
95
|
+
table.add_column(justify="right", style="dim")
|
|
96
|
+
table.add_column()
|
|
97
|
+
table.add_row("verifier kind", escape(kind))
|
|
98
|
+
table.add_row("references (accepted)", f"{report.positives} ({report.pos_accept:.0%})")
|
|
99
|
+
table.add_row("negatives (accepted)", f"{report.negatives} ({report.neg_accept:.0%})")
|
|
100
|
+
table.add_row("discrimination", f"{report.discrimination:.2f}")
|
|
101
|
+
table.add_row("precision", f"{report.precision:.2f}")
|
|
102
|
+
table.add_row("emitted", escape(out_path))
|
|
103
|
+
return Panel(table, title="[bold green]reward verifier synthesized[/]",
|
|
104
|
+
border_style="green")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@app.command()
|
|
108
|
+
def synth(
|
|
109
|
+
references: str = typer.Argument(
|
|
110
|
+
..., help="JSONL of reference (gold) outputs — a gold field or chat messages."
|
|
111
|
+
),
|
|
112
|
+
output: Optional[str] = typer.Option(
|
|
113
|
+
None, "-o", "--output", help="Where to write the verifier .py."
|
|
114
|
+
),
|
|
115
|
+
kind: str = typer.Option(
|
|
116
|
+
"auto", "--kind",
|
|
117
|
+
help="Verifier family: auto | numeric | json_schema | regex | tool_call.",
|
|
118
|
+
),
|
|
119
|
+
field: str = typer.Option(
|
|
120
|
+
"answer", "--field", help="Gold-output field (default: answer)."
|
|
121
|
+
),
|
|
122
|
+
tolerance: Optional[float] = typer.Option(
|
|
123
|
+
None, "--tolerance", help="Numeric match tolerance (numeric kind only)."
|
|
124
|
+
),
|
|
125
|
+
min_discrimination: float = typer.Option(
|
|
126
|
+
rs.DEFAULT_MIN_DISCRIMINATION, "--min-discrimination",
|
|
127
|
+
help="Refuse to emit unless (accept_rate refs - accept_rate negatives) >= this.",
|
|
128
|
+
),
|
|
129
|
+
force: bool = typer.Option(False, "--force", help="Overwrite an existing output."),
|
|
130
|
+
plan_only: bool = typer.Option(
|
|
131
|
+
False, "--plan-only", help="Detect + report the induced spec; write nothing."
|
|
132
|
+
),
|
|
133
|
+
output_report: Optional[str] = typer.Option(
|
|
134
|
+
None, "--output-report", help="Also write the calibration report as JSON."
|
|
135
|
+
),
|
|
136
|
+
) -> None:
|
|
137
|
+
"""Synthesize a deterministic reward verifier from reference outputs."""
|
|
138
|
+
if kind not in _ALLOWED_KINDS:
|
|
139
|
+
_fail(f"unknown --kind {kind!r}; options: {', '.join(_ALLOWED_KINDS)}")
|
|
140
|
+
if not 0.0 <= min_discrimination <= 1.0:
|
|
141
|
+
_fail("--min-discrimination must be in [0.0, 1.0]")
|
|
142
|
+
if tolerance is not None and (not math.isfinite(tolerance) or tolerance < 0):
|
|
143
|
+
_fail("--tolerance must be a finite, non-negative number")
|
|
144
|
+
|
|
145
|
+
# Read references.
|
|
146
|
+
try:
|
|
147
|
+
rows = _read_jsonl(references, "references path")
|
|
148
|
+
except (ValueError, OSError) as exc:
|
|
149
|
+
_fail(str(exc))
|
|
150
|
+
if not rows:
|
|
151
|
+
_fail("references file has no JSON-object rows")
|
|
152
|
+
|
|
153
|
+
# Detect + induce + render (no file written yet).
|
|
154
|
+
try:
|
|
155
|
+
result = rs.synthesize(rows, field=field, kind=kind, tolerance=tolerance,
|
|
156
|
+
rel_hint=(output or "reward.py"))
|
|
157
|
+
except (ValueError, TypeError) as exc:
|
|
158
|
+
_fail(str(exc))
|
|
159
|
+
|
|
160
|
+
if plan_only:
|
|
161
|
+
console.print(Panel(
|
|
162
|
+
escape(_spec_summary(result.kind, result.spec)),
|
|
163
|
+
title=f"[bold]plan: {escape(result.kind)} verifier[/]", border_style="cyan"))
|
|
164
|
+
raise typer.Exit(0)
|
|
165
|
+
|
|
166
|
+
# Output guards.
|
|
167
|
+
if not output:
|
|
168
|
+
_fail("must pass -o/--output to emit a verifier (or use --plan-only)")
|
|
169
|
+
if not output.endswith(".py"):
|
|
170
|
+
_fail(f"output must be a .py file, got {output!r}")
|
|
171
|
+
try:
|
|
172
|
+
enforce_under_cwd_and_no_symlink(output, "output path")
|
|
173
|
+
except (ValueError, OSError) as exc:
|
|
174
|
+
_fail(str(exc))
|
|
175
|
+
if os.path.exists(output) and not force:
|
|
176
|
+
_fail(f"{output!r} already exists — pass --force to overwrite")
|
|
177
|
+
# Validate the optional report path UP FRONT so a bad report path can never
|
|
178
|
+
# cause us to destroy an already-written, already-accepted verifier later.
|
|
179
|
+
if output_report:
|
|
180
|
+
try:
|
|
181
|
+
enforce_under_cwd_and_no_symlink(output_report, "report path")
|
|
182
|
+
except (ValueError, OSError) as exc:
|
|
183
|
+
_fail(str(exc))
|
|
184
|
+
|
|
185
|
+
# Write, then LOAD it back through the real reward-loader path (round-trip
|
|
186
|
+
# validation) and calibrate the loaded callable.
|
|
187
|
+
atomic_write_text(result.source, output)
|
|
188
|
+
try:
|
|
189
|
+
from soup_cli.trainer.rewards import load_reward_fn
|
|
190
|
+
reward_fn = load_reward_fn(output)
|
|
191
|
+
golds = rs.extract_golds(rows, field=field)
|
|
192
|
+
negatives = rs.perturb_negatives(golds, result.kind)
|
|
193
|
+
report = rs.calibrate(reward_fn, golds, negatives, kind=result.kind,
|
|
194
|
+
min_discrimination=min_discrimination)
|
|
195
|
+
except Exception as exc: # noqa: BLE001 — clean up the partial artifact
|
|
196
|
+
_cleanup(output)
|
|
197
|
+
_fail(f"calibration failed: {exc}")
|
|
198
|
+
|
|
199
|
+
# Write the diagnostic report (path already validated up front) for BOTH the
|
|
200
|
+
# accepted and refused cases. Best-effort: a write failure here warns but must
|
|
201
|
+
# not delete an otherwise-valid verifier.
|
|
202
|
+
if output_report:
|
|
203
|
+
try:
|
|
204
|
+
from dataclasses import asdict
|
|
205
|
+
atomic_write_text(json.dumps(asdict(report), indent=2), output_report)
|
|
206
|
+
except OSError as exc:
|
|
207
|
+
console.print(f"[yellow]Warning: could not write report: {escape(str(exc))}[/]")
|
|
208
|
+
|
|
209
|
+
if report.refused:
|
|
210
|
+
_cleanup(output)
|
|
211
|
+
console.print(Panel(
|
|
212
|
+
escape(report.reason),
|
|
213
|
+
title="[bold red]verifier refused (not emitted)[/]", border_style="red"))
|
|
214
|
+
raise typer.Exit(2)
|
|
215
|
+
|
|
216
|
+
console.print(_render_report_panel(report, result.kind, output))
|
|
217
|
+
raise typer.Exit(0)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _cleanup(path: str) -> None:
|
|
221
|
+
"""Remove a just-written artifact; best-effort (never masks the real error)."""
|
|
222
|
+
try:
|
|
223
|
+
os.remove(path)
|
|
224
|
+
except OSError:
|
|
225
|
+
pass
|
|
@@ -1107,10 +1107,38 @@ class TrainingConfig(BaseModel):
|
|
|
1107
1107
|
reward_fn: Optional[str] = Field(
|
|
1108
1108
|
default="accuracy",
|
|
1109
1109
|
description=(
|
|
1110
|
-
"Reward function: 'accuracy', 'format', 'verifiable', "
|
|
1111
|
-
"or
|
|
1110
|
+
"Reward function: 'accuracy', 'format', 'verifiable', a path to a "
|
|
1111
|
+
"custom .py file, or a comma-separated ensemble of the above "
|
|
1112
|
+
"(e.g. 'accuracy,format') — the comma form is GRPO-only (v0.71.40)."
|
|
1112
1113
|
),
|
|
1113
1114
|
)
|
|
1115
|
+
@field_validator("reward_fn", mode="before")
|
|
1116
|
+
@classmethod
|
|
1117
|
+
def _validate_reward_fn_field(cls, value: Any) -> Optional[str]:
|
|
1118
|
+
"""v0.71.40 #311 — shape-only validation (containment enforced at load).
|
|
1119
|
+
|
|
1120
|
+
Accepts a comma-separated spec ("accuracy,format"); rejects null bytes,
|
|
1121
|
+
oversize, and empty comma segments so a stray comma fails loud rather
|
|
1122
|
+
than silently dropping a reward.
|
|
1123
|
+
"""
|
|
1124
|
+
if value is None:
|
|
1125
|
+
return None
|
|
1126
|
+
if isinstance(value, bool) or not isinstance(value, str):
|
|
1127
|
+
raise ValueError(
|
|
1128
|
+
f"reward_fn must be a string, got {type(value).__name__}"
|
|
1129
|
+
)
|
|
1130
|
+
if "\x00" in value:
|
|
1131
|
+
raise ValueError("reward_fn must not contain null bytes")
|
|
1132
|
+
if len(value) > 512:
|
|
1133
|
+
raise ValueError("reward_fn must be <= 512 chars")
|
|
1134
|
+
if not value.strip():
|
|
1135
|
+
raise ValueError("reward_fn must not be blank")
|
|
1136
|
+
if any(not seg.strip() for seg in value.split(",")):
|
|
1137
|
+
raise ValueError(
|
|
1138
|
+
"reward_fn has an empty comma segment — remove the stray comma"
|
|
1139
|
+
)
|
|
1140
|
+
return value
|
|
1141
|
+
|
|
1114
1142
|
# RLVR — verifiable reward domain (Part C of v0.25.0)
|
|
1115
1143
|
verifiable_domain: Optional[Literal["math", "code", "json_schema"]] = Field(
|
|
1116
1144
|
default=None,
|
|
@@ -2978,8 +3006,18 @@ class TrainingConfig(BaseModel):
|
|
|
2978
3006
|
|
|
2979
3007
|
@model_validator(mode="after")
|
|
2980
3008
|
def _validate_verifiable_reward(self) -> "TrainingConfig":
|
|
2981
|
-
"""RLVR: reward_fn='verifiable' requires verifiable_domain.
|
|
2982
|
-
|
|
3009
|
+
"""RLVR: reward_fn='verifiable' requires verifiable_domain.
|
|
3010
|
+
|
|
3011
|
+
Comma-aware (v0.71.40 #311): ``"accuracy,verifiable"`` must fail at
|
|
3012
|
+
config-parse time exactly like the bare ``"verifiable"`` form, not only
|
|
3013
|
+
at trainer construction.
|
|
3014
|
+
"""
|
|
3015
|
+
segments = (
|
|
3016
|
+
[s.strip() for s in self.reward_fn.split(",")]
|
|
3017
|
+
if isinstance(self.reward_fn, str)
|
|
3018
|
+
else []
|
|
3019
|
+
)
|
|
3020
|
+
if "verifiable" in segments and self.verifiable_domain is None:
|
|
2983
3021
|
raise ValueError(
|
|
2984
3022
|
"reward_fn='verifiable' requires verifiable_domain "
|
|
2985
3023
|
"(one of: math, code, json_schema)"
|
|
@@ -4662,6 +4700,25 @@ class SoupConfig(BaseModel):
|
|
|
4662
4700
|
)
|
|
4663
4701
|
return self
|
|
4664
4702
|
|
|
4703
|
+
@model_validator(mode="after")
|
|
4704
|
+
def _validate_reward_fn_multi_compat(self) -> "SoupConfig":
|
|
4705
|
+
"""v0.71.40 #311 — a comma-separated reward_fn is GRPO-only.
|
|
4706
|
+
|
|
4707
|
+
Only ``trainer/grpo.py::_select_reward_fn`` resolves a multi-reward spec
|
|
4708
|
+
into a ``reward_funcs=[...]`` list; ``trainer/ppo.py`` (and every other
|
|
4709
|
+
consumer) calls the single-name loader, so a comma there would silently
|
|
4710
|
+
pass config validation and then crash at training start with
|
|
4711
|
+
``Unknown reward function``. Footgun-reject it up front (mirrors the
|
|
4712
|
+
online_dpo / asr / lisa task gates).
|
|
4713
|
+
"""
|
|
4714
|
+
rf = self.training.reward_fn
|
|
4715
|
+
if isinstance(rf, str) and "," in rf and self.task != "grpo":
|
|
4716
|
+
raise ValueError(
|
|
4717
|
+
f"a comma-separated training.reward_fn (an ensemble, {rf!r}) is "
|
|
4718
|
+
f"only supported for task='grpo'; got task={self.task!r}"
|
|
4719
|
+
)
|
|
4720
|
+
return self
|
|
4721
|
+
|
|
4665
4722
|
@model_validator(mode="after")
|
|
4666
4723
|
def _validate_asr_compat(self) -> "SoupConfig":
|
|
4667
4724
|
"""v0.71.32 — ASR (Whisper) gate.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""Calculator tool-use rollout env — v0.71.30.
|
|
2
2
|
|
|
3
3
|
Generates a deterministic set of single-operation arithmetic problems as GRPO
|
|
4
|
-
prompt+answer rows. Score with ``reward_fn
|
|
4
|
+
prompt+answer rows. Score with ``reward_fn: verifiable`` +
|
|
5
|
+
``verifiable_domain: math`` (or ``reward_fn: accuracy``).
|
|
5
6
|
|
|
6
7
|
Usage: ``training.rollout_backend='openenv'`` +
|
|
7
8
|
``training.rollout_func='soup_cli.envs.calculator:rollout'``.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Generates deterministic single-shot number-deduction puzzles (constraints that
|
|
4
4
|
pin a unique integer) as GRPO prompt+answer rows. Score with
|
|
5
|
-
``reward_fn
|
|
5
|
+
``reward_fn: verifiable`` + ``verifiable_domain: math`` (or ``reward_fn: accuracy``).
|
|
6
6
|
|
|
7
7
|
Honesty: this is single-shot *deduction*, not interactive guess-and-feedback —
|
|
8
8
|
the live openenv contract does not pass the model, so a true guessing loop is
|
|
@@ -129,7 +129,9 @@ def _read_attr(obj: Any, name: str) -> Any:
|
|
|
129
129
|
return getattr(obj, name, None)
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
def _select_reward_fn(
|
|
132
|
+
def _select_reward_fn(
|
|
133
|
+
tcfg: TrainingConfig, device: str, trust_remote_code: bool
|
|
134
|
+
) -> "Any": # Callable | list[Callable] (a single reward or a comma-split ensemble)
|
|
133
135
|
"""Choose the GRPO reward function (v0.71.30).
|
|
134
136
|
|
|
135
137
|
When ``tcfg.prm_reward`` is set, a trained Soup PRM scores each completion's
|
|
@@ -142,9 +144,13 @@ def _select_reward_fn(tcfg: TrainingConfig, device: str, trust_remote_code: bool
|
|
|
142
144
|
from soup_cli.utils.prm_reward import build_prm_reward_fn
|
|
143
145
|
|
|
144
146
|
return build_prm_reward_fn(tcfg, device, trust_remote_code)
|
|
145
|
-
|
|
147
|
+
# v0.71.40 #311 — ``reward_fn`` may be comma-separated ("accuracy,format").
|
|
148
|
+
# Return a single callable for one reward (back-compat) or a list for several
|
|
149
|
+
# (TRL's reward_funcs=[...] + the rm_ensemble detector both accept the list).
|
|
150
|
+
from soup_cli.trainer.rewards import load_reward_fns
|
|
146
151
|
|
|
147
|
-
|
|
152
|
+
fns = load_reward_fns(tcfg.reward_fn, verifiable_domain=tcfg.verifiable_domain)
|
|
153
|
+
return fns[0] if len(fns) == 1 else fns
|
|
148
154
|
|
|
149
155
|
|
|
150
156
|
class GRPOTrainerWrapper:
|