soup-cli 0.71.39__tar.gz → 0.71.40__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (901) hide show
  1. {soup_cli-0.71.39 → soup_cli-0.71.40}/CHANGELOG.md +39 -0
  2. {soup_cli-0.71.39 → soup_cli-0.71.40}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.39 → soup_cli-0.71.40}/PKG-INFO +26 -18
  4. {soup_cli-0.71.39 → soup_cli-0.71.40}/README.md +26 -18
  5. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/commands.md +4 -0
  6. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/training.md +31 -0
  7. {soup_cli-0.71.39 → soup_cli-0.71.40}/pyproject.toml +1 -1
  8. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/__init__.py +1 -1
  9. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cli.py +12 -0
  10. soup_cli-0.71.40/src/soup_cli/commands/reward.py +225 -0
  11. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/schema.py +61 -4
  12. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/calculator.py +2 -1
  13. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/guess_number.py +1 -1
  14. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/grpo.py +9 -3
  15. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/rewards.py +41 -0
  16. soup_cli-0.71.40/src/soup_cli/utils/reward_synth.py +716 -0
  17. soup_cli-0.71.40/tests/test_v07140.py +855 -0
  18. {soup_cli-0.71.39 → soup_cli-0.71.40}/.dockerignore +0 -0
  19. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/FUNDING.yml +0 -0
  20. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/pull_request_template.md +0 -0
  24. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/ci.yml +0 -0
  25. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/docker.yml +0 -0
  26. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/publish.yml +0 -0
  27. {soup_cli-0.71.39 → soup_cli-0.71.40}/.github/workflows/recipe-validation.yml +0 -0
  28. {soup_cli-0.71.39 → soup_cli-0.71.40}/.gitignore +0 -0
  29. {soup_cli-0.71.39 → soup_cli-0.71.40}/.mailmap +0 -0
  30. {soup_cli-0.71.39 → soup_cli-0.71.40}/.pre-commit-config.yaml +0 -0
  31. {soup_cli-0.71.39 → soup_cli-0.71.40}/AGENTS.md +0 -0
  32. {soup_cli-0.71.39 → soup_cli-0.71.40}/CODEOWNERS +0 -0
  33. {soup_cli-0.71.39 → soup_cli-0.71.40}/CODE_OF_CONDUCT.md +0 -0
  34. {soup_cli-0.71.39 → soup_cli-0.71.40}/CONTRIBUTORS.md +0 -0
  35. {soup_cli-0.71.39 → soup_cli-0.71.40}/Dockerfile +0 -0
  36. {soup_cli-0.71.39 → soup_cli-0.71.40}/LICENSE +0 -0
  37. {soup_cli-0.71.39 → soup_cli-0.71.40}/NOTICE +0 -0
  38. {soup_cli-0.71.39 → soup_cli-0.71.40}/SECURITY.md +0 -0
  39. {soup_cli-0.71.39 → soup_cli-0.71.40}/docker-compose.yml +0 -0
  40. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/README.md +0 -0
  41. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/adapters-and-governance.md +0 -0
  42. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/backends-and-ops.md +0 -0
  43. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/compliance.md +0 -0
  44. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/data.md +0 -0
  45. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/evaluation.md +0 -0
  46. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/models.md +0 -0
  47. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/peft-and-efficiency.md +0 -0
  48. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/performance-and-quantization.md +0 -0
  49. {soup_cli-0.71.39 → soup_cli-0.71.40}/docs/serving-and-export.md +0 -0
  50. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/README.md +0 -0
  51. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/dpo_chat.yaml +0 -0
  52. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/dpo_example.yaml +0 -0
  53. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/grpo_reasoning.yaml +0 -0
  54. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step1_sft.yaml +0 -0
  55. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step2_reward.yaml +0 -0
  56. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  57. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/sft_basic.yaml +0 -0
  58. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/configs/vision_llama.yaml +0 -0
  59. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/alpaca_tiny.jsonl +0 -0
  60. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/chat_preferences.jsonl +0 -0
  61. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/dpo_sample.jsonl +0 -0
  62. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/data/reasoning_math.jsonl +0 -0
  63. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/reward_hacking/rewards.py +0 -0
  64. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/synthetic_workflow.md +0 -0
  65. {soup_cli-0.71.39 → soup_cli-0.71.40}/examples/synthetic_workflow.yaml +0 -0
  66. {soup_cli-0.71.39 → soup_cli-0.71.40}/soup.png +0 -0
  67. {soup_cli-0.71.39 → soup_cli-0.71.40}/soup_logo_svg.svg +0 -0
  68. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/__main__.py +0 -0
  69. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/__init__.py +0 -0
  70. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/analyzer.py +0 -0
  71. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/decisions.py +0 -0
  72. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/autopilot/generate_config.py +0 -0
  73. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/__init__.py +0 -0
  74. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/pack.py +0 -0
  75. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/publish.py +0 -0
  76. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/run.py +0 -0
  77. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/schema.py +0 -0
  78. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/unpack.py +0 -0
  79. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cans/verify.py +0 -0
  80. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cloud/__init__.py +0 -0
  81. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/cloud/modal.py +0 -0
  82. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/__init__.py +0 -0
  83. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0550.py +0 -0
  84. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0610.py +0 -0
  85. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0650.py +0 -0
  86. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v07110.py +0 -0
  87. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/_webhook_cli.py +0 -0
  88. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ab.py +0 -0
  89. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/active_sample.py +0 -0
  90. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/adapters.py +0 -0
  91. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/advise.py +0 -0
  92. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/agent.py +0 -0
  93. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/airgap.py +0 -0
  94. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/apple_adapter.py +0 -0
  95. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/attest.py +0 -0
  96. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/audit_log.py +0 -0
  97. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/autopilot.py +0 -0
  98. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/bench.py +0 -0
  99. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/bom.py +0 -0
  100. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/build.py +0 -0
  101. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/can.py +0 -0
  102. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/card.py +0 -0
  103. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/chat.py +0 -0
  104. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ci.py +0 -0
  105. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/compile_cmd.py +0 -0
  106. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/compile_tools.py +0 -0
  107. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/completions.py +0 -0
  108. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/cost.py +0 -0
  109. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data.py +0 -0
  110. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_canary.py +0 -0
  111. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_doctor.py +0 -0
  112. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_forge.py +0 -0
  113. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_mix.py +0 -0
  114. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_score.py +0 -0
  115. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/data_topics.py +0 -0
  116. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  117. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/deploy.py +0 -0
  118. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/diagnose.py +0 -0
  119. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/diff.py +0 -0
  120. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/distill_prompt.py +0 -0
  121. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/doctor.py +0 -0
  122. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/draft.py +0 -0
  123. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/drift_alarm.py +0 -0
  124. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/edit.py +0 -0
  125. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/env.py +0 -0
  126. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/eval.py +0 -0
  127. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/expect.py +0 -0
  128. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/export.py +0 -0
  129. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/fetch.py +0 -0
  130. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/generate.py +0 -0
  131. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/history.py +0 -0
  132. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/infer.py +0 -0
  133. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ingest.py +0 -0
  134. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/init.py +0 -0
  135. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/iterative_dpo.py +0 -0
  136. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/license_advisor.py +0 -0
  137. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/llama.py +0 -0
  138. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/local_rl.py +0 -0
  139. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/lock.py +0 -0
  140. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/loop.py +0 -0
  141. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/mcp.py +0 -0
  142. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/merge.py +0 -0
  143. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  144. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/migrate.py +0 -0
  145. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/monitor.py +0 -0
  146. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/plan.py +0 -0
  147. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/plugins.py +0 -0
  148. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/probe.py +0 -0
  149. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/profile.py +0 -0
  150. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/prune_prompt.py +0 -0
  151. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/push.py +0 -0
  152. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/quantize.py +0 -0
  153. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/quickstart.py +0 -0
  154. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ra_dit.py +0 -0
  155. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/recipes.py +0 -0
  156. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/registry.py +0 -0
  157. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/runs.py +0 -0
  158. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/serve.py +0 -0
  159. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ship.py +0 -0
  160. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/shrink.py +0 -0
  161. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/spectrum.py +0 -0
  162. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/steer.py +0 -0
  163. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/sweep.py +0 -0
  164. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tokenizer.py +0 -0
  165. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/train.py +0 -0
  166. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tui.py +0 -0
  167. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/tunability.py +0 -0
  168. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/ui.py +0 -0
  169. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/commands/why.py +0 -0
  170. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/__init__.py +0 -0
  171. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/config/loader.py +0 -0
  172. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/__init__.py +0 -0
  173. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  174. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  175. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  176. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  177. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  178. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  179. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  180. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  181. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  182. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  183. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  184. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  185. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  186. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  187. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  188. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/augment.py +0 -0
  189. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/chat_templates.py +0 -0
  190. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/collators.py +0 -0
  191. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/formats.py +0 -0
  192. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/loader.py +0 -0
  193. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/loss_mask.py +0 -0
  194. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/__init__.py +0 -0
  195. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/_utils.py +0 -0
  196. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/anthropic.py +0 -0
  197. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/ollama.py +0 -0
  198. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/providers/vllm.py +0 -0
  199. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/sft_format.py +0 -0
  200. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/__init__.py +0 -0
  201. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/code.py +0 -0
  202. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/conversation.py +0 -0
  203. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/preference.py +0 -0
  204. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/qa.py +0 -0
  205. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/reasoning.py +0 -0
  206. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/tool_calling.py +0 -0
  207. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/templates/verifiable.py +0 -0
  208. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/__init__.py +0 -0
  209. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/pair_builder.py +0 -0
  210. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/parsers.py +0 -0
  211. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/traces/quality.py +0 -0
  212. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/data/validator.py +0 -0
  213. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/__init__.py +0 -0
  214. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/_common.py +0 -0
  215. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/envs/retrieval_qa.py +0 -0
  216. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/__init__.py +0 -0
  217. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/arena.py +0 -0
  218. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  219. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/calibrate.py +0 -0
  220. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  221. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/custom.py +0 -0
  222. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/forgetting.py +0 -0
  223. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/gate.py +0 -0
  224. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/gate_suites.py +0 -0
  225. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/human.py +0 -0
  226. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/judge.py +0 -0
  227. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/leaderboard.py +0 -0
  228. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/eval/quant_check.py +0 -0
  229. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/experiment/__init__.py +0 -0
  230. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/experiment/tracker.py +0 -0
  231. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/__init__.py +0 -0
  232. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/registry.py +0 -0
  233. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/mcp_server/server.py +0 -0
  234. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/__init__.py +0 -0
  235. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/axolotl.py +0 -0
  236. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/common.py +0 -0
  237. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/llamafactory.py +0 -0
  238. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/migrate/unsloth.py +0 -0
  239. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/__init__.py +0 -0
  240. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/callback.py +0 -0
  241. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  242. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/display.py +0 -0
  243. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  244. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/hf_push.py +0 -0
  245. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  246. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/monitoring/trace_logger.py +0 -0
  247. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/plugins/__init__.py +0 -0
  248. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/py.typed +0 -0
  249. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/recipes/__init__.py +0 -0
  250. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/recipes/catalog.py +0 -0
  251. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/__init__.py +0 -0
  252. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/attach.py +0 -0
  253. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/diff.py +0 -0
  254. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/hashing.py +0 -0
  255. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/registry/store.py +0 -0
  256. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/__init__.py +0 -0
  257. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/audio.yaml +0 -0
  258. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/bco.yaml +0 -0
  259. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/chat.yaml +0 -0
  260. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/code.yaml +0 -0
  261. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/embedding.yaml +0 -0
  262. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  263. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  264. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  265. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  266. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/hipaa.yaml +0 -0
  267. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/ipo.yaml +0 -0
  268. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/kto.yaml +0 -0
  269. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/longcontext.yaml +0 -0
  270. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/manifest.json +0 -0
  271. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/medical.yaml +0 -0
  272. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/moe.yaml +0 -0
  273. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/orpo.yaml +0 -0
  274. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/pretrain.yaml +0 -0
  275. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/reasoning.yaml +0 -0
  276. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/rlhf.yaml +0 -0
  277. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/simpo.yaml +0 -0
  278. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/soc2.yaml +0 -0
  279. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  280. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/tool-calling.yaml +0 -0
  281. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/templates/vision.yaml +0 -0
  282. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/__init__.py +0 -0
  283. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/asr.py +0 -0
  284. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/bco.py +0 -0
  285. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/bitnet.py +0 -0
  286. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/classifier.py +0 -0
  287. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/distill.py +0 -0
  288. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/dpo.py +0 -0
  289. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/embedding.py +0 -0
  290. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/ipo.py +0 -0
  291. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/kto.py +0 -0
  292. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  293. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  294. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_routing.py +0 -0
  295. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_sft.py +0 -0
  296. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/mole_routing.py +0 -0
  297. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/online_dpo.py +0 -0
  298. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/orpo.py +0 -0
  299. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/ppo.py +0 -0
  300. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/preference.py +0 -0
  301. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/pretrain.py +0 -0
  302. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/prm.py +0 -0
  303. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/raft.py +0 -0
  304. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/reward_model.py +0 -0
  305. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/sft.py +0 -0
  306. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/simpo.py +0 -0
  307. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/tts.py +0 -0
  308. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/trainer/unlearn.py +0 -0
  309. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/tui_app.py +0 -0
  310. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/__init__.py +0 -0
  311. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/app.py +0 -0
  312. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/plugins/__init__.py +0 -0
  313. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/app.js +0 -0
  314. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/index.html +0 -0
  315. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.png +0 -0
  316. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.svg +0 -0
  317. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/ui/static/style.css +0 -0
  318. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/__init__.py +0 -0
  319. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/_eval_text.py +0 -0
  320. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ab_test.py +0 -0
  321. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/activation_offload.py +0 -0
  322. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/active_sampler.py +0 -0
  323. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  324. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_bisect.py +0 -0
  325. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_branch.py +0 -0
  326. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_diff.py +0 -0
  327. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_fuse.py +0 -0
  328. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_merge.py +0 -0
  329. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_pr.py +0 -0
  330. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_scan.py +0 -0
  331. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_sign.py +0 -0
  332. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advanced_precision.py +0 -0
  333. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advise.py +0 -0
  334. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/advise_history.py +0 -0
  335. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_forge.py +0 -0
  336. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_rollout.py +0 -0
  337. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/agent_sandbox.py +0 -0
  338. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/airgap_bundle.py +0 -0
  339. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/annex_xi.py +0 -0
  340. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/anthropic_messages.py +0 -0
  341. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/apple_adapter.py +0 -0
  342. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/asr_metrics.py +0 -0
  343. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/attest.py +0 -0
  344. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/audit_log.py +0 -0
  345. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/auto_quant.py +0 -0
  346. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/backend_detect.py +0 -0
  347. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/batch_probe.py +0 -0
  348. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/behavior_battery.py +0 -0
  349. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/best_of_n.py +0 -0
  350. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/bitnet.py +0 -0
  351. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/blame.py +0 -0
  352. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/block_expansion.py +0 -0
  353. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/bom.py +0 -0
  354. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot.py +0 -0
  355. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  356. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/build_dag.py +0 -0
  357. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary.py +0 -0
  358. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary_discovery.py +0 -0
  359. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/canary_router.py +0 -0
  360. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/capability_suite.py +0 -0
  361. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/checklist_dsl.py +0 -0
  362. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  363. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ci_workflow.py +0 -0
  364. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/citation_faithful.py +0 -0
  365. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/classifier.py +0 -0
  366. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cmaes_merge.py +0 -0
  367. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/compile_tools.py +0 -0
  368. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/completions.py +0 -0
  369. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/constants.py +0 -0
  370. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/convergence.py +0 -0
  371. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/crash.py +0 -0
  372. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  373. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum.py +0 -0
  374. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  375. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/cut_ce.py +0 -0
  376. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_doctor.py +0 -0
  377. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_forge.py +0 -0
  378. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_lint.py +0 -0
  379. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_mix.py +0 -0
  380. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_pipeline.py +0 -0
  381. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/data_score.py +0 -0
  382. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deepspeed.py +0 -0
  383. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  384. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/demo_bundles.py +0 -0
  385. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  386. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_measure.py +0 -0
  387. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  388. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/_common.py +0 -0
  389. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/badge.py +0 -0
  390. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/citation.py +0 -0
  391. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  392. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  393. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/format.py +0 -0
  394. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/live.py +0 -0
  395. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  396. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  397. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  398. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/report.py +0 -0
  399. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/runner.py +0 -0
  400. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/distill.py +0 -0
  401. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/dpo_variants.py +0 -0
  402. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/draft.py +0 -0
  403. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/drift_alarm.py +0 -0
  404. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  405. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/echo_trap.py +0 -0
  406. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_diff.py +0 -0
  407. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_governor.py +0 -0
  408. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/edit_kernels.py +0 -0
  409. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/embed.py +0 -0
  410. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/encoding.py +0 -0
  411. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/energy.py +0 -0
  412. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/env_lock.py +0 -0
  413. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/errors.py +0 -0
  414. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_design.py +0 -0
  415. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  416. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  417. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/evolve.py +0 -0
  418. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/expectations.py +0 -0
  419. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fetch_examples.py +0 -0
  420. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/flash_attn.py +0 -0
  421. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fp8.py +0 -0
  422. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/freeze.py +0 -0
  423. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp.py +0 -0
  424. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  425. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/galore.py +0 -0
  426. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gguf_quant.py +0 -0
  427. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gpu.py +0 -0
  428. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gpu_monitor.py +0 -0
  429. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grace_codebook.py +0 -0
  430. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/graceful_save.py +0 -0
  431. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grad_accum.py +0 -0
  432. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  433. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_long_context.py +0 -0
  434. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_variants.py +0 -0
  435. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hardware_fit.py +0 -0
  436. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/harm_probe.py +0 -0
  437. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hf.py +0 -0
  438. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hf_space.py +0 -0
  439. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/hubs.py +0 -0
  440. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ingest_sources.py +0 -0
  441. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/integrations.py +0 -0
  442. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/interference.py +0 -0
  443. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/interference_live.py +0 -0
  444. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/irt.py +0 -0
  445. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/iterative_dpo.py +0 -0
  446. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  447. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/kernel_picker.py +0 -0
  448. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/knowledge_edit.py +0 -0
  449. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/kv_cache.py +0 -0
  450. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/launcher.py +0 -0
  451. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/license_advisor.py +0 -0
  452. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/license_matrix.py +0 -0
  453. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/liger.py +0 -0
  454. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lisa.py +0 -0
  455. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/live_eval.py +0 -0
  456. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/llama_proxy.py +0 -0
  457. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/llama_server_timings.py +0 -0
  458. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl.py +0 -0
  459. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  460. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loftq_init.py +0 -0
  461. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/log_level.py +0 -0
  462. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/long_context.py +0 -0
  463. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/longlora.py +0 -0
  464. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_budget.py +0 -0
  465. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_daemon.py +0 -0
  466. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_iteration.py +0 -0
  467. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_stages.py +0 -0
  468. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/loop_state.py +0 -0
  469. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lr_finder.py +0 -0
  470. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/lr_groups.py +0 -0
  471. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/magpie.py +0 -0
  472. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/metrics.py +0 -0
  473. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mii.py +0 -0
  474. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/minillm.py +0 -0
  475. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mix_proxy.py +0 -0
  476. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mixed_precision.py +0 -0
  477. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mlx.py +0 -0
  478. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mod.py +0 -0
  479. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/moe.py +0 -0
  480. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/moe_quant.py +0 -0
  481. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/mole_routing.py +0 -0
  482. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack.py +0 -0
  483. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_sampler.py +0 -0
  484. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_trainer.py +0 -0
  485. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/namespace_pin.py +0 -0
  486. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/neat_packing.py +0 -0
  487. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ngram_spec.py +0 -0
  488. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/nlg_metrics.py +0 -0
  489. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ollama.py +0 -0
  490. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/onboarding.py +0 -0
  491. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  492. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/paths.py +0 -0
  493. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_builder.py +0 -0
  494. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_patches.py +0 -0
  495. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/peft_wiring.py +0 -0
  496. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/persona_hub.py +0 -0
  497. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/pipeline.py +0 -0
  498. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/preference_combine.py +0 -0
  499. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prm.py +0 -0
  500. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prm_reward.py +0 -0
  501. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/probe_kernel.py +0 -0
  502. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/probe_pack.py +0 -0
  503. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiler.py +0 -0
  504. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiling.py +0 -0
  505. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  506. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_compile.py +0 -0
  507. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_distill.py +0 -0
  508. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/prune_prompt.py +0 -0
  509. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/qat.py +0 -0
  510. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/qr_url.py +0 -0
  511. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/quality.py +0 -0
  512. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/quant_menu.py +0 -0
  513. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit.py +0 -0
  514. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit_run.py +0 -0
  515. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/raft.py +0 -0
  516. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_effort.py +0 -0
  517. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_parser.py +0 -0
  518. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_dag.py +0 -0
  519. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_run.py +0 -0
  520. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/registry.py +0 -0
  521. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rehearsal.py +0 -0
  522. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/relora.py +0 -0
  523. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/replay.py +0 -0
  524. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/repro_receipt.py +0 -0
  525. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hack_control.py +0 -0
  526. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hacking.py +0 -0
  527. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ring_attention.py +0 -0
  528. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  529. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  530. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/run_cost.py +0 -0
  531. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sae_diff.py +0 -0
  532. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/save_formats.py +0 -0
  533. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/semdedup.py +0 -0
  534. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/server_tools.py +0 -0
  535. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sglang.py +0 -0
  536. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ship_verdict.py +0 -0
  537. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/shortcuts.py +0 -0
  538. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/shrink.py +0 -0
  539. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/signing.py +0 -0
  540. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sleeper_probe.py +0 -0
  541. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/soup_lock.py +0 -0
  542. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spec_pairing.py +0 -0
  543. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spectrum_scan.py +0 -0
  544. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/spike_recovery.py +0 -0
  545. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sse_train_stream.py +0 -0
  546. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/steering.py +0 -0
  547. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/strict_safetensors.py +0 -0
  548. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/structured_output.py +0 -0
  549. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/sweep_config.py +0 -0
  550. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tail_latency.py +0 -0
  551. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/terraform_plan.py +0 -0
  552. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tool_outputs.py +0 -0
  553. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/topics.py +0 -0
  554. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/topology.py +0 -0
  555. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tracing.py +0 -0
  556. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trackers.py +0 -0
  557. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/train_event_buffer.py +0 -0
  558. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trainer_plugins.py +0 -0
  559. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/trust_remote.py +0 -0
  560. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/truth_probe.py +0 -0
  561. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tts.py +0 -0
  562. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tts_codec.py +0 -0
  563. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/tunability.py +0 -0
  564. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/ui_env.py +0 -0
  565. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/uld.py +0 -0
  566. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  567. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning.py +0 -0
  568. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning_eval.py +0 -0
  569. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/unsloth.py +0 -0
  570. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/v028_features.py +0 -0
  571. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vector_bank.py +0 -0
  572. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vllm.py +0 -0
  573. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/vscode_setup.py +0 -0
  574. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/warmup.py +0 -0
  575. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/webhooks.py +0 -0
  576. {soup_cli-0.71.39 → soup_cli-0.71.40}/src/soup_cli/utils/why.py +0 -0
  577. {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/chat.yaml +0 -0
  578. {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/code.yaml +0 -0
  579. {soup_cli-0.71.39 → soup_cli-0.71.40}/templates/medical.yaml +0 -0
  580. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/__init__.py +0 -0
  581. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/conftest.py +0 -0
  582. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v053_qa.md +0 -0
  583. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v07114_qa.md +0 -0
  584. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/qa/v0716_qa.md +0 -0
  585. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_adapters.py +0 -0
  586. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_advanced_peft.py +0 -0
  587. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_assistant_mask.py +0 -0
  588. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_audio.py +0 -0
  589. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_auto_tuning.py +0 -0
  590. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_autopilot.py +0 -0
  591. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_awq_gptq_export.py +0 -0
  592. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_batch_probe.py +0 -0
  593. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bco.py +0 -0
  594. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bench.py +0 -0
  595. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_brain_rot_multilingual.py +0 -0
  596. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_bugfixes.py +0 -0
  597. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_build_dag.py +0 -0
  598. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_callback.py +0 -0
  599. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cans.py +0 -0
  600. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_chat.py +0 -0
  601. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_chat_template.py +0 -0
  602. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cli.py +0 -0
  603. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cli_subprocess.py +0 -0
  604. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_critical.py +0 -0
  605. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_deferred.py +0 -0
  606. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_high.py +0 -0
  607. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_medium_low.py +0 -0
  608. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_code_review_recurring.py +0 -0
  609. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_config.py +0 -0
  610. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_cost.py +0 -0
  611. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_crash_reporter.py +0 -0
  612. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_curriculum.py +0 -0
  613. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data.py +0 -0
  614. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_augment.py +0 -0
  615. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_sample.py +0 -0
  616. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_split.py +0 -0
  617. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_data_tools.py +0 -0
  618. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dataset_hub.py +0 -0
  619. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dataset_registry.py +0 -0
  620. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_deepspeed.py +0 -0
  621. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_deploy_ollama.py +0 -0
  622. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_diff.py +0 -0
  623. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_display.py +0 -0
  624. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_doctor.py +0 -0
  625. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dpo_example.py +0 -0
  626. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_dpo_variants.py +0 -0
  627. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_embedding.py +0 -0
  628. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_errors.py +0 -0
  629. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval.py +0 -0
  630. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval_gate.py +0 -0
  631. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_eval_platform.py +0 -0
  632. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_export.py +0 -0
  633. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_formats.py +0 -0
  634. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_fp8_recipe.py +0 -0
  635. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_freeze_training.py +0 -0
  636. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_generate.py +0 -0
  637. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_gpu.py +0 -0
  638. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_grpo.py +0 -0
  639. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_hf_integration.py +0 -0
  640. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_infer.py +0 -0
  641. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_inference_advanced.py +0 -0
  642. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_init.py +0 -0
  643. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ipo.py +0 -0
  644. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_jinja_analyzer.py +0 -0
  645. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_kto.py +0 -0
  646. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_loader.py +0 -0
  647. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_log_level.py +0 -0
  648. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_loss_watchdog.py +0 -0
  649. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_merge.py +0 -0
  650. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_migrate.py +0 -0
  651. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_mlx_backend.py +0 -0
  652. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_moe.py +0 -0
  653. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multi_adapter.py +0 -0
  654. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multi_gpu.py +0 -0
  655. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_config.py +0 -0
  656. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_invariants.py +0 -0
  657. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_multipack_sampler.py +0 -0
  658. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_neat_packing.py +0 -0
  659. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_neftune_rslora.py +0 -0
  660. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_onnx_tensorrt_export.py +0 -0
  661. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_orpo.py +0 -0
  662. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_packing.py +0 -0
  663. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_a_wave1.py +0 -0
  664. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_a_wave2.py +0 -0
  665. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_b.py +0 -0
  666. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_c.py +0 -0
  667. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_d.py +0 -0
  668. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_e.py +0 -0
  669. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_part_f_hardening.py +0 -0
  670. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_peft_methods.py +0 -0
  671. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_peft_patches.py +0 -0
  672. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_performance.py +0 -0
  673. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_pissa_init.py +0 -0
  674. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ppo.py +0 -0
  675. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_dispatcher.py +0 -0
  676. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_multi.py +0 -0
  677. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_preference_multi_runtime.py +0 -0
  678. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_pretrain.py +0 -0
  679. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_profile.py +0 -0
  680. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_profiling.py +0 -0
  681. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_progress.py +0 -0
  682. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_push.py +0 -0
  683. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_qat.py +0 -0
  684. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quality_filter.py +0 -0
  685. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quant_check.py +0 -0
  686. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quant_menu.py +0 -0
  687. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_quickstart.py +0 -0
  688. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_rank_pattern.py +0 -0
  689. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_recipes.py +0 -0
  690. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_recipes_v031.py +0 -0
  691. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_refusal_multilingual.py +0 -0
  692. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_registry.py +0 -0
  693. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_relora.py +0 -0
  694. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_replay.py +0 -0
  695. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_resume.py +0 -0
  696. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_review_fixes_v07133.py +0 -0
  697. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_rlvr.py +0 -0
  698. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_run_cost.py +0 -0
  699. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_runs.py +0 -0
  700. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_serve.py +0 -0
  701. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_server_generate.py +0 -0
  702. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_sglang_serve.py +0 -0
  703. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_simpo.py +0 -0
  704. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_smoke_train.py +0 -0
  705. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_speculative_decoding.py +0 -0
  706. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_sweep.py +0 -0
  707. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_synth_data_pro.py +0 -0
  708. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_templates_yaml.py +0 -0
  709. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tensorboard.py +0 -0
  710. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tool_calling.py +0 -0
  711. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trace_to_pref.py +0 -0
  712. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tracker.py +0 -0
  713. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trainer_coverage_v035.py +0 -0
  714. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trainer_init.py +0 -0
  715. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_training_intelligence.py +0 -0
  716. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_training_speed.py +0 -0
  717. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_trust_remote_code.py +0 -0
  718. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_tui.py +0 -0
  719. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui.py +0 -0
  720. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_chat.py +0 -0
  721. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_config_builder.py +0 -0
  722. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_live_monitor.py +0 -0
  723. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_ui_metrics.py +0 -0
  724. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_unsloth.py +0 -0
  725. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_c.py +0 -0
  726. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_d.py +0 -0
  727. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0401_part_e.py +0 -0
  728. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0402_part_a.py +0 -0
  729. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0402_part_b.py +0 -0
  730. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_a.py +0 -0
  731. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_b.py +0 -0
  732. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0403_part_c.py +0 -0
  733. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0404_part_a.py +0 -0
  734. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0404_part_b.py +0 -0
  735. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0405_part_a.py +0 -0
  736. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0406_part_a.py +0 -0
  737. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_a.py +0 -0
  738. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_b.py +0 -0
  739. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0410_part_c.py +0 -0
  740. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0420.py +0 -0
  741. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_a.py +0 -0
  742. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_b.py +0 -0
  743. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_c.py +0 -0
  744. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0430_part_d.py +0 -0
  745. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_a.py +0 -0
  746. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_b.py +0 -0
  747. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_c.py +0 -0
  748. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_part_d.py +0 -0
  749. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0440_review_followups.py +0 -0
  750. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0450.py +0 -0
  751. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0460_part_a.py +0 -0
  752. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0460_part_b.py +0 -0
  753. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0470_part_a.py +0 -0
  754. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0470_part_b.py +0 -0
  755. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0480_part_a.py +0 -0
  756. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0480_part_b.py +0 -0
  757. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0490.py +0 -0
  758. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_a.py +0 -0
  759. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_b.py +0 -0
  760. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_c.py +0 -0
  761. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_d.py +0 -0
  762. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0500_part_e.py +0 -0
  763. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0510.py +0 -0
  764. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0520.py +0 -0
  765. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0530.py +0 -0
  766. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v05310.py +0 -0
  767. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v05311.py +0 -0
  768. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_109.py +0 -0
  769. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_139.py +0 -0
  770. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_142.py +0 -0
  771. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0531_82.py +0 -0
  772. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0532.py +0 -0
  773. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0533.py +0 -0
  774. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0534.py +0 -0
  775. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0535.py +0 -0
  776. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0536.py +0 -0
  777. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0537.py +0 -0
  778. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0538.py +0 -0
  779. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0539.py +0 -0
  780. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0540.py +0 -0
  781. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0550.py +0 -0
  782. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0550_followups.py +0 -0
  783. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0560.py +0 -0
  784. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_a.py +0 -0
  785. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_b.py +0 -0
  786. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_c.py +0 -0
  787. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0570_part_d.py +0 -0
  788. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0580.py +0 -0
  789. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0590.py +0 -0
  790. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_a.py +0 -0
  791. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_b.py +0 -0
  792. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_c.py +0 -0
  793. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_d.py +0 -0
  794. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_e.py +0 -0
  795. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0600_part_f.py +0 -0
  796. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_a.py +0 -0
  797. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_b.py +0 -0
  798. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_c.py +0 -0
  799. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_d.py +0 -0
  800. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0610_part_e.py +0 -0
  801. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_followups.py +0 -0
  802. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_a.py +0 -0
  803. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_b.py +0 -0
  804. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_c.py +0 -0
  805. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_d.py +0 -0
  806. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0620_part_e.py +0 -0
  807. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_followups.py +0 -0
  808. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_a.py +0 -0
  809. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_b.py +0 -0
  810. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_c.py +0 -0
  811. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_d.py +0 -0
  812. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0630_part_e.py +0 -0
  813. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0631_206.py +0 -0
  814. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_followups.py +0 -0
  815. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_a.py +0 -0
  816. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_b.py +0 -0
  817. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_c.py +0 -0
  818. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_d.py +0 -0
  819. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_e.py +0 -0
  820. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0640_part_f.py +0 -0
  821. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_followups.py +0 -0
  822. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_a.py +0 -0
  823. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_b.py +0 -0
  824. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_c.py +0 -0
  825. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_d.py +0 -0
  826. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0650_part_e.py +0 -0
  827. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_cli.py +0 -0
  828. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_followups.py +0 -0
  829. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_a.py +0 -0
  830. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_b.py +0 -0
  831. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_c.py +0 -0
  832. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_d.py +0 -0
  833. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0660_part_e.py +0 -0
  834. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_followups.py +0 -0
  835. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_a.py +0 -0
  836. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_b.py +0 -0
  837. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_c.py +0 -0
  838. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_d.py +0 -0
  839. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_e.py +0 -0
  840. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0670_part_f.py +0 -0
  841. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_followups.py +0 -0
  842. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_a.py +0 -0
  843. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_b.py +0 -0
  844. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_c.py +0 -0
  845. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_d.py +0 -0
  846. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0680_part_e.py +0 -0
  847. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_a.py +0 -0
  848. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_b.py +0 -0
  849. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_c.py +0 -0
  850. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_d.py +0 -0
  851. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0690_part_e.py +0 -0
  852. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_a.py +0 -0
  853. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_b.py +0 -0
  854. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_c.py +0 -0
  855. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_d.py +0 -0
  856. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_e.py +0 -0
  857. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0700_part_f.py +0 -0
  858. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07110.py +0 -0
  859. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07111.py +0 -0
  860. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07112.py +0 -0
  861. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07113.py +0 -0
  862. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07114.py +0 -0
  863. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07115.py +0 -0
  864. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07116.py +0 -0
  865. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07117.py +0 -0
  866. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07118.py +0 -0
  867. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07119.py +0 -0
  868. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0712.py +0 -0
  869. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07120.py +0 -0
  870. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07121.py +0 -0
  871. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07122.py +0 -0
  872. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07123.py +0 -0
  873. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07124.py +0 -0
  874. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07125.py +0 -0
  875. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07126.py +0 -0
  876. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07127.py +0 -0
  877. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07128.py +0 -0
  878. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07129.py +0 -0
  879. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0713.py +0 -0
  880. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07130.py +0 -0
  881. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07131.py +0 -0
  882. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07132.py +0 -0
  883. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07133.py +0 -0
  884. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07134.py +0 -0
  885. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07135.py +0 -0
  886. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07136.py +0 -0
  887. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07137.py +0 -0
  888. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07138.py +0 -0
  889. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v07139.py +0 -0
  890. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0714.py +0 -0
  891. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0715.py +0 -0
  892. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0716.py +0 -0
  893. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0717.py +0 -0
  894. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0718.py +0 -0
  895. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_v0719.py +0 -0
  896. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_validator.py +0 -0
  897. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_vision.py +0 -0
  898. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_vllm_serve.py +0 -0
  899. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_warmup.py +0 -0
  900. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_why.py +0 -0
  901. {soup_cli-0.71.39 → soup_cli-0.71.40}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,45 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.40] - 2026-07-19
16
+
17
+ **`soup reward synth`: auto-generate a deterministic reward verifier from your data.**
18
+ Point it at a JSONL of reference (gold) outputs and it infers a verifier, emits a
19
+ readable / committable `.py` reward function, and — the moat — *refuses* to emit one
20
+ that can't tell your references from auto-generated bad answers. Nothing in
21
+ TRL / Unsloth / Axolotl / OpenRLHF synthesizes a reward; every reward today is
22
+ hand-written, hand-picked, or a trained-weights artifact.
23
+
24
+ ### Added
25
+
26
+ - **`soup reward synth <references.jsonl> -o reward.py`** — deterministic verifier
27
+ synthesis. Four families, auto-detected (or pick with `--kind`): `numeric`
28
+ (last-number / `\boxed{}` / `####` extraction, exact or `--tolerance`), `json_schema`
29
+ (induced keys + types + required), `regex` (positional char-classes over
30
+ equal-length golds), `tool_call` (per-tool `required`/`allowed` argument binding).
31
+ The emitted file is self-contained and rides `load_reward_fn`'s existing `.py`
32
+ path — no new trusted-exec surface; you read, edit, commit, and diff it.
33
+ - **Mandatory calibration report** — the synthesized verifier is loaded back and run
34
+ against its own references (must accept ≥90%) and auto-perturbed negatives (must
35
+ reject). A degenerate always-accept verifier is **refused** (`exit 2`), never
36
+ silently emitted. `--plan-only` reports the induced spec without writing;
37
+ `--output-report` persists the calibration JSON.
38
+ - **Comma-separated `reward_fn` (`"accuracy,format"`)** now trains — it resolves to a
39
+ reward *ensemble* (`GRPOTrainer(reward_funcs=[...])`, and unlocks the `rm_ensemble`
40
+ reward-hack detector which needs ≥2 rewards). GRPO-only, validated at config-parse
41
+ time. Fixes a recipe (`deepseek-v3-reasoning`) that shipped exactly this and
42
+ previously crashed with `Unknown reward function` (#311).
43
+
44
+ ### Changed / Fixed
45
+
46
+ - `training.reward_fn` gains a field validator (null-byte / blank / oversize /
47
+ empty-comma-segment rejection) — the oldest arbitrary-code field was the least
48
+ guarded. Comma + `verifiable` without a `verifiable_domain` now fails at parse
49
+ time like the bare `verifiable` form.
50
+ - `envs/calculator.py` / `envs/guess_number.py` docstrings corrected: the reward is
51
+ `reward_fn: verifiable` + `verifiable_domain: math` (the bare `reward_fn='math'`
52
+ they showed was never valid).
53
+
15
54
  ## [0.71.39] - 2026-07-19
16
55
 
17
56
  **"CI for weights, not prompts": close the evidence loop.** `soup ship`'s verdict is
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (317 files, 16387 tests)
123
+ tests/ - Test suite (318 files, 16490 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.39
3
+ Version: 0.71.40
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,29 +193,37 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.39CI for weights, not prompts.** `soup ship`'s verdict is now something Soup can emit, commit, review, and bind to the exact model that produced it so a fine-tuning gate renders on every PR instead of asking you to hand-edit a JSON file.
196
+ **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and the part nobody else does*refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
197
197
 
198
- - **Output is finally input.** `soup ship --emit-evidence ev.json` writes the scores in the
199
- `--evidence` schema, so a run replays offline into an identical verdict — the round-trip the
200
- old `--output` couldn't do.
201
- - **Commit the gate policy.** Put `eval.ship` in your `soup.yaml` (`forgetting_threshold`,
202
- `general_suite`, `task_mode`, ) and `soup ship --config soup.yaml` reads it the gate is now
203
- reviewable in a PR diff. Explicit flags still win.
204
- - **Provenance-bound evidence.** `--config --emit-evidence` STAMPS a `config_sha` onto the
205
- evidence; `--config --evidence` GATES on it a PR that changed the recipe but forgot to
206
- recompute its evidence is refused (exit 3). Tuning the threshold never falsely invalidates it.
207
- - **The verdict on your PR.** `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card as
208
- a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
198
+ - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
199
+ exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
200
+ (per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
201
+ - **A calibration report is the moat.** The verifier is loaded back and run against its own references
202
+ (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
203
+ is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
204
+ - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
205
+ edit, commit, and diff it like any other reward.
206
+ - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
207
+ the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
209
208
 
210
209
  ```bash
211
- # producer (train job): stamp the scores with the config that produced them
212
- soup ship --evidence scores.json --config soup.yaml --emit-evidence ship_evidence.json
210
+ # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
211
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
213
212
 
214
- # gate (PR CI): refuse evidence that doesn't match the committed config
215
- soup ship --evidence ship_evidence.json --config soup.yaml --push owner/repo#42
216
- soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
213
+ # then train against the reward you just generated
214
+ # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
217
215
  ```
218
216
 
217
+ <details>
218
+ <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
219
+
220
+ `soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
221
+ run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
222
+ reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).
223
+ `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
224
+
225
+ </details>
226
+
219
227
  <details>
220
228
  <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
221
229
 
@@ -49,29 +49,37 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.39CI for weights, not prompts.** `soup ship`'s verdict is now something Soup can emit, commit, review, and bind to the exact model that produced it so a fine-tuning gate renders on every PR instead of asking you to hand-edit a JSON file.
53
-
54
- - **Output is finally input.** `soup ship --emit-evidence ev.json` writes the scores in the
55
- `--evidence` schema, so a run replays offline into an identical verdict — the round-trip the
56
- old `--output` couldn't do.
57
- - **Commit the gate policy.** Put `eval.ship` in your `soup.yaml` (`forgetting_threshold`,
58
- `general_suite`, `task_mode`, ) and `soup ship --config soup.yaml` reads it the gate is now
59
- reviewable in a PR diff. Explicit flags still win.
60
- - **Provenance-bound evidence.** `--config --emit-evidence` STAMPS a `config_sha` onto the
61
- evidence; `--config --evidence` GATES on it a PR that changed the recipe but forgot to
62
- recompute its evidence is refused (exit 3). Tuning the threshold never falsely invalidates it.
63
- - **The verdict on your PR.** `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card as
64
- a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
52
+ **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and the part nobody else does*refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
53
+
54
+ - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
55
+ exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
56
+ (per-tool `required`/`allowed` argument binding — a call can't borrow another tool's keys).
57
+ - **A calibration report is the moat.** The verifier is loaded back and run against its own references
58
+ (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
59
+ is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
60
+ - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path — you read,
61
+ edit, commit, and diff it like any other reward.
62
+ - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
63
+ the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
65
64
 
66
65
  ```bash
67
- # producer (train job): stamp the scores with the config that produced them
68
- soup ship --evidence scores.json --config soup.yaml --emit-evidence ship_evidence.json
66
+ # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
67
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
69
68
 
70
- # gate (PR CI): refuse evidence that doesn't match the committed config
71
- soup ship --evidence ship_evidence.json --config soup.yaml --push owner/repo#42
72
- soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
69
+ # then train against the reward you just generated
70
+ # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
73
71
  ```
74
72
 
73
+ <details>
74
+ <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
75
+
76
+ `soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
77
+ run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
78
+ reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).
79
+ `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
80
+
81
+ </details>
82
+
75
83
  <details>
76
84
  <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
77
85
 
@@ -182,6 +182,10 @@ soup draft measure ... --min-acceptance 0.6 -o report.json Exit 2 below the flo
182
182
  soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/ Distil a DENSE speculative-decoding draft + register it (v0.71.33)
183
183
  soup draft distill ... --steps N --device cpu --force --plan-only Training budget / device / overwrite -o / render the config only
184
184
  soup draft list List local drafts that `soup serve --auto-spec` will pick up (v0.71.33)
185
+ soup reward synth refs.jsonl -o reward.py Synthesize a deterministic reward verifier from gold outputs (v0.71.40)
186
+ soup reward synth ... --kind numeric|json_schema|regex|tool_call Force a verifier family (default: auto-detect)
187
+ soup reward synth ... --plan-only Report the induced spec + calibration plan; write nothing
188
+ soup reward synth ... --output-report r.json --min-discrimination 0.5 Save the calibration JSON / set the refusal threshold (exit 0 emit / 2 refuse / 1 error)
185
189
  soup tui Full-screen Textual dashboard (requires [tui] extra)
186
190
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
187
191
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -866,6 +866,37 @@ training:
866
866
  reward_fn: ./my_reward.py
867
867
  ```
868
868
 
869
+ **Reward ensembles** — list several rewards, comma-separated, and they combine (GRPO only).
870
+ This also unlocks the `rm_ensemble` reward-hack detector, which needs ≥ 2 rewards:
871
+ ```yaml
872
+ training:
873
+ reward_fn: "accuracy,format" # both are scored every step
874
+ ```
875
+
876
+ ### Synthesize a verifier from your data (`soup reward synth`)
877
+
878
+ Don't hand-write a verifier — generate one from reference (gold) outputs. Soup infers a
879
+ *deterministic* verifier (numeric / JSON-schema / regex / tool-call), writes a readable, editable
880
+ `.py`, and **refuses to emit** one that can't tell your references from auto-generated bad answers
881
+ (the mandatory calibration report). The emitted file is a normal `reward_fn: reward.py`.
882
+
883
+ ```bash
884
+ # infer + calibrate + emit (exit 0 kept, 2 refused, 1 error)
885
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
886
+
887
+ # preview the induced spec without writing anything
888
+ soup reward synth references.jsonl --plan-only
889
+
890
+ # force a family instead of auto-detecting
891
+ soup reward synth answers.jsonl -o reward.py --kind numeric --tolerance 1e-6
892
+ ```
893
+
894
+ References are a JSONL where each row's gold answer is in an `answer` field (override with
895
+ `--field`) or the last assistant turn of a `messages` list. `--min-discrimination` sets how
896
+ strongly the verifier must separate references from perturbed negatives before it's emitted.
897
+ v1 is deterministic families only — a `\boxed{}`/`####` marker helps the numeric verifier, and
898
+ completions are prompted to mark their answer (standard RLVR practice).
899
+
869
900
  ### Verifiable Rewards (RLVR)
870
901
 
871
902
  Use `reward_fn: verifiable` with a `verifiable_domain` for deterministic, math-checkable rewards — no judge model, no heuristics. Great for GRPO on math, code, or structured-output tasks.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.39"
7
+ version = "0.71.40"
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.39"
3
+ __version__ = "0.71.40"
@@ -563,6 +563,18 @@ app.add_typer(
563
563
  ),
564
564
  )
565
565
 
566
+ # v0.71.40 — `soup reward synth` auto-generate a deterministic verifier.
567
+ from soup_cli.commands import reward as _reward_cmd # noqa: E402
568
+
569
+ app.add_typer(
570
+ _reward_cmd.app,
571
+ name="reward",
572
+ help=(
573
+ "Synthesize a deterministic reward verifier from reference outputs, with "
574
+ "a calibration report that refuses degenerate verifiers (v0.71.40)."
575
+ ),
576
+ )
577
+
566
578
 
567
579
  def _rewrite_advise_argv(argv: list) -> list:
568
580
  """Inject `run` between `advise` and a non-subcommand first argument.
@@ -0,0 +1,225 @@
1
+ """soup reward — synthesize a deterministic reward verifier (v0.71.40).
2
+
3
+ soup reward synth <references.jsonl> -o reward.py
4
+ [--kind auto|numeric|json_schema|regex|tool_call]
5
+
6
+ Infers a deterministic verifier from a dataset of reference (gold) outputs, emits a
7
+ readable / committable ``.py`` that rides ``load_reward_fn``'s existing ``.py`` path,
8
+ and REFUSES to emit a degenerate verifier via a mandatory calibration report.
9
+
10
+ Exit codes mirror ``soup ship`` / ``soup shrink``: 0 = emitted, 2 = refused (the
11
+ verifier could not discriminate references from perturbed negatives), 1 = usage /
12
+ runtime error.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ import math
19
+ import os
20
+ from typing import NoReturn, Optional
21
+
22
+ import typer
23
+ from rich.console import Console
24
+ from rich.markup import escape
25
+ from rich.panel import Panel
26
+ from rich.table import Table
27
+
28
+ from soup_cli.utils import reward_synth as rs
29
+ from soup_cli.utils.paths import atomic_write_text, enforce_under_cwd_and_no_symlink
30
+
31
+ app = typer.Typer(help="Synthesize a deterministic reward verifier from reference outputs.")
32
+ console = Console()
33
+
34
+ _MAX_INPUT_BYTES = 64 * 1024 * 1024
35
+ _MAX_ROWS = 1_000_000
36
+ _ALLOWED_KINDS = ("auto",) + rs.KINDS
37
+
38
+
39
+ @app.callback()
40
+ def _reward() -> None:
41
+ """Reward-verifier tooling. Forces ``synth`` to be a named subcommand (a
42
+ single-command Typer app otherwise collapses and eats the subcommand token)."""
43
+
44
+
45
+ def _fail(message: str, code: int = 1) -> NoReturn:
46
+ """Print a red error and exit (raises internally — a forgotten ``raise`` at a
47
+ call site can never silently become a no-op; mirrors ``commands/ship.py``)."""
48
+ console.print(f"[red]{escape(message)}[/]")
49
+ raise typer.Exit(code)
50
+
51
+
52
+ def _read_jsonl(path: str, label: str) -> list[dict]:
53
+ """Read a JSONL file: cwd-contained, O_NOFOLLOW, size- and row-capped."""
54
+ enforce_under_cwd_and_no_symlink(path, label)
55
+ flags = os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0)
56
+ try:
57
+ fd = os.open(path, flags)
58
+ except OSError as exc:
59
+ raise ValueError(f"{label} unreadable: {exc}") from exc
60
+ rows: list[dict] = []
61
+ with os.fdopen(fd, "r", encoding="utf-8") as handle:
62
+ if os.fstat(handle.fileno()).st_size > _MAX_INPUT_BYTES:
63
+ raise ValueError(f"{label} exceeds {_MAX_INPUT_BYTES} bytes")
64
+ for line in handle:
65
+ line = line.strip()
66
+ if not line:
67
+ continue
68
+ try:
69
+ row = json.loads(line)
70
+ except json.JSONDecodeError:
71
+ continue
72
+ if isinstance(row, dict):
73
+ rows.append(row)
74
+ if len(rows) >= _MAX_ROWS:
75
+ break
76
+ return rows
77
+
78
+
79
+ def _spec_summary(kind: str, spec: object) -> str:
80
+ """One-line human summary of the induced spec (for --plan-only / the panel)."""
81
+ if kind == "numeric" and isinstance(spec, rs.NumericSpec):
82
+ return f"numeric (float={spec.is_float}, tolerance={spec.tolerance})"
83
+ if kind == "json_schema" and isinstance(spec, dict):
84
+ props = ", ".join(sorted(spec.get("properties", {}))) or "(none)"
85
+ return f"json_schema (type={spec.get('type')}, keys={props})"
86
+ if kind == "tool_call" and isinstance(spec, rs.ToolCallSpec):
87
+ return f"tool_call (names={list(spec.names)}, arg_keys={list(spec.arg_keys)})"
88
+ if kind == "regex":
89
+ return f"regex (pattern={spec})"
90
+ return kind
91
+
92
+
93
+ def _render_report_panel(report: rs.CalibrationReport, kind: str, out_path: str) -> Panel:
94
+ table = Table(show_header=False, box=None, pad_edge=False)
95
+ table.add_column(justify="right", style="dim")
96
+ table.add_column()
97
+ table.add_row("verifier kind", escape(kind))
98
+ table.add_row("references (accepted)", f"{report.positives} ({report.pos_accept:.0%})")
99
+ table.add_row("negatives (accepted)", f"{report.negatives} ({report.neg_accept:.0%})")
100
+ table.add_row("discrimination", f"{report.discrimination:.2f}")
101
+ table.add_row("precision", f"{report.precision:.2f}")
102
+ table.add_row("emitted", escape(out_path))
103
+ return Panel(table, title="[bold green]reward verifier synthesized[/]",
104
+ border_style="green")
105
+
106
+
107
+ @app.command()
108
+ def synth(
109
+ references: str = typer.Argument(
110
+ ..., help="JSONL of reference (gold) outputs — a gold field or chat messages."
111
+ ),
112
+ output: Optional[str] = typer.Option(
113
+ None, "-o", "--output", help="Where to write the verifier .py."
114
+ ),
115
+ kind: str = typer.Option(
116
+ "auto", "--kind",
117
+ help="Verifier family: auto | numeric | json_schema | regex | tool_call.",
118
+ ),
119
+ field: str = typer.Option(
120
+ "answer", "--field", help="Gold-output field (default: answer)."
121
+ ),
122
+ tolerance: Optional[float] = typer.Option(
123
+ None, "--tolerance", help="Numeric match tolerance (numeric kind only)."
124
+ ),
125
+ min_discrimination: float = typer.Option(
126
+ rs.DEFAULT_MIN_DISCRIMINATION, "--min-discrimination",
127
+ help="Refuse to emit unless (accept_rate refs - accept_rate negatives) >= this.",
128
+ ),
129
+ force: bool = typer.Option(False, "--force", help="Overwrite an existing output."),
130
+ plan_only: bool = typer.Option(
131
+ False, "--plan-only", help="Detect + report the induced spec; write nothing."
132
+ ),
133
+ output_report: Optional[str] = typer.Option(
134
+ None, "--output-report", help="Also write the calibration report as JSON."
135
+ ),
136
+ ) -> None:
137
+ """Synthesize a deterministic reward verifier from reference outputs."""
138
+ if kind not in _ALLOWED_KINDS:
139
+ _fail(f"unknown --kind {kind!r}; options: {', '.join(_ALLOWED_KINDS)}")
140
+ if not 0.0 <= min_discrimination <= 1.0:
141
+ _fail("--min-discrimination must be in [0.0, 1.0]")
142
+ if tolerance is not None and (not math.isfinite(tolerance) or tolerance < 0):
143
+ _fail("--tolerance must be a finite, non-negative number")
144
+
145
+ # Read references.
146
+ try:
147
+ rows = _read_jsonl(references, "references path")
148
+ except (ValueError, OSError) as exc:
149
+ _fail(str(exc))
150
+ if not rows:
151
+ _fail("references file has no JSON-object rows")
152
+
153
+ # Detect + induce + render (no file written yet).
154
+ try:
155
+ result = rs.synthesize(rows, field=field, kind=kind, tolerance=tolerance,
156
+ rel_hint=(output or "reward.py"))
157
+ except (ValueError, TypeError) as exc:
158
+ _fail(str(exc))
159
+
160
+ if plan_only:
161
+ console.print(Panel(
162
+ escape(_spec_summary(result.kind, result.spec)),
163
+ title=f"[bold]plan: {escape(result.kind)} verifier[/]", border_style="cyan"))
164
+ raise typer.Exit(0)
165
+
166
+ # Output guards.
167
+ if not output:
168
+ _fail("must pass -o/--output to emit a verifier (or use --plan-only)")
169
+ if not output.endswith(".py"):
170
+ _fail(f"output must be a .py file, got {output!r}")
171
+ try:
172
+ enforce_under_cwd_and_no_symlink(output, "output path")
173
+ except (ValueError, OSError) as exc:
174
+ _fail(str(exc))
175
+ if os.path.exists(output) and not force:
176
+ _fail(f"{output!r} already exists — pass --force to overwrite")
177
+ # Validate the optional report path UP FRONT so a bad report path can never
178
+ # cause us to destroy an already-written, already-accepted verifier later.
179
+ if output_report:
180
+ try:
181
+ enforce_under_cwd_and_no_symlink(output_report, "report path")
182
+ except (ValueError, OSError) as exc:
183
+ _fail(str(exc))
184
+
185
+ # Write, then LOAD it back through the real reward-loader path (round-trip
186
+ # validation) and calibrate the loaded callable.
187
+ atomic_write_text(result.source, output)
188
+ try:
189
+ from soup_cli.trainer.rewards import load_reward_fn
190
+ reward_fn = load_reward_fn(output)
191
+ golds = rs.extract_golds(rows, field=field)
192
+ negatives = rs.perturb_negatives(golds, result.kind)
193
+ report = rs.calibrate(reward_fn, golds, negatives, kind=result.kind,
194
+ min_discrimination=min_discrimination)
195
+ except Exception as exc: # noqa: BLE001 — clean up the partial artifact
196
+ _cleanup(output)
197
+ _fail(f"calibration failed: {exc}")
198
+
199
+ # Write the diagnostic report (path already validated up front) for BOTH the
200
+ # accepted and refused cases. Best-effort: a write failure here warns but must
201
+ # not delete an otherwise-valid verifier.
202
+ if output_report:
203
+ try:
204
+ from dataclasses import asdict
205
+ atomic_write_text(json.dumps(asdict(report), indent=2), output_report)
206
+ except OSError as exc:
207
+ console.print(f"[yellow]Warning: could not write report: {escape(str(exc))}[/]")
208
+
209
+ if report.refused:
210
+ _cleanup(output)
211
+ console.print(Panel(
212
+ escape(report.reason),
213
+ title="[bold red]verifier refused (not emitted)[/]", border_style="red"))
214
+ raise typer.Exit(2)
215
+
216
+ console.print(_render_report_panel(report, result.kind, output))
217
+ raise typer.Exit(0)
218
+
219
+
220
+ def _cleanup(path: str) -> None:
221
+ """Remove a just-written artifact; best-effort (never masks the real error)."""
222
+ try:
223
+ os.remove(path)
224
+ except OSError:
225
+ pass
@@ -1107,10 +1107,38 @@ class TrainingConfig(BaseModel):
1107
1107
  reward_fn: Optional[str] = Field(
1108
1108
  default="accuracy",
1109
1109
  description=(
1110
- "Reward function: 'accuracy', 'format', 'verifiable', "
1111
- "or path to custom .py file"
1110
+ "Reward function: 'accuracy', 'format', 'verifiable', a path to a "
1111
+ "custom .py file, or a comma-separated ensemble of the above "
1112
+ "(e.g. 'accuracy,format') — the comma form is GRPO-only (v0.71.40)."
1112
1113
  ),
1113
1114
  )
1115
+ @field_validator("reward_fn", mode="before")
1116
+ @classmethod
1117
+ def _validate_reward_fn_field(cls, value: Any) -> Optional[str]:
1118
+ """v0.71.40 #311 — shape-only validation (containment enforced at load).
1119
+
1120
+ Accepts a comma-separated spec ("accuracy,format"); rejects null bytes,
1121
+ oversize, and empty comma segments so a stray comma fails loud rather
1122
+ than silently dropping a reward.
1123
+ """
1124
+ if value is None:
1125
+ return None
1126
+ if isinstance(value, bool) or not isinstance(value, str):
1127
+ raise ValueError(
1128
+ f"reward_fn must be a string, got {type(value).__name__}"
1129
+ )
1130
+ if "\x00" in value:
1131
+ raise ValueError("reward_fn must not contain null bytes")
1132
+ if len(value) > 512:
1133
+ raise ValueError("reward_fn must be <= 512 chars")
1134
+ if not value.strip():
1135
+ raise ValueError("reward_fn must not be blank")
1136
+ if any(not seg.strip() for seg in value.split(",")):
1137
+ raise ValueError(
1138
+ "reward_fn has an empty comma segment — remove the stray comma"
1139
+ )
1140
+ return value
1141
+
1114
1142
  # RLVR — verifiable reward domain (Part C of v0.25.0)
1115
1143
  verifiable_domain: Optional[Literal["math", "code", "json_schema"]] = Field(
1116
1144
  default=None,
@@ -2978,8 +3006,18 @@ class TrainingConfig(BaseModel):
2978
3006
 
2979
3007
  @model_validator(mode="after")
2980
3008
  def _validate_verifiable_reward(self) -> "TrainingConfig":
2981
- """RLVR: reward_fn='verifiable' requires verifiable_domain."""
2982
- if self.reward_fn == "verifiable" and self.verifiable_domain is None:
3009
+ """RLVR: reward_fn='verifiable' requires verifiable_domain.
3010
+
3011
+ Comma-aware (v0.71.40 #311): ``"accuracy,verifiable"`` must fail at
3012
+ config-parse time exactly like the bare ``"verifiable"`` form, not only
3013
+ at trainer construction.
3014
+ """
3015
+ segments = (
3016
+ [s.strip() for s in self.reward_fn.split(",")]
3017
+ if isinstance(self.reward_fn, str)
3018
+ else []
3019
+ )
3020
+ if "verifiable" in segments and self.verifiable_domain is None:
2983
3021
  raise ValueError(
2984
3022
  "reward_fn='verifiable' requires verifiable_domain "
2985
3023
  "(one of: math, code, json_schema)"
@@ -4662,6 +4700,25 @@ class SoupConfig(BaseModel):
4662
4700
  )
4663
4701
  return self
4664
4702
 
4703
+ @model_validator(mode="after")
4704
+ def _validate_reward_fn_multi_compat(self) -> "SoupConfig":
4705
+ """v0.71.40 #311 — a comma-separated reward_fn is GRPO-only.
4706
+
4707
+ Only ``trainer/grpo.py::_select_reward_fn`` resolves a multi-reward spec
4708
+ into a ``reward_funcs=[...]`` list; ``trainer/ppo.py`` (and every other
4709
+ consumer) calls the single-name loader, so a comma there would silently
4710
+ pass config validation and then crash at training start with
4711
+ ``Unknown reward function``. Footgun-reject it up front (mirrors the
4712
+ online_dpo / asr / lisa task gates).
4713
+ """
4714
+ rf = self.training.reward_fn
4715
+ if isinstance(rf, str) and "," in rf and self.task != "grpo":
4716
+ raise ValueError(
4717
+ f"a comma-separated training.reward_fn (an ensemble, {rf!r}) is "
4718
+ f"only supported for task='grpo'; got task={self.task!r}"
4719
+ )
4720
+ return self
4721
+
4665
4722
  @model_validator(mode="after")
4666
4723
  def _validate_asr_compat(self) -> "SoupConfig":
4667
4724
  """v0.71.32 — ASR (Whisper) gate.
@@ -1,7 +1,8 @@
1
1
  """Calculator tool-use rollout env — v0.71.30.
2
2
 
3
3
  Generates a deterministic set of single-operation arithmetic problems as GRPO
4
- prompt+answer rows. Score with ``reward_fn='math'`` (or ``'accuracy'``).
4
+ prompt+answer rows. Score with ``reward_fn: verifiable`` +
5
+ ``verifiable_domain: math`` (or ``reward_fn: accuracy``).
5
6
 
6
7
  Usage: ``training.rollout_backend='openenv'`` +
7
8
  ``training.rollout_func='soup_cli.envs.calculator:rollout'``.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Generates deterministic single-shot number-deduction puzzles (constraints that
4
4
  pin a unique integer) as GRPO prompt+answer rows. Score with
5
- ``reward_fn='math'`` (or ``'accuracy'``).
5
+ ``reward_fn: verifiable`` + ``verifiable_domain: math`` (or ``reward_fn: accuracy``).
6
6
 
7
7
  Honesty: this is single-shot *deduction*, not interactive guess-and-feedback —
8
8
  the live openenv contract does not pass the model, so a true guessing loop is
@@ -129,7 +129,9 @@ def _read_attr(obj: Any, name: str) -> Any:
129
129
  return getattr(obj, name, None)
130
130
 
131
131
 
132
- def _select_reward_fn(tcfg: TrainingConfig, device: str, trust_remote_code: bool) -> Any:
132
+ def _select_reward_fn(
133
+ tcfg: TrainingConfig, device: str, trust_remote_code: bool
134
+ ) -> "Any": # Callable | list[Callable] (a single reward or a comma-split ensemble)
133
135
  """Choose the GRPO reward function (v0.71.30).
134
136
 
135
137
  When ``tcfg.prm_reward`` is set, a trained Soup PRM scores each completion's
@@ -142,9 +144,13 @@ def _select_reward_fn(tcfg: TrainingConfig, device: str, trust_remote_code: bool
142
144
  from soup_cli.utils.prm_reward import build_prm_reward_fn
143
145
 
144
146
  return build_prm_reward_fn(tcfg, device, trust_remote_code)
145
- from soup_cli.trainer.rewards import load_reward_fn
147
+ # v0.71.40 #311 — ``reward_fn`` may be comma-separated ("accuracy,format").
148
+ # Return a single callable for one reward (back-compat) or a list for several
149
+ # (TRL's reward_funcs=[...] + the rm_ensemble detector both accept the list).
150
+ from soup_cli.trainer.rewards import load_reward_fns
146
151
 
147
- return load_reward_fn(tcfg.reward_fn, verifiable_domain=tcfg.verifiable_domain)
152
+ fns = load_reward_fns(tcfg.reward_fn, verifiable_domain=tcfg.verifiable_domain)
153
+ return fns[0] if len(fns) == 1 else fns
148
154
 
149
155
 
150
156
  class GRPOTrainerWrapper: