soup-cli 0.71.40__tar.gz → 0.71.41__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.40 → soup_cli-0.71.41}/CHANGELOG.md +28 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/CONTRIBUTING.md +3 -3
- {soup_cli-0.71.40 → soup_cli-0.71.41}/PKG-INFO +31 -16
- {soup_cli-0.71.40 → soup_cli-0.71.41}/README.md +31 -16
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/README.md +1 -1
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/backends-and-ops.md +2 -8
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/commands.md +4 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/training.md +25 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/pyproject.toml +1 -1
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/reward.py +130 -2
- soup_cli-0.71.41/src/soup_cli/utils/reward_stress.py +190 -0
- soup_cli-0.71.41/tests/test_v07141.py +423 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.dockerignore +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.gitignore +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.mailmap +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/AGENTS.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/CODEOWNERS +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/CONTRIBUTORS.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/Dockerfile +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/LICENSE +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/NOTICE +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/SECURITY.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docker-compose.yml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/adapters-and-governance.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/compliance.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/data.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/evaluation.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/models.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/README.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/reward_hacking/rewards.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/soup.png +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cloud/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cloud/modal.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v07110.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_webhook_cli.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/adapters.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/card.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ci.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_canary.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_doctor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_topics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/draft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/history.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/loop.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/mcp.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ra_dit.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ship.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/shrink.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/spectrum.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/schema.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/_common.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/calculator.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/guess_number.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/retrieval_qa.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/gate_suites.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/registry.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/server.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/store.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/hipaa.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/soc2.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/sr-11-7.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/asr.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/bitnet.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mole_routing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/online_dpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/raft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/tts.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_branch.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_fuse.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_merge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_pr.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_sandbox.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/asr_metrics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/best_of_n.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ci_workflow.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cmaes_merge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_doctor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_lint.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/citation.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/live.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/draft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_kernels.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/embed.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/evolve.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/harm_probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/interference_live.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lisa.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/live_eval.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_daemon.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_iteration.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_stages.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_state.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mod.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prm_reward.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/probe_kernel.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ra_dit_run.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/raft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rehearsal.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_hack_control.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_synth.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/semdedup.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ship_verdict.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/shrink.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spectrum_scan.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/topics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/truth_probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tts_codec.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearn_kernels.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/webhooks.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/chat.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/code.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/medical.yaml +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/__init__.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/conftest.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v07114_qa.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v0716_qa.md +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_audio.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bco.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bench.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_build_dag.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_callback.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cans.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_chat.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cli.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_critical.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_deferred.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_high.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_medium_low.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_recurring.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_config.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cost.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_diff.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_display.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_errors.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_export.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_formats.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_generate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_infer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_init.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_kto.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_loader.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_merge.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_moe.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_packing.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_performance.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_profile.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_progress.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_push.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_qat.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_registry.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_relora.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_replay.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_resume.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_review_fixes_v07133.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_runs.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_serve.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tui.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07110.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07111.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07112.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07113.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07114.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07115.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07116.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07117.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07118.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07119.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07120.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07121.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07122.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07123.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07124.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07125.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07126.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07127.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07128.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07129.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07130.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07131.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07132.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07133.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07134.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07135.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07136.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07137.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07138.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07139.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0714.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07140.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0715.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0716.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0717.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0718.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0719.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_validator.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_vision.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_warmup.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_why.py +0 -0
- {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,34 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.41] - 2026-07-19
|
|
16
|
+
|
|
17
|
+
**`soup reward stress`: is your reward verifier gameable?** Turn the reward-hacking
|
|
18
|
+
detector on the *verifier itself*. `soup reward synth` (v0.71.40) proves a verifier
|
|
19
|
+
separates your references from friendly perturbations; `stress` asks the adversarial
|
|
20
|
+
question a reward-hacking model asks at train time — *does the verifier pay out for
|
|
21
|
+
degenerate junk?* It feeds empty, length-padded, repetition, and sentinel-spam
|
|
22
|
+
completions and flags any the verifier accepts. Pure, offline, exit 0 = robust /
|
|
23
|
+
2 = gameable / 1 = error. Nothing in TRL / Unsloth / Axolotl / OpenRLHF tests a
|
|
24
|
+
verifier for gameability.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **`soup reward stress <reward.py|builtin> [--references golds.jsonl]`** — adversarial
|
|
29
|
+
verifier probe. Attacks (`--attacks empty,length,repetition,sentinel`, `--sentinel`)
|
|
30
|
+
are scored against the real gold, so numeric / tool_call / json_schema verifiers get a
|
|
31
|
+
valid target and still must reject the junk. Reports a per-attack accept-rate table +
|
|
32
|
+
an overall gameability verdict (`--max-gameable`, `--threshold`, `--output-report`).
|
|
33
|
+
Loads the target through the existing reward loader, so it probes a synthesized `.py`
|
|
34
|
+
**and** a builtin (`accuracy` / `format` / `verifiable`). A gold-requiring verifier
|
|
35
|
+
probed with no `--references` is a hard error, never a false "robust".
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- Corrected the Telemetry section in the ops docs: Soup's telemetry primitives exist but
|
|
40
|
+
are **not wired to any command** — no data is ever sent today (the previous wording
|
|
41
|
+
implied a live opt-in sender). Wiring is deferred until a public privacy policy ships.
|
|
42
|
+
|
|
15
43
|
## [0.71.40] - 2026-07-19
|
|
16
44
|
|
|
17
45
|
**`soup reward synth`: auto-generate a deterministic reward verifier from your data.**
|
|
@@ -116,11 +116,11 @@ src/soup_cli/
|
|
|
116
116
|
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
|
|
117
117
|
data/traces/ - Trace-to-Preference harvester (v0.26.0)
|
|
118
118
|
data/collators.py - CrossDocCollator for sample packing (v0.33.0)
|
|
119
|
-
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve
|
|
119
|
+
utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink, best_of_n, evolve, reward_synth
|
|
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 (319 files, 16529 tests)
|
|
124
124
|
examples/ - Real-world config examples and datasets
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -150,7 +150,7 @@ pytest tests/test_data.py::test_detect_alpaca_format -v
|
|
|
150
150
|
pytest tests/ --cov=soup_cli --cov-report=html
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
### Test Files (
|
|
153
|
+
### Test Files (318 files)
|
|
154
154
|
|
|
155
155
|
> A representative sample of the suite below. Run `pytest tests/ -v` for the complete list.
|
|
156
156
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.71.
|
|
3
|
+
Version: 0.71.41
|
|
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,27 +193,42 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
193
193
|
|
|
194
194
|
## What's New
|
|
195
195
|
|
|
196
|
-
**v0.71.
|
|
196
|
+
**v0.71.41 — `soup reward stress`: is your reward verifier gameable?** Turn the reward-hacking
|
|
197
|
+
detector on the verifier *itself*. `soup reward synth` (v0.71.40) proves a verifier can tell your
|
|
198
|
+
references from friendly bad answers; `stress` asks the adversarial question a reward-hacking model
|
|
199
|
+
asks at train time — *does it pay out for degenerate junk?* Nothing in TRL / Unsloth / Axolotl tests
|
|
200
|
+
a verifier for gameability.
|
|
201
|
+
|
|
202
|
+
- **Four attacks, scored against the real gold.** Empty, length-padded, repetition, and
|
|
203
|
+
sentinel-spam completions are fed to the verifier; any it **accepts** is a false positive. A
|
|
204
|
+
per-attack accept-rate table plus one **robust / GAMEABLE** verdict — exit 0 / 2 (1 on error).
|
|
205
|
+
- **Probes a synth `.py` or a builtin.** `soup reward stress reward.py --references golds.jsonl`,
|
|
206
|
+
or `soup reward stress verifiable --verifiable-domain math --references golds.jsonl`. A
|
|
207
|
+
gold-requiring verifier probed with no `--references` is a hard error, never a false "robust".
|
|
208
|
+
- **Tune the strictness.** `--attacks`, `--sentinel`, `--threshold`, `--max-gameable`,
|
|
209
|
+
`--output-report`. Pure, offline, no new deps.
|
|
197
210
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
211
|
+
```bash
|
|
212
|
+
# probe a verifier you synthesized (or a builtin) for gameability
|
|
213
|
+
soup reward stress reward.py --references golds.jsonl --output-report stress.json
|
|
214
|
+
# exit 0 = robust · 2 = gameable · 1 = error
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
<details>
|
|
218
|
+
<summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
|
|
219
|
+
|
|
220
|
+
Point `soup reward synth` at a JSONL of reference outputs and it infers a deterministic verifier,
|
|
221
|
+
writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to
|
|
222
|
+
emit one that can't tell your references from bad answers (four families: `numeric` / `json_schema` /
|
|
223
|
+
`regex` / `tool_call`; a mandatory calibration report is the moat). Reward ensembles
|
|
224
|
+
(`reward_fn: "accuracy,format"`) also train now. (#311)
|
|
208
225
|
|
|
209
226
|
```bash
|
|
210
|
-
# synth a verifier from reference answers, calibrate it, keep it only if it discriminates
|
|
211
227
|
soup reward synth references.jsonl -o reward.py --output-report calib.json
|
|
212
|
-
|
|
213
|
-
# then train against the reward you just generated
|
|
214
|
-
# training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
|
|
215
228
|
```
|
|
216
229
|
|
|
230
|
+
</details>
|
|
231
|
+
|
|
217
232
|
<details>
|
|
218
233
|
<summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
|
|
219
234
|
|
|
@@ -49,27 +49,42 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.71.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
52
|
+
**v0.71.41 — `soup reward stress`: is your reward verifier gameable?** Turn the reward-hacking
|
|
53
|
+
detector on the verifier *itself*. `soup reward synth` (v0.71.40) proves a verifier can tell your
|
|
54
|
+
references from friendly bad answers; `stress` asks the adversarial question a reward-hacking model
|
|
55
|
+
asks at train time — *does it pay out for degenerate junk?* Nothing in TRL / Unsloth / Axolotl tests
|
|
56
|
+
a verifier for gameability.
|
|
57
|
+
|
|
58
|
+
- **Four attacks, scored against the real gold.** Empty, length-padded, repetition, and
|
|
59
|
+
sentinel-spam completions are fed to the verifier; any it **accepts** is a false positive. A
|
|
60
|
+
per-attack accept-rate table plus one **robust / GAMEABLE** verdict — exit 0 / 2 (1 on error).
|
|
61
|
+
- **Probes a synth `.py` or a builtin.** `soup reward stress reward.py --references golds.jsonl`,
|
|
62
|
+
or `soup reward stress verifiable --verifiable-domain math --references golds.jsonl`. A
|
|
63
|
+
gold-requiring verifier probed with no `--references` is a hard error, never a false "robust".
|
|
64
|
+
- **Tune the strictness.** `--attacks`, `--sentinel`, `--threshold`, `--max-gameable`,
|
|
65
|
+
`--output-report`. Pure, offline, no new deps.
|
|
64
66
|
|
|
65
67
|
```bash
|
|
66
|
-
#
|
|
67
|
-
soup reward
|
|
68
|
+
# probe a verifier you synthesized (or a builtin) for gameability
|
|
69
|
+
soup reward stress reward.py --references golds.jsonl --output-report stress.json
|
|
70
|
+
# exit 0 = robust · 2 = gameable · 1 = error
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
<details>
|
|
74
|
+
<summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>
|
|
75
|
+
|
|
76
|
+
Point `soup reward synth` at a JSONL of reference outputs and it infers a deterministic verifier,
|
|
77
|
+
writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to
|
|
78
|
+
emit one that can't tell your references from bad answers (four families: `numeric` / `json_schema` /
|
|
79
|
+
`regex` / `tool_call`; a mandatory calibration report is the moat). Reward ensembles
|
|
80
|
+
(`reward_fn: "accuracy,format"`) also train now. (#311)
|
|
68
81
|
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
```bash
|
|
83
|
+
soup reward synth references.jsonl -o reward.py --output-report calib.json
|
|
71
84
|
```
|
|
72
85
|
|
|
86
|
+
</details>
|
|
87
|
+
|
|
73
88
|
<details>
|
|
74
89
|
<summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
|
|
75
90
|
|
|
@@ -7,7 +7,7 @@ feature reference — every `soup` capability, grouped by area.
|
|
|
7
7
|
|
|
8
8
|
| Guide | Covers |
|
|
9
9
|
|---|---|
|
|
10
|
-
| [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
|
|
10
|
+
| [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors, reward-verifier synthesis |
|
|
11
11
|
| [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning, depth pruning + distill-heal (`soup shrink`) |
|
|
12
12
|
| [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
|
|
13
13
|
| [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
|
|
@@ -743,15 +743,9 @@ pip install soup-cli[trackers] # mlflow + swanlab + trackio
|
|
|
743
743
|
```
|
|
744
744
|
|
|
745
745
|
|
|
746
|
-
## Telemetry (
|
|
746
|
+
## Telemetry (not yet wired)
|
|
747
747
|
|
|
748
|
-
Soup
|
|
749
|
-
|
|
750
|
-
```bash
|
|
751
|
-
SOUP_TELEMETRY=1 soup train --config soup.yaml
|
|
752
|
-
```
|
|
753
|
-
|
|
754
|
-
The sender uses a 1-second hard timeout, HTTPS-only with private-IP / link-local rejection (same SSRF policy as hub endpoints), and swallows every exception silently — telemetry can never crash training. Disabled by default until a public privacy policy ships.
|
|
748
|
+
Soup contains opt-in, hardware-info-only telemetry primitives in `utils/trackers.py` (`build_telemetry_payload` / `send_telemetry_payload`), but they are **not wired to any command** — no data is ever sent, and no environment variable enables sending today. When wired, the payload will carry only `soup_version` / `command` / `python` major.minor / `os` / `arch` / optional `duration_seconds` — never dataset paths, model names, or config contents — behind a 1-second hard timeout and the same HTTPS-only, private-IP-rejecting SSRF policy as hub endpoints, swallowing every exception so telemetry can never crash training. Wiring is deferred until a public privacy policy is published.
|
|
755
749
|
|
|
756
750
|
|
|
757
751
|
## Plugin System
|
|
@@ -186,6 +186,10 @@ soup reward synth refs.jsonl -o reward.py Synthesize a deterministic reward
|
|
|
186
186
|
soup reward synth ... --kind numeric|json_schema|regex|tool_call Force a verifier family (default: auto-detect)
|
|
187
187
|
soup reward synth ... --plan-only Report the induced spec + calibration plan; write nothing
|
|
188
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)
|
|
189
|
+
soup reward stress reward.py --references golds.jsonl Adversarially probe a verifier for gameability — empty/length/repetition/sentinel junk (v0.71.41)
|
|
190
|
+
soup reward stress verifiable --verifiable-domain math --references golds.jsonl Probe a builtin verifier instead of a .py file
|
|
191
|
+
soup reward stress ... --attacks empty,length,repetition,sentinel --sentinel GOLD --threshold 0.5 --max-gameable 0.0 Tune the attack set / accept threshold / tolerance
|
|
192
|
+
soup reward stress ... --output-report r.json Save the per-attack report JSON (exit 0 robust / 2 gameable / 1 error)
|
|
189
193
|
soup tui Full-screen Textual dashboard (requires [tui] extra)
|
|
190
194
|
soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
|
|
191
195
|
soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
|
|
@@ -897,6 +897,31 @@ strongly the verifier must separate references from perturbed negatives before i
|
|
|
897
897
|
v1 is deterministic families only — a `\boxed{}`/`####` marker helps the numeric verifier, and
|
|
898
898
|
completions are prompted to mark their answer (standard RLVR practice).
|
|
899
899
|
|
|
900
|
+
### Stress-test a verifier for gameability (`soup reward stress`)
|
|
901
|
+
|
|
902
|
+
A verifier that passes calibration still might pay out for junk. `soup reward stress` feeds the
|
|
903
|
+
verifier deterministic degenerate completions — empty, length-padded, repeated, and
|
|
904
|
+
sentinel-spam — scored against your real gold answers, and flags any it **accepts**. It's the
|
|
905
|
+
adversarial counterpart to `synth`: calibration proves the verifier tells references from
|
|
906
|
+
*friendly* bad answers; `stress` asks whether a reward-hacking model could game it.
|
|
907
|
+
|
|
908
|
+
```bash
|
|
909
|
+
# probe a synthesized verifier (or any reward .py) — exit 0 robust, 2 gameable, 1 error
|
|
910
|
+
soup reward stress reward.py --references golds.jsonl --output-report stress.json
|
|
911
|
+
|
|
912
|
+
# probe a builtin verifier instead of a .py file
|
|
913
|
+
soup reward stress verifiable --verifiable-domain math --references golds.jsonl
|
|
914
|
+
|
|
915
|
+
# tune the attack set / accept threshold / gameability tolerance
|
|
916
|
+
soup reward stress reward.py --references golds.jsonl \
|
|
917
|
+
--attacks empty,length,repetition,sentinel --sentinel GOLD \
|
|
918
|
+
--threshold 0.5 --max-gameable 0.0
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
The report shows a per-attack accept-rate and an overall verdict. A gold-requiring verifier probed
|
|
922
|
+
with **no** `--references` is a hard error (it can't be measured), never a false "robust". Probing a
|
|
923
|
+
`.py` executes its module code, like any custom reward — only stress files you trust.
|
|
924
|
+
|
|
900
925
|
### Verifiable Rewards (RLVR)
|
|
901
926
|
|
|
902
927
|
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.
|
|
@@ -17,14 +17,16 @@ from __future__ import annotations
|
|
|
17
17
|
import json
|
|
18
18
|
import math
|
|
19
19
|
import os
|
|
20
|
+
from dataclasses import asdict
|
|
20
21
|
from typing import NoReturn, Optional
|
|
21
22
|
|
|
22
23
|
import typer
|
|
23
|
-
from rich.console import Console
|
|
24
|
+
from rich.console import Console, Group
|
|
24
25
|
from rich.markup import escape
|
|
25
26
|
from rich.panel import Panel
|
|
26
27
|
from rich.table import Table
|
|
27
28
|
|
|
29
|
+
from soup_cli.utils import reward_stress
|
|
28
30
|
from soup_cli.utils import reward_synth as rs
|
|
29
31
|
from soup_cli.utils.paths import atomic_write_text, enforce_under_cwd_and_no_symlink
|
|
30
32
|
|
|
@@ -34,6 +36,7 @@ console = Console()
|
|
|
34
36
|
_MAX_INPUT_BYTES = 64 * 1024 * 1024
|
|
35
37
|
_MAX_ROWS = 1_000_000
|
|
36
38
|
_ALLOWED_KINDS = ("auto",) + rs.KINDS
|
|
39
|
+
_MAX_SENTINEL_LEN = 256
|
|
37
40
|
|
|
38
41
|
|
|
39
42
|
@app.callback()
|
|
@@ -201,7 +204,6 @@ def synth(
|
|
|
201
204
|
# not delete an otherwise-valid verifier.
|
|
202
205
|
if output_report:
|
|
203
206
|
try:
|
|
204
|
-
from dataclasses import asdict
|
|
205
207
|
atomic_write_text(json.dumps(asdict(report), indent=2), output_report)
|
|
206
208
|
except OSError as exc:
|
|
207
209
|
console.print(f"[yellow]Warning: could not write report: {escape(str(exc))}[/]")
|
|
@@ -223,3 +225,129 @@ def _cleanup(path: str) -> None:
|
|
|
223
225
|
os.remove(path)
|
|
224
226
|
except OSError:
|
|
225
227
|
pass
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _render_stress_panel(report: reward_stress.StressReport, target: str) -> Panel:
|
|
231
|
+
table = Table(show_header=True, box=None, pad_edge=False)
|
|
232
|
+
table.add_column("attack", style="cyan")
|
|
233
|
+
table.add_column("n", justify="right")
|
|
234
|
+
table.add_column("accepted", justify="right")
|
|
235
|
+
table.add_column("accept-rate", justify="right")
|
|
236
|
+
for a in report.attacks:
|
|
237
|
+
# Any junk this attack slipped through is red — a correct verifier rejects
|
|
238
|
+
# all of it. (The aggregate --max-gameable tolerance sets the verdict, not
|
|
239
|
+
# the per-row colour, so the two never contradict.)
|
|
240
|
+
style = "red" if a.accept_rate > 0 else "green"
|
|
241
|
+
table.add_row(
|
|
242
|
+
escape(a.kind), str(a.n), str(a.accepted),
|
|
243
|
+
f"[{style}]{a.accept_rate:.0%}[/]",
|
|
244
|
+
)
|
|
245
|
+
ref = "n/a" if report.reference_accept is None else f"{report.reference_accept:.0%}"
|
|
246
|
+
verdict = ("[bold red]GAMEABLE[/]" if report.gameable
|
|
247
|
+
else "[bold green]robust (not gameable)[/]")
|
|
248
|
+
footer = (f"\nreference accept: {ref} "
|
|
249
|
+
f"gameability: {report.gameability:.0%} verdict: {verdict}")
|
|
250
|
+
border = "red" if report.gameable else "green"
|
|
251
|
+
return Panel(
|
|
252
|
+
Group(table, footer),
|
|
253
|
+
title=f"[bold]reward stress: {escape(target)}[/]", border_style=border,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
@app.command()
|
|
258
|
+
def stress(
|
|
259
|
+
reward_target: str = typer.Argument(
|
|
260
|
+
..., help="Verifier to probe: a .py path, a builtin name, or 'verifiable'."
|
|
261
|
+
),
|
|
262
|
+
references: Optional[str] = typer.Option(
|
|
263
|
+
None, "--references", help="JSONL of gold outputs (enables gold-aware probing)."
|
|
264
|
+
),
|
|
265
|
+
field: str = typer.Option("answer", "--field", help="Gold field (default: answer)."),
|
|
266
|
+
verifiable_domain: Optional[str] = typer.Option(
|
|
267
|
+
None, "--verifiable-domain", help="Domain for a 'verifiable' target."
|
|
268
|
+
),
|
|
269
|
+
sentinel: str = typer.Option(
|
|
270
|
+
reward_stress.DEFAULT_SENTINEL, "--sentinel", help="Sentinel-spam token."
|
|
271
|
+
),
|
|
272
|
+
threshold: float = typer.Option(
|
|
273
|
+
reward_stress.DEFAULT_THRESHOLD, "--threshold", help="Reward >= this = accept."
|
|
274
|
+
),
|
|
275
|
+
max_gameable: float = typer.Option(
|
|
276
|
+
reward_stress.DEFAULT_MAX_GAMEABLE, "--max-gameable",
|
|
277
|
+
help="Max junk accept-rate allowed before the verdict flips to gameable.",
|
|
278
|
+
),
|
|
279
|
+
attacks: str = typer.Option(
|
|
280
|
+
",".join(reward_stress.ATTACKS), "--attacks",
|
|
281
|
+
help="Comma list: empty,length,repetition,sentinel.",
|
|
282
|
+
),
|
|
283
|
+
output_report: Optional[str] = typer.Option(
|
|
284
|
+
None, "--output-report", help="Also write the stress report as JSON."
|
|
285
|
+
),
|
|
286
|
+
) -> None:
|
|
287
|
+
"""Adversarially probe a reward verifier for gameability (exit 0 robust / 2 gameable)."""
|
|
288
|
+
if not 0.0 <= threshold <= 1.0:
|
|
289
|
+
_fail("--threshold must be in [0.0, 1.0]")
|
|
290
|
+
if not 0.0 <= max_gameable <= 1.0:
|
|
291
|
+
_fail("--max-gameable must be in [0.0, 1.0]")
|
|
292
|
+
# Dedupe while preserving order — 'empty,empty' must not double-weight.
|
|
293
|
+
kinds = list(dict.fromkeys(k.strip() for k in attacks.split(",") if k.strip()))
|
|
294
|
+
if not kinds:
|
|
295
|
+
_fail("--attacks must name at least one attack kind")
|
|
296
|
+
bad = [k for k in kinds if k not in reward_stress.ATTACKS]
|
|
297
|
+
if bad:
|
|
298
|
+
_fail(f"unknown attack kind(s): {', '.join(bad)}; "
|
|
299
|
+
f"options: {', '.join(reward_stress.ATTACKS)}")
|
|
300
|
+
if len(sentinel) > _MAX_SENTINEL_LEN:
|
|
301
|
+
_fail(f"--sentinel must be <= {_MAX_SENTINEL_LEN} characters")
|
|
302
|
+
|
|
303
|
+
# A .py target is cwd-contained; a builtin name passes to load_reward_fn as-is.
|
|
304
|
+
if reward_target.endswith(".py"):
|
|
305
|
+
try:
|
|
306
|
+
enforce_under_cwd_and_no_symlink(reward_target, "reward target")
|
|
307
|
+
except (ValueError, OSError) as exc:
|
|
308
|
+
_fail(str(exc))
|
|
309
|
+
if not os.path.exists(reward_target):
|
|
310
|
+
_fail(f"reward target {reward_target!r} not found")
|
|
311
|
+
|
|
312
|
+
# Validate every write/read path UP FRONT — before load_reward_fn executes the
|
|
313
|
+
# target file's arbitrary module code — so a bad --output-report typo costs no
|
|
314
|
+
# extra code execution (mirrors synth's validate-before-load ordering).
|
|
315
|
+
if output_report:
|
|
316
|
+
try:
|
|
317
|
+
enforce_under_cwd_and_no_symlink(output_report, "report path")
|
|
318
|
+
except (ValueError, OSError) as exc:
|
|
319
|
+
_fail(str(exc))
|
|
320
|
+
|
|
321
|
+
golds: list[str] = []
|
|
322
|
+
if references:
|
|
323
|
+
try:
|
|
324
|
+
rows = _read_jsonl(references, "references path")
|
|
325
|
+
except (ValueError, OSError) as exc:
|
|
326
|
+
_fail(str(exc))
|
|
327
|
+
try:
|
|
328
|
+
golds = rs.extract_golds(rows, field=field)
|
|
329
|
+
except (ValueError, TypeError) as exc:
|
|
330
|
+
_fail(str(exc))
|
|
331
|
+
|
|
332
|
+
try:
|
|
333
|
+
from soup_cli.trainer.rewards import load_reward_fn
|
|
334
|
+
reward_fn = load_reward_fn(reward_target, verifiable_domain=verifiable_domain)
|
|
335
|
+
except Exception as exc: # noqa: BLE001 — the target file runs arbitrary code
|
|
336
|
+
_fail(f"could not load reward target: {exc}")
|
|
337
|
+
|
|
338
|
+
try:
|
|
339
|
+
report = reward_stress.run_stress(
|
|
340
|
+
reward_fn, golds, sentinel=sentinel, threshold=threshold,
|
|
341
|
+
max_gameable=max_gameable, attacks=kinds,
|
|
342
|
+
)
|
|
343
|
+
except Exception as exc: # noqa: BLE001 — a broken reward fn is a usage error
|
|
344
|
+
_fail(f"stress run failed: {exc}")
|
|
345
|
+
|
|
346
|
+
if output_report:
|
|
347
|
+
try:
|
|
348
|
+
atomic_write_text(json.dumps(asdict(report), indent=2), output_report)
|
|
349
|
+
except OSError as exc:
|
|
350
|
+
console.print(f"[yellow]Warning: could not write report: {escape(str(exc))}[/]")
|
|
351
|
+
|
|
352
|
+
console.print(_render_stress_panel(report, reward_target))
|
|
353
|
+
raise typer.Exit(2 if report.gameable else 0)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""Adversarial verifier probe — `soup reward stress` (v0.71.41).
|
|
2
|
+
|
|
3
|
+
Turn the v0.71.26 reward-hacking expertise on a reward VERIFIER itself: does it
|
|
4
|
+
pay out for degenerate completions (empty / length-padded / repetition /
|
|
5
|
+
sentinel-spam)? A correct deterministic verifier rejects all of them.
|
|
6
|
+
|
|
7
|
+
Pure, offline, NO top-level torch. Reuses the attack-kind vocabulary of
|
|
8
|
+
``reward_hack_control`` (``SHAPING_KINDS`` = length/repetition/sentinel) — as
|
|
9
|
+
ATTACKS rather than mitigations — plus the trivial ``empty`` case. Companion to
|
|
10
|
+
``reward_synth`` (v0.71.40): ``synth`` proves a verifier separates references
|
|
11
|
+
from *friendly* perturbations; ``stress`` asks the *adversarial* question a
|
|
12
|
+
reward-hacking model asks at train time.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import math
|
|
18
|
+
from collections.abc import Callable, Sequence
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from typing import Any, Optional
|
|
21
|
+
|
|
22
|
+
from soup_cli.utils.reward_hack_control import _DEFAULT_SENTINEL
|
|
23
|
+
|
|
24
|
+
# Public re-export so the CLI does not reach into a private cross-module symbol.
|
|
25
|
+
DEFAULT_SENTINEL = _DEFAULT_SENTINEL
|
|
26
|
+
|
|
27
|
+
# ``empty`` + the three ``reward_hack_control.SHAPING_KINDS``.
|
|
28
|
+
ATTACKS: tuple[str, ...] = ("empty", "length", "repetition", "sentinel")
|
|
29
|
+
|
|
30
|
+
# > ``reward_hack_control._SHAPING_LENGTH_SAT`` (32) so a length-reward saturates.
|
|
31
|
+
_LENGTH_ATTACK_WORDS = 60
|
|
32
|
+
_REPETITION_COUNT = 40
|
|
33
|
+
_SENTINEL_COUNT = 20
|
|
34
|
+
# O(golds) forward calls per attack — cap the sampled golds to bound the run.
|
|
35
|
+
_MAX_STRESS_GOLDS = 200
|
|
36
|
+
|
|
37
|
+
DEFAULT_THRESHOLD = 0.5
|
|
38
|
+
DEFAULT_MAX_GAMEABLE = 0.0
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
# Frozen result types
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class AttackResult:
|
|
46
|
+
kind: str
|
|
47
|
+
n: int
|
|
48
|
+
accepted: int
|
|
49
|
+
accept_rate: float
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class StressReport:
|
|
54
|
+
reference_accept: Optional[float]
|
|
55
|
+
attacks: tuple[AttackResult, ...]
|
|
56
|
+
gameability: float
|
|
57
|
+
gameable: bool
|
|
58
|
+
threshold: float
|
|
59
|
+
max_gameable: float
|
|
60
|
+
sentinel: str
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# ---------------------------------------------------------------------------
|
|
64
|
+
# Attack generation
|
|
65
|
+
# ---------------------------------------------------------------------------
|
|
66
|
+
def _attack_text(kind: str, sentinel: str) -> str:
|
|
67
|
+
if kind == "empty":
|
|
68
|
+
return ""
|
|
69
|
+
if kind == "length":
|
|
70
|
+
# A long ramble with NO answer — games a length-based reward.
|
|
71
|
+
return " ".join(["padding"] * _LENGTH_ATTACK_WORDS)
|
|
72
|
+
if kind == "repetition":
|
|
73
|
+
return " ".join(["loop"] * _REPETITION_COUNT)
|
|
74
|
+
if kind == "sentinel":
|
|
75
|
+
# Spam a magic token — games a "contains a sentinel" reward.
|
|
76
|
+
return " ".join([sentinel] * _SENTINEL_COUNT)
|
|
77
|
+
raise ValueError(f"unknown attack kind: {kind!r} (options: {', '.join(ATTACKS)})")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def generate_attacks(
|
|
81
|
+
*, sentinel: str = _DEFAULT_SENTINEL, kinds: Sequence[str] = ATTACKS
|
|
82
|
+
) -> list[tuple[str, str]]:
|
|
83
|
+
"""Deterministic ``(kind, completion_text)`` junk a correct verifier must reject."""
|
|
84
|
+
if isinstance(kinds, (str, bytes)):
|
|
85
|
+
# A bare string is a Sequence of characters — iterating it would probe
|
|
86
|
+
# per-letter. Force an explicit collection (mirrors reward_synth guards).
|
|
87
|
+
raise TypeError("kinds must be a sequence of attack-kind strings, not a str")
|
|
88
|
+
return [(kind, _attack_text(kind, sentinel)) for kind in kinds]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# ---------------------------------------------------------------------------
|
|
92
|
+
# Scoring + verdict
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
def _score_batch(
|
|
95
|
+
reward_fn: Callable[..., Sequence[Any]],
|
|
96
|
+
texts: Sequence[str],
|
|
97
|
+
answers: Optional[Sequence[str]],
|
|
98
|
+
) -> list[float]:
|
|
99
|
+
"""Score completions built from ``texts``; supply ``answer=`` only when given.
|
|
100
|
+
|
|
101
|
+
Validates the reward fn returned exactly one finite numeric score per
|
|
102
|
+
completion. A short return (the classic case: a gold-requiring builtin like
|
|
103
|
+
``accuracy`` scored with no ``answer`` — its ``zip(completions, answers)``
|
|
104
|
+
yields an empty list) is a hard error, NOT a silent "0 accepted" that would
|
|
105
|
+
render a false "robust" verdict. A non-finite score means a broken verifier.
|
|
106
|
+
"""
|
|
107
|
+
if not texts:
|
|
108
|
+
return []
|
|
109
|
+
completions = [[{"role": "assistant", "content": t}] for t in texts]
|
|
110
|
+
kwargs = {"answer": list(answers)} if answers is not None else {}
|
|
111
|
+
scores = list(reward_fn(completions, **kwargs))
|
|
112
|
+
if len(scores) != len(texts):
|
|
113
|
+
raise ValueError(
|
|
114
|
+
f"reward target returned {len(scores)} score(s) for {len(texts)} "
|
|
115
|
+
"completion(s) — this verifier likely needs --references to be probed "
|
|
116
|
+
"meaningfully (its reward compares each completion against a gold answer)"
|
|
117
|
+
)
|
|
118
|
+
coerced: list[float] = []
|
|
119
|
+
for s in scores:
|
|
120
|
+
try:
|
|
121
|
+
val = float(s)
|
|
122
|
+
except (TypeError, ValueError) as exc:
|
|
123
|
+
raise ValueError(f"reward target returned a non-numeric score {s!r}") from exc
|
|
124
|
+
if not math.isfinite(val):
|
|
125
|
+
raise ValueError(f"reward target returned a non-finite score {val!r}")
|
|
126
|
+
coerced.append(val)
|
|
127
|
+
return coerced
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def run_stress(
|
|
131
|
+
reward_fn: Callable[..., Sequence[Any]],
|
|
132
|
+
golds: Sequence[str],
|
|
133
|
+
*,
|
|
134
|
+
sentinel: str = _DEFAULT_SENTINEL,
|
|
135
|
+
threshold: float = DEFAULT_THRESHOLD,
|
|
136
|
+
max_gameable: float = DEFAULT_MAX_GAMEABLE,
|
|
137
|
+
attacks: Sequence[str] = ATTACKS,
|
|
138
|
+
) -> StressReport:
|
|
139
|
+
"""Score adversarial junk completions and flag a gameable verifier.
|
|
140
|
+
|
|
141
|
+
For each attack kind, one junk completion is scored per sampled gold against
|
|
142
|
+
the REAL gold (so numeric/tool_call/json_schema verifiers get a valid
|
|
143
|
+
``answer=`` and still must reject the junk). ``gameability`` is the overall
|
|
144
|
+
junk accept-rate; ``gameable`` iff it strictly exceeds ``max_gameable``.
|
|
145
|
+
|
|
146
|
+
``reference_accept`` (the golds scored as their own correct completions) is
|
|
147
|
+
reported for context — a verifier that rejects everything is broken, a
|
|
148
|
+
different problem — but does NOT set the verdict.
|
|
149
|
+
|
|
150
|
+
No-gold fallback: with an empty ``golds`` each attack is scored once with no
|
|
151
|
+
``answer`` kwarg and ``reference_accept`` is ``None``.
|
|
152
|
+
"""
|
|
153
|
+
sampled = list(golds)[:_MAX_STRESS_GOLDS]
|
|
154
|
+
have_golds = bool(sampled)
|
|
155
|
+
|
|
156
|
+
def _accepted(scores: Sequence[float]) -> int:
|
|
157
|
+
# Scores are already validated finite + numeric by _score_batch.
|
|
158
|
+
return sum(1 for s in scores if s >= threshold)
|
|
159
|
+
|
|
160
|
+
reference_accept: Optional[float] = None
|
|
161
|
+
if have_golds:
|
|
162
|
+
ref_scores = _score_batch(reward_fn, sampled, sampled)
|
|
163
|
+
reference_accept = _accepted(ref_scores) / len(sampled)
|
|
164
|
+
|
|
165
|
+
results: list[AttackResult] = []
|
|
166
|
+
total_accepted = total_n = 0
|
|
167
|
+
for kind, junk in generate_attacks(sentinel=sentinel, kinds=attacks):
|
|
168
|
+
if have_golds:
|
|
169
|
+
texts: list[str] = [junk] * len(sampled)
|
|
170
|
+
answers: Optional[list[str]] = list(sampled)
|
|
171
|
+
else:
|
|
172
|
+
texts = [junk]
|
|
173
|
+
answers = None
|
|
174
|
+
scores = _score_batch(reward_fn, texts, answers)
|
|
175
|
+
accepted = _accepted(scores)
|
|
176
|
+
n = len(texts)
|
|
177
|
+
results.append(AttackResult(kind, n, accepted, accepted / n if n else 0.0))
|
|
178
|
+
total_accepted += accepted
|
|
179
|
+
total_n += n
|
|
180
|
+
|
|
181
|
+
gameability = (total_accepted / total_n) if total_n else 0.0
|
|
182
|
+
return StressReport(
|
|
183
|
+
reference_accept=reference_accept,
|
|
184
|
+
attacks=tuple(results),
|
|
185
|
+
gameability=gameability,
|
|
186
|
+
gameable=gameability > max_gameable,
|
|
187
|
+
threshold=threshold,
|
|
188
|
+
max_gameable=max_gameable,
|
|
189
|
+
sentinel=sentinel,
|
|
190
|
+
)
|