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.
Files changed (903) hide show
  1. {soup_cli-0.71.40 → soup_cli-0.71.41}/CHANGELOG.md +28 -0
  2. {soup_cli-0.71.40 → soup_cli-0.71.41}/CONTRIBUTING.md +3 -3
  3. {soup_cli-0.71.40 → soup_cli-0.71.41}/PKG-INFO +31 -16
  4. {soup_cli-0.71.40 → soup_cli-0.71.41}/README.md +31 -16
  5. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/README.md +1 -1
  6. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/backends-and-ops.md +2 -8
  7. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/commands.md +4 -0
  8. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/training.md +25 -0
  9. {soup_cli-0.71.40 → soup_cli-0.71.41}/pyproject.toml +1 -1
  10. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/__init__.py +1 -1
  11. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/reward.py +130 -2
  12. soup_cli-0.71.41/src/soup_cli/utils/reward_stress.py +190 -0
  13. soup_cli-0.71.41/tests/test_v07141.py +423 -0
  14. {soup_cli-0.71.40 → soup_cli-0.71.41}/.dockerignore +0 -0
  15. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/FUNDING.yml +0 -0
  16. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  17. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  19. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/pull_request_template.md +0 -0
  20. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/ci.yml +0 -0
  21. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/docker.yml +0 -0
  22. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/publish.yml +0 -0
  23. {soup_cli-0.71.40 → soup_cli-0.71.41}/.github/workflows/recipe-validation.yml +0 -0
  24. {soup_cli-0.71.40 → soup_cli-0.71.41}/.gitignore +0 -0
  25. {soup_cli-0.71.40 → soup_cli-0.71.41}/.mailmap +0 -0
  26. {soup_cli-0.71.40 → soup_cli-0.71.41}/.pre-commit-config.yaml +0 -0
  27. {soup_cli-0.71.40 → soup_cli-0.71.41}/AGENTS.md +0 -0
  28. {soup_cli-0.71.40 → soup_cli-0.71.41}/CODEOWNERS +0 -0
  29. {soup_cli-0.71.40 → soup_cli-0.71.41}/CODE_OF_CONDUCT.md +0 -0
  30. {soup_cli-0.71.40 → soup_cli-0.71.41}/CONTRIBUTORS.md +0 -0
  31. {soup_cli-0.71.40 → soup_cli-0.71.41}/Dockerfile +0 -0
  32. {soup_cli-0.71.40 → soup_cli-0.71.41}/LICENSE +0 -0
  33. {soup_cli-0.71.40 → soup_cli-0.71.41}/NOTICE +0 -0
  34. {soup_cli-0.71.40 → soup_cli-0.71.41}/SECURITY.md +0 -0
  35. {soup_cli-0.71.40 → soup_cli-0.71.41}/docker-compose.yml +0 -0
  36. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/adapters-and-governance.md +0 -0
  37. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/compliance.md +0 -0
  38. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/data.md +0 -0
  39. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/evaluation.md +0 -0
  40. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/models.md +0 -0
  41. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/peft-and-efficiency.md +0 -0
  42. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/performance-and-quantization.md +0 -0
  43. {soup_cli-0.71.40 → soup_cli-0.71.41}/docs/serving-and-export.md +0 -0
  44. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/README.md +0 -0
  45. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/dpo_chat.yaml +0 -0
  46. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/dpo_example.yaml +0 -0
  47. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/grpo_reasoning.yaml +0 -0
  48. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step1_sft.yaml +0 -0
  49. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step2_reward.yaml +0 -0
  50. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  51. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/sft_basic.yaml +0 -0
  52. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/configs/vision_llama.yaml +0 -0
  53. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/alpaca_tiny.jsonl +0 -0
  54. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/chat_preferences.jsonl +0 -0
  55. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/dpo_sample.jsonl +0 -0
  56. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/data/reasoning_math.jsonl +0 -0
  57. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/reward_hacking/rewards.py +0 -0
  58. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/synthetic_workflow.md +0 -0
  59. {soup_cli-0.71.40 → soup_cli-0.71.41}/examples/synthetic_workflow.yaml +0 -0
  60. {soup_cli-0.71.40 → soup_cli-0.71.41}/soup.png +0 -0
  61. {soup_cli-0.71.40 → soup_cli-0.71.41}/soup_logo_svg.svg +0 -0
  62. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/__main__.py +0 -0
  63. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/__init__.py +0 -0
  64. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/analyzer.py +0 -0
  65. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/decisions.py +0 -0
  66. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/autopilot/generate_config.py +0 -0
  67. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/__init__.py +0 -0
  68. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/pack.py +0 -0
  69. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/publish.py +0 -0
  70. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/run.py +0 -0
  71. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/schema.py +0 -0
  72. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/unpack.py +0 -0
  73. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cans/verify.py +0 -0
  74. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cli.py +0 -0
  75. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cloud/__init__.py +0 -0
  76. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/cloud/modal.py +0 -0
  77. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/__init__.py +0 -0
  78. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0550.py +0 -0
  79. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0610.py +0 -0
  80. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v0650.py +0 -0
  81. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_eval_v07110.py +0 -0
  82. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/_webhook_cli.py +0 -0
  83. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ab.py +0 -0
  84. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/active_sample.py +0 -0
  85. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/adapters.py +0 -0
  86. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/advise.py +0 -0
  87. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/agent.py +0 -0
  88. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/airgap.py +0 -0
  89. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/apple_adapter.py +0 -0
  90. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/attest.py +0 -0
  91. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/audit_log.py +0 -0
  92. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/autopilot.py +0 -0
  93. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/bench.py +0 -0
  94. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/bom.py +0 -0
  95. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/build.py +0 -0
  96. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/can.py +0 -0
  97. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/card.py +0 -0
  98. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/chat.py +0 -0
  99. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ci.py +0 -0
  100. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/compile_cmd.py +0 -0
  101. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/compile_tools.py +0 -0
  102. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/completions.py +0 -0
  103. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/cost.py +0 -0
  104. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data.py +0 -0
  105. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_canary.py +0 -0
  106. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_doctor.py +0 -0
  107. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_forge.py +0 -0
  108. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_mix.py +0 -0
  109. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_score.py +0 -0
  110. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/data_topics.py +0 -0
  111. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  112. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/deploy.py +0 -0
  113. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/diagnose.py +0 -0
  114. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/diff.py +0 -0
  115. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/distill_prompt.py +0 -0
  116. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/doctor.py +0 -0
  117. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/draft.py +0 -0
  118. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/drift_alarm.py +0 -0
  119. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/edit.py +0 -0
  120. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/env.py +0 -0
  121. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/eval.py +0 -0
  122. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/expect.py +0 -0
  123. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/export.py +0 -0
  124. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/fetch.py +0 -0
  125. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/generate.py +0 -0
  126. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/history.py +0 -0
  127. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/infer.py +0 -0
  128. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ingest.py +0 -0
  129. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/init.py +0 -0
  130. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/iterative_dpo.py +0 -0
  131. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/license_advisor.py +0 -0
  132. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/llama.py +0 -0
  133. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/local_rl.py +0 -0
  134. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/lock.py +0 -0
  135. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/loop.py +0 -0
  136. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/mcp.py +0 -0
  137. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/merge.py +0 -0
  138. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  139. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/migrate.py +0 -0
  140. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/monitor.py +0 -0
  141. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/plan.py +0 -0
  142. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/plugins.py +0 -0
  143. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/probe.py +0 -0
  144. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/profile.py +0 -0
  145. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/prune_prompt.py +0 -0
  146. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/push.py +0 -0
  147. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/quantize.py +0 -0
  148. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/quickstart.py +0 -0
  149. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ra_dit.py +0 -0
  150. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/recipes.py +0 -0
  151. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/registry.py +0 -0
  152. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/runs.py +0 -0
  153. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/serve.py +0 -0
  154. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ship.py +0 -0
  155. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/shrink.py +0 -0
  156. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/spectrum.py +0 -0
  157. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/steer.py +0 -0
  158. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/sweep.py +0 -0
  159. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tokenizer.py +0 -0
  160. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/train.py +0 -0
  161. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tui.py +0 -0
  162. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/tunability.py +0 -0
  163. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/ui.py +0 -0
  164. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/commands/why.py +0 -0
  165. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/__init__.py +0 -0
  166. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/loader.py +0 -0
  167. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/config/schema.py +0 -0
  168. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/__init__.py +0 -0
  169. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  170. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  171. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  172. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  173. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  174. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  175. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  176. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  177. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  178. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  179. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  180. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  181. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  182. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  183. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  184. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/augment.py +0 -0
  185. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/chat_templates.py +0 -0
  186. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/collators.py +0 -0
  187. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/formats.py +0 -0
  188. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/loader.py +0 -0
  189. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/loss_mask.py +0 -0
  190. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/__init__.py +0 -0
  191. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/_utils.py +0 -0
  192. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/anthropic.py +0 -0
  193. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/ollama.py +0 -0
  194. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/providers/vllm.py +0 -0
  195. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/sft_format.py +0 -0
  196. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/__init__.py +0 -0
  197. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/code.py +0 -0
  198. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/conversation.py +0 -0
  199. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/preference.py +0 -0
  200. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/qa.py +0 -0
  201. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/reasoning.py +0 -0
  202. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/tool_calling.py +0 -0
  203. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/templates/verifiable.py +0 -0
  204. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/__init__.py +0 -0
  205. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/pair_builder.py +0 -0
  206. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/parsers.py +0 -0
  207. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/traces/quality.py +0 -0
  208. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/data/validator.py +0 -0
  209. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/__init__.py +0 -0
  210. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/_common.py +0 -0
  211. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/calculator.py +0 -0
  212. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/guess_number.py +0 -0
  213. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/envs/retrieval_qa.py +0 -0
  214. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/__init__.py +0 -0
  215. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/arena.py +0 -0
  216. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  217. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/calibrate.py +0 -0
  218. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  219. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/custom.py +0 -0
  220. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/forgetting.py +0 -0
  221. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/gate.py +0 -0
  222. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/gate_suites.py +0 -0
  223. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/human.py +0 -0
  224. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/judge.py +0 -0
  225. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/leaderboard.py +0 -0
  226. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/eval/quant_check.py +0 -0
  227. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/experiment/__init__.py +0 -0
  228. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/experiment/tracker.py +0 -0
  229. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/__init__.py +0 -0
  230. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/registry.py +0 -0
  231. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/mcp_server/server.py +0 -0
  232. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/__init__.py +0 -0
  233. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/axolotl.py +0 -0
  234. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/common.py +0 -0
  235. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/llamafactory.py +0 -0
  236. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/migrate/unsloth.py +0 -0
  237. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/__init__.py +0 -0
  238. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/callback.py +0 -0
  239. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  240. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/display.py +0 -0
  241. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  242. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/hf_push.py +0 -0
  243. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  244. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/monitoring/trace_logger.py +0 -0
  245. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/plugins/__init__.py +0 -0
  246. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/py.typed +0 -0
  247. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/recipes/__init__.py +0 -0
  248. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/recipes/catalog.py +0 -0
  249. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/__init__.py +0 -0
  250. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/attach.py +0 -0
  251. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/diff.py +0 -0
  252. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/hashing.py +0 -0
  253. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/registry/store.py +0 -0
  254. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/__init__.py +0 -0
  255. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/audio.yaml +0 -0
  256. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/bco.yaml +0 -0
  257. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/chat.yaml +0 -0
  258. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/code.yaml +0 -0
  259. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/embedding.yaml +0 -0
  260. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  261. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  262. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  263. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  264. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/hipaa.yaml +0 -0
  265. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/ipo.yaml +0 -0
  266. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/kto.yaml +0 -0
  267. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/longcontext.yaml +0 -0
  268. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/manifest.json +0 -0
  269. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/medical.yaml +0 -0
  270. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/moe.yaml +0 -0
  271. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/orpo.yaml +0 -0
  272. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/pretrain.yaml +0 -0
  273. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/reasoning.yaml +0 -0
  274. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/rlhf.yaml +0 -0
  275. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/simpo.yaml +0 -0
  276. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/soc2.yaml +0 -0
  277. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  278. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/tool-calling.yaml +0 -0
  279. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/templates/vision.yaml +0 -0
  280. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/__init__.py +0 -0
  281. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/asr.py +0 -0
  282. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/bco.py +0 -0
  283. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/bitnet.py +0 -0
  284. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/classifier.py +0 -0
  285. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/distill.py +0 -0
  286. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/dpo.py +0 -0
  287. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/embedding.py +0 -0
  288. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/grpo.py +0 -0
  289. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/ipo.py +0 -0
  290. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/kto.py +0 -0
  291. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  292. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  293. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_routing.py +0 -0
  294. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mlx_sft.py +0 -0
  295. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/mole_routing.py +0 -0
  296. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/online_dpo.py +0 -0
  297. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/orpo.py +0 -0
  298. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/ppo.py +0 -0
  299. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/preference.py +0 -0
  300. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/pretrain.py +0 -0
  301. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/prm.py +0 -0
  302. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/raft.py +0 -0
  303. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/reward_model.py +0 -0
  304. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/rewards.py +0 -0
  305. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/sft.py +0 -0
  306. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/simpo.py +0 -0
  307. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/tts.py +0 -0
  308. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/trainer/unlearn.py +0 -0
  309. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/tui_app.py +0 -0
  310. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/__init__.py +0 -0
  311. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/app.py +0 -0
  312. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/plugins/__init__.py +0 -0
  313. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/app.js +0 -0
  314. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/index.html +0 -0
  315. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/logo.png +0 -0
  316. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/logo.svg +0 -0
  317. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/ui/static/style.css +0 -0
  318. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/__init__.py +0 -0
  319. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/_eval_text.py +0 -0
  320. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ab_test.py +0 -0
  321. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/activation_offload.py +0 -0
  322. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/active_sampler.py +0 -0
  323. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  324. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_bisect.py +0 -0
  325. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_branch.py +0 -0
  326. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_diff.py +0 -0
  327. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_fuse.py +0 -0
  328. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_merge.py +0 -0
  329. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_pr.py +0 -0
  330. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_scan.py +0 -0
  331. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/adapter_sign.py +0 -0
  332. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advanced_precision.py +0 -0
  333. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advise.py +0 -0
  334. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/advise_history.py +0 -0
  335. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_forge.py +0 -0
  336. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_rollout.py +0 -0
  337. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/agent_sandbox.py +0 -0
  338. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/airgap_bundle.py +0 -0
  339. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/annex_xi.py +0 -0
  340. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/anthropic_messages.py +0 -0
  341. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/apple_adapter.py +0 -0
  342. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/asr_metrics.py +0 -0
  343. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/attest.py +0 -0
  344. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/audit_log.py +0 -0
  345. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/auto_quant.py +0 -0
  346. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/backend_detect.py +0 -0
  347. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/batch_probe.py +0 -0
  348. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/behavior_battery.py +0 -0
  349. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/best_of_n.py +0 -0
  350. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/bitnet.py +0 -0
  351. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/blame.py +0 -0
  352. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/block_expansion.py +0 -0
  353. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/bom.py +0 -0
  354. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/brain_rot.py +0 -0
  355. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  356. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/build_dag.py +0 -0
  357. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary.py +0 -0
  358. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary_discovery.py +0 -0
  359. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/canary_router.py +0 -0
  360. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/capability_suite.py +0 -0
  361. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/checklist_dsl.py +0 -0
  362. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  363. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ci_workflow.py +0 -0
  364. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/citation_faithful.py +0 -0
  365. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/classifier.py +0 -0
  366. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cmaes_merge.py +0 -0
  367. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/compile_tools.py +0 -0
  368. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/completions.py +0 -0
  369. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/constants.py +0 -0
  370. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/convergence.py +0 -0
  371. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/crash.py +0 -0
  372. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  373. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/curriculum.py +0 -0
  374. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  375. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/cut_ce.py +0 -0
  376. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_doctor.py +0 -0
  377. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_forge.py +0 -0
  378. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_lint.py +0 -0
  379. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_mix.py +0 -0
  380. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_pipeline.py +0 -0
  381. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/data_score.py +0 -0
  382. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deepspeed.py +0 -0
  383. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  384. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/demo_bundles.py +0 -0
  385. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  386. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/deploy_measure.py +0 -0
  387. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  388. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/_common.py +0 -0
  389. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/badge.py +0 -0
  390. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/citation.py +0 -0
  391. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  392. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  393. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/format.py +0 -0
  394. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/live.py +0 -0
  395. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  396. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  397. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  398. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/report.py +0 -0
  399. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/diagnose/runner.py +0 -0
  400. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/distill.py +0 -0
  401. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/dpo_variants.py +0 -0
  402. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/draft.py +0 -0
  403. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/drift_alarm.py +0 -0
  404. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  405. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/echo_trap.py +0 -0
  406. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_diff.py +0 -0
  407. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_governor.py +0 -0
  408. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/edit_kernels.py +0 -0
  409. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/embed.py +0 -0
  410. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/encoding.py +0 -0
  411. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/energy.py +0 -0
  412. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/env_lock.py +0 -0
  413. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/errors.py +0 -0
  414. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_design.py +0 -0
  415. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  416. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  417. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/evolve.py +0 -0
  418. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/expectations.py +0 -0
  419. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fetch_examples.py +0 -0
  420. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/flash_attn.py +0 -0
  421. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fp8.py +0 -0
  422. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/freeze.py +0 -0
  423. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fsdp.py +0 -0
  424. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  425. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/galore.py +0 -0
  426. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gguf_quant.py +0 -0
  427. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gpu.py +0 -0
  428. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gpu_monitor.py +0 -0
  429. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grace_codebook.py +0 -0
  430. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/graceful_save.py +0 -0
  431. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grad_accum.py +0 -0
  432. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  433. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grpo_long_context.py +0 -0
  434. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/grpo_variants.py +0 -0
  435. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hardware_fit.py +0 -0
  436. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/harm_probe.py +0 -0
  437. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hf.py +0 -0
  438. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hf_space.py +0 -0
  439. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/hubs.py +0 -0
  440. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ingest_sources.py +0 -0
  441. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/integrations.py +0 -0
  442. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/interference.py +0 -0
  443. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/interference_live.py +0 -0
  444. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/irt.py +0 -0
  445. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/iterative_dpo.py +0 -0
  446. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  447. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/kernel_picker.py +0 -0
  448. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/knowledge_edit.py +0 -0
  449. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/kv_cache.py +0 -0
  450. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/launcher.py +0 -0
  451. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/license_advisor.py +0 -0
  452. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/license_matrix.py +0 -0
  453. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/liger.py +0 -0
  454. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lisa.py +0 -0
  455. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/live_eval.py +0 -0
  456. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/llama_proxy.py +0 -0
  457. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/llama_server_timings.py +0 -0
  458. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/local_rl.py +0 -0
  459. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  460. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loftq_init.py +0 -0
  461. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/log_level.py +0 -0
  462. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/long_context.py +0 -0
  463. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/longlora.py +0 -0
  464. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_budget.py +0 -0
  465. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_daemon.py +0 -0
  466. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_iteration.py +0 -0
  467. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_stages.py +0 -0
  468. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/loop_state.py +0 -0
  469. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lr_finder.py +0 -0
  470. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/lr_groups.py +0 -0
  471. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/magpie.py +0 -0
  472. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/metrics.py +0 -0
  473. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mii.py +0 -0
  474. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/minillm.py +0 -0
  475. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mix_proxy.py +0 -0
  476. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mixed_precision.py +0 -0
  477. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mlx.py +0 -0
  478. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mod.py +0 -0
  479. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/moe.py +0 -0
  480. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/moe_quant.py +0 -0
  481. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/mole_routing.py +0 -0
  482. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack.py +0 -0
  483. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack_sampler.py +0 -0
  484. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/multipack_trainer.py +0 -0
  485. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/namespace_pin.py +0 -0
  486. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/neat_packing.py +0 -0
  487. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ngram_spec.py +0 -0
  488. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/nlg_metrics.py +0 -0
  489. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ollama.py +0 -0
  490. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/onboarding.py +0 -0
  491. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  492. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/paths.py +0 -0
  493. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_builder.py +0 -0
  494. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_patches.py +0 -0
  495. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/peft_wiring.py +0 -0
  496. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/persona_hub.py +0 -0
  497. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/pipeline.py +0 -0
  498. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/preference_combine.py +0 -0
  499. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prm.py +0 -0
  500. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prm_reward.py +0 -0
  501. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/probe_kernel.py +0 -0
  502. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/probe_pack.py +0 -0
  503. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiler.py +0 -0
  504. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiling.py +0 -0
  505. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  506. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prompt_compile.py +0 -0
  507. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prompt_distill.py +0 -0
  508. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/prune_prompt.py +0 -0
  509. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/qat.py +0 -0
  510. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/qr_url.py +0 -0
  511. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/quality.py +0 -0
  512. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/quant_menu.py +0 -0
  513. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ra_dit.py +0 -0
  514. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ra_dit_run.py +0 -0
  515. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/raft.py +0 -0
  516. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reasoning_effort.py +0 -0
  517. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reasoning_parser.py +0 -0
  518. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/recipe_dag.py +0 -0
  519. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/recipe_run.py +0 -0
  520. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/registry.py +0 -0
  521. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rehearsal.py +0 -0
  522. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/relora.py +0 -0
  523. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/replay.py +0 -0
  524. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/repro_receipt.py +0 -0
  525. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_hack_control.py +0 -0
  526. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_hacking.py +0 -0
  527. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/reward_synth.py +0 -0
  528. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ring_attention.py +0 -0
  529. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  530. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  531. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/run_cost.py +0 -0
  532. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sae_diff.py +0 -0
  533. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/save_formats.py +0 -0
  534. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/semdedup.py +0 -0
  535. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/server_tools.py +0 -0
  536. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sglang.py +0 -0
  537. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ship_verdict.py +0 -0
  538. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/shortcuts.py +0 -0
  539. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/shrink.py +0 -0
  540. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/signing.py +0 -0
  541. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sleeper_probe.py +0 -0
  542. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/soup_lock.py +0 -0
  543. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spec_pairing.py +0 -0
  544. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spectrum_scan.py +0 -0
  545. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/spike_recovery.py +0 -0
  546. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sse_train_stream.py +0 -0
  547. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/steering.py +0 -0
  548. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/strict_safetensors.py +0 -0
  549. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/structured_output.py +0 -0
  550. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/sweep_config.py +0 -0
  551. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tail_latency.py +0 -0
  552. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/terraform_plan.py +0 -0
  553. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tool_outputs.py +0 -0
  554. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/topics.py +0 -0
  555. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/topology.py +0 -0
  556. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tracing.py +0 -0
  557. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trackers.py +0 -0
  558. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/train_event_buffer.py +0 -0
  559. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trainer_plugins.py +0 -0
  560. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/trust_remote.py +0 -0
  561. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/truth_probe.py +0 -0
  562. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tts.py +0 -0
  563. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tts_codec.py +0 -0
  564. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/tunability.py +0 -0
  565. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/ui_env.py +0 -0
  566. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/uld.py +0 -0
  567. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  568. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearning.py +0 -0
  569. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unlearning_eval.py +0 -0
  570. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/unsloth.py +0 -0
  571. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/v028_features.py +0 -0
  572. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vector_bank.py +0 -0
  573. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vllm.py +0 -0
  574. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/vscode_setup.py +0 -0
  575. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/warmup.py +0 -0
  576. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/webhooks.py +0 -0
  577. {soup_cli-0.71.40 → soup_cli-0.71.41}/src/soup_cli/utils/why.py +0 -0
  578. {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/chat.yaml +0 -0
  579. {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/code.yaml +0 -0
  580. {soup_cli-0.71.40 → soup_cli-0.71.41}/templates/medical.yaml +0 -0
  581. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/__init__.py +0 -0
  582. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/conftest.py +0 -0
  583. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v053_qa.md +0 -0
  584. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v07114_qa.md +0 -0
  585. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/qa/v0716_qa.md +0 -0
  586. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_adapters.py +0 -0
  587. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_advanced_peft.py +0 -0
  588. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_assistant_mask.py +0 -0
  589. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_audio.py +0 -0
  590. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_auto_tuning.py +0 -0
  591. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_autopilot.py +0 -0
  592. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_awq_gptq_export.py +0 -0
  593. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_batch_probe.py +0 -0
  594. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bco.py +0 -0
  595. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bench.py +0 -0
  596. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_brain_rot_multilingual.py +0 -0
  597. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_bugfixes.py +0 -0
  598. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_build_dag.py +0 -0
  599. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_callback.py +0 -0
  600. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cans.py +0 -0
  601. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_chat.py +0 -0
  602. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_chat_template.py +0 -0
  603. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cli.py +0 -0
  604. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cli_subprocess.py +0 -0
  605. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_critical.py +0 -0
  606. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_deferred.py +0 -0
  607. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_high.py +0 -0
  608. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_medium_low.py +0 -0
  609. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_code_review_recurring.py +0 -0
  610. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_config.py +0 -0
  611. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_cost.py +0 -0
  612. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_crash_reporter.py +0 -0
  613. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_curriculum.py +0 -0
  614. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data.py +0 -0
  615. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_augment.py +0 -0
  616. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_sample.py +0 -0
  617. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_split.py +0 -0
  618. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_data_tools.py +0 -0
  619. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dataset_hub.py +0 -0
  620. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dataset_registry.py +0 -0
  621. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_deepspeed.py +0 -0
  622. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_deploy_ollama.py +0 -0
  623. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_diff.py +0 -0
  624. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_display.py +0 -0
  625. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_doctor.py +0 -0
  626. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dpo_example.py +0 -0
  627. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_dpo_variants.py +0 -0
  628. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_embedding.py +0 -0
  629. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_errors.py +0 -0
  630. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval.py +0 -0
  631. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval_gate.py +0 -0
  632. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_eval_platform.py +0 -0
  633. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_export.py +0 -0
  634. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_formats.py +0 -0
  635. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_fp8_recipe.py +0 -0
  636. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_freeze_training.py +0 -0
  637. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_generate.py +0 -0
  638. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_gpu.py +0 -0
  639. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_grpo.py +0 -0
  640. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_hf_integration.py +0 -0
  641. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_infer.py +0 -0
  642. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_inference_advanced.py +0 -0
  643. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_init.py +0 -0
  644. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ipo.py +0 -0
  645. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_jinja_analyzer.py +0 -0
  646. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_kto.py +0 -0
  647. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_loader.py +0 -0
  648. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_log_level.py +0 -0
  649. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_loss_watchdog.py +0 -0
  650. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_merge.py +0 -0
  651. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_migrate.py +0 -0
  652. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_mlx_backend.py +0 -0
  653. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_moe.py +0 -0
  654. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multi_adapter.py +0 -0
  655. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multi_gpu.py +0 -0
  656. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_config.py +0 -0
  657. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_invariants.py +0 -0
  658. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_multipack_sampler.py +0 -0
  659. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_neat_packing.py +0 -0
  660. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_neftune_rslora.py +0 -0
  661. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_onnx_tensorrt_export.py +0 -0
  662. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_orpo.py +0 -0
  663. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_packing.py +0 -0
  664. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_a_wave1.py +0 -0
  665. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_a_wave2.py +0 -0
  666. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_b.py +0 -0
  667. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_c.py +0 -0
  668. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_d.py +0 -0
  669. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_e.py +0 -0
  670. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_part_f_hardening.py +0 -0
  671. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_peft_methods.py +0 -0
  672. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_peft_patches.py +0 -0
  673. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_performance.py +0 -0
  674. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_pissa_init.py +0 -0
  675. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ppo.py +0 -0
  676. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_dispatcher.py +0 -0
  677. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_multi.py +0 -0
  678. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_preference_multi_runtime.py +0 -0
  679. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_pretrain.py +0 -0
  680. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_profile.py +0 -0
  681. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_profiling.py +0 -0
  682. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_progress.py +0 -0
  683. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_push.py +0 -0
  684. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_qat.py +0 -0
  685. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quality_filter.py +0 -0
  686. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quant_check.py +0 -0
  687. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quant_menu.py +0 -0
  688. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_quickstart.py +0 -0
  689. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_rank_pattern.py +0 -0
  690. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_recipes.py +0 -0
  691. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_recipes_v031.py +0 -0
  692. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_refusal_multilingual.py +0 -0
  693. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_registry.py +0 -0
  694. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_relora.py +0 -0
  695. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_replay.py +0 -0
  696. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_resume.py +0 -0
  697. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_review_fixes_v07133.py +0 -0
  698. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_rlvr.py +0 -0
  699. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_run_cost.py +0 -0
  700. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_runs.py +0 -0
  701. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_serve.py +0 -0
  702. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_server_generate.py +0 -0
  703. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_sglang_serve.py +0 -0
  704. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_simpo.py +0 -0
  705. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_smoke_train.py +0 -0
  706. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_speculative_decoding.py +0 -0
  707. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_sweep.py +0 -0
  708. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_synth_data_pro.py +0 -0
  709. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_templates_yaml.py +0 -0
  710. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tensorboard.py +0 -0
  711. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tool_calling.py +0 -0
  712. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trace_to_pref.py +0 -0
  713. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tracker.py +0 -0
  714. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trainer_coverage_v035.py +0 -0
  715. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trainer_init.py +0 -0
  716. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_training_intelligence.py +0 -0
  717. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_training_speed.py +0 -0
  718. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_trust_remote_code.py +0 -0
  719. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_tui.py +0 -0
  720. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui.py +0 -0
  721. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_chat.py +0 -0
  722. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_config_builder.py +0 -0
  723. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_live_monitor.py +0 -0
  724. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_ui_metrics.py +0 -0
  725. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_unsloth.py +0 -0
  726. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_c.py +0 -0
  727. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_d.py +0 -0
  728. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0401_part_e.py +0 -0
  729. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0402_part_a.py +0 -0
  730. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0402_part_b.py +0 -0
  731. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_a.py +0 -0
  732. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_b.py +0 -0
  733. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0403_part_c.py +0 -0
  734. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0404_part_a.py +0 -0
  735. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0404_part_b.py +0 -0
  736. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0405_part_a.py +0 -0
  737. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0406_part_a.py +0 -0
  738. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_a.py +0 -0
  739. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_b.py +0 -0
  740. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0410_part_c.py +0 -0
  741. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0420.py +0 -0
  742. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_a.py +0 -0
  743. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_b.py +0 -0
  744. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_c.py +0 -0
  745. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0430_part_d.py +0 -0
  746. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_a.py +0 -0
  747. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_b.py +0 -0
  748. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_c.py +0 -0
  749. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_part_d.py +0 -0
  750. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0440_review_followups.py +0 -0
  751. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0450.py +0 -0
  752. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0460_part_a.py +0 -0
  753. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0460_part_b.py +0 -0
  754. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0470_part_a.py +0 -0
  755. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0470_part_b.py +0 -0
  756. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0480_part_a.py +0 -0
  757. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0480_part_b.py +0 -0
  758. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0490.py +0 -0
  759. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_a.py +0 -0
  760. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_b.py +0 -0
  761. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_c.py +0 -0
  762. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_d.py +0 -0
  763. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0500_part_e.py +0 -0
  764. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0510.py +0 -0
  765. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0520.py +0 -0
  766. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0530.py +0 -0
  767. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v05310.py +0 -0
  768. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v05311.py +0 -0
  769. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_109.py +0 -0
  770. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_139.py +0 -0
  771. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_142.py +0 -0
  772. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0531_82.py +0 -0
  773. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0532.py +0 -0
  774. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0533.py +0 -0
  775. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0534.py +0 -0
  776. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0535.py +0 -0
  777. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0536.py +0 -0
  778. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0537.py +0 -0
  779. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0538.py +0 -0
  780. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0539.py +0 -0
  781. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0540.py +0 -0
  782. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0550.py +0 -0
  783. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0550_followups.py +0 -0
  784. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0560.py +0 -0
  785. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_a.py +0 -0
  786. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_b.py +0 -0
  787. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_c.py +0 -0
  788. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0570_part_d.py +0 -0
  789. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0580.py +0 -0
  790. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0590.py +0 -0
  791. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_a.py +0 -0
  792. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_b.py +0 -0
  793. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_c.py +0 -0
  794. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_d.py +0 -0
  795. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_e.py +0 -0
  796. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0600_part_f.py +0 -0
  797. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_a.py +0 -0
  798. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_b.py +0 -0
  799. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_c.py +0 -0
  800. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_d.py +0 -0
  801. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0610_part_e.py +0 -0
  802. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_followups.py +0 -0
  803. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_a.py +0 -0
  804. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_b.py +0 -0
  805. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_c.py +0 -0
  806. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_d.py +0 -0
  807. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0620_part_e.py +0 -0
  808. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_followups.py +0 -0
  809. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_a.py +0 -0
  810. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_b.py +0 -0
  811. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_c.py +0 -0
  812. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_d.py +0 -0
  813. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0630_part_e.py +0 -0
  814. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0631_206.py +0 -0
  815. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_followups.py +0 -0
  816. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_a.py +0 -0
  817. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_b.py +0 -0
  818. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_c.py +0 -0
  819. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_d.py +0 -0
  820. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_e.py +0 -0
  821. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0640_part_f.py +0 -0
  822. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_followups.py +0 -0
  823. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_a.py +0 -0
  824. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_b.py +0 -0
  825. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_c.py +0 -0
  826. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_d.py +0 -0
  827. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0650_part_e.py +0 -0
  828. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_cli.py +0 -0
  829. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_followups.py +0 -0
  830. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_a.py +0 -0
  831. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_b.py +0 -0
  832. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_c.py +0 -0
  833. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_d.py +0 -0
  834. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0660_part_e.py +0 -0
  835. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_followups.py +0 -0
  836. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_a.py +0 -0
  837. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_b.py +0 -0
  838. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_c.py +0 -0
  839. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_d.py +0 -0
  840. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_e.py +0 -0
  841. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0670_part_f.py +0 -0
  842. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_followups.py +0 -0
  843. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_a.py +0 -0
  844. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_b.py +0 -0
  845. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_c.py +0 -0
  846. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_d.py +0 -0
  847. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0680_part_e.py +0 -0
  848. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_a.py +0 -0
  849. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_b.py +0 -0
  850. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_c.py +0 -0
  851. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_d.py +0 -0
  852. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0690_part_e.py +0 -0
  853. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_a.py +0 -0
  854. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_b.py +0 -0
  855. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_c.py +0 -0
  856. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_d.py +0 -0
  857. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_e.py +0 -0
  858. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0700_part_f.py +0 -0
  859. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07110.py +0 -0
  860. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07111.py +0 -0
  861. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07112.py +0 -0
  862. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07113.py +0 -0
  863. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07114.py +0 -0
  864. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07115.py +0 -0
  865. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07116.py +0 -0
  866. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07117.py +0 -0
  867. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07118.py +0 -0
  868. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07119.py +0 -0
  869. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0712.py +0 -0
  870. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07120.py +0 -0
  871. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07121.py +0 -0
  872. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07122.py +0 -0
  873. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07123.py +0 -0
  874. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07124.py +0 -0
  875. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07125.py +0 -0
  876. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07126.py +0 -0
  877. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07127.py +0 -0
  878. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07128.py +0 -0
  879. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07129.py +0 -0
  880. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0713.py +0 -0
  881. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07130.py +0 -0
  882. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07131.py +0 -0
  883. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07132.py +0 -0
  884. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07133.py +0 -0
  885. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07134.py +0 -0
  886. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07135.py +0 -0
  887. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07136.py +0 -0
  888. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07137.py +0 -0
  889. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07138.py +0 -0
  890. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07139.py +0 -0
  891. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0714.py +0 -0
  892. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v07140.py +0 -0
  893. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0715.py +0 -0
  894. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0716.py +0 -0
  895. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0717.py +0 -0
  896. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0718.py +0 -0
  897. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_v0719.py +0 -0
  898. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_validator.py +0 -0
  899. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_vision.py +0 -0
  900. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_vllm_serve.py +0 -0
  901. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_warmup.py +0 -0
  902. {soup_cli-0.71.40 → soup_cli-0.71.41}/tests/test_why.py +0 -0
  903. {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 (318 files, 16490 tests)
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 (313 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.40
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.40 — `soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
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
- - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
199
- exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
200
- (per-tool `required`/`allowed` argument binding a call can't borrow another tool's keys).
201
- - **A calibration report is the moat.** The verifier is loaded back and run against its own references
202
- (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
203
- is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
204
- - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
205
- edit, commit, and diff it like any other reward.
206
- - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
207
- the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
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.40 — `soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
53
-
54
- - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
55
- exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
56
- (per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
57
- - **A calibration report is the moat.** The verifier is loaded back and run against its own references
58
- (must accept 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
59
- is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
60
- - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path you read,
61
- edit, commit, and diff it like any other reward.
62
- - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
63
- the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
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
- # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
67
- soup reward synth references.jsonl -o reward.py --output-report calib.json
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
- # then train against the reward you just generated
70
- # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
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 (opt-IN, hardware-info-only)
746
+ ## Telemetry (not yet wired)
747
747
 
748
- Soup ships an opt-IN telemetry sender that POSTs hardware-info-only payloads (`soup_version` / `command` / `python` major.minor / `os` / `arch` / optional `duration_seconds`)no dataset paths, model names, or config contents. Enable per-shell:
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.40"
7
+ version = "0.71.41"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.40"
3
+ __version__ = "0.71.41"
@@ -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
+ )