soup-cli 0.71.29__tar.gz → 0.71.30__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (863) hide show
  1. {soup_cli-0.71.29 → soup_cli-0.71.30}/CHANGELOG.md +38 -0
  2. {soup_cli-0.71.29 → soup_cli-0.71.30}/CONTRIBUTING.md +3 -3
  3. {soup_cli-0.71.29 → soup_cli-0.71.30}/PKG-INFO +21 -16
  4. {soup_cli-0.71.29 → soup_cli-0.71.30}/README.md +20 -15
  5. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/README.md +1 -1
  6. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/commands.md +1 -1
  7. soup_cli-0.71.30/docs/superpowers/plans/2026-07-05-prm-guided-grpo.md +133 -0
  8. soup_cli-0.71.30/docs/superpowers/specs/2026-07-05-prm-guided-grpo-design.md +152 -0
  9. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/training.md +56 -1
  10. {soup_cli-0.71.29 → soup_cli-0.71.30}/pyproject.toml +1 -1
  11. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/__init__.py +1 -1
  12. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/schema.py +75 -0
  13. soup_cli-0.71.30/src/soup_cli/envs/__init__.py +18 -0
  14. soup_cli-0.71.30/src/soup_cli/envs/_common.py +29 -0
  15. soup_cli-0.71.30/src/soup_cli/envs/calculator.py +41 -0
  16. soup_cli-0.71.30/src/soup_cli/envs/guess_number.py +44 -0
  17. soup_cli-0.71.30/src/soup_cli/envs/retrieval_qa.py +54 -0
  18. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/recipes/catalog.py +99 -0
  19. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/grpo.py +51 -31
  20. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/prm.py +58 -2
  21. soup_cli-0.71.30/src/soup_cli/utils/prm_reward.py +373 -0
  22. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_recipes.py +3 -2
  23. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07124.py +3 -3
  24. soup_cli-0.71.30/tests/test_v07130.py +797 -0
  25. {soup_cli-0.71.29 → soup_cli-0.71.30}/.dockerignore +0 -0
  26. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/FUNDING.yml +0 -0
  27. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  28. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  29. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  30. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/pull_request_template.md +0 -0
  31. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/ci.yml +0 -0
  32. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/docker.yml +0 -0
  33. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/publish.yml +0 -0
  34. {soup_cli-0.71.29 → soup_cli-0.71.30}/.github/workflows/recipe-validation.yml +0 -0
  35. {soup_cli-0.71.29 → soup_cli-0.71.30}/.gitignore +0 -0
  36. {soup_cli-0.71.29 → soup_cli-0.71.30}/.mailmap +0 -0
  37. {soup_cli-0.71.29 → soup_cli-0.71.30}/.pre-commit-config.yaml +0 -0
  38. {soup_cli-0.71.29 → soup_cli-0.71.30}/AGENTS.md +0 -0
  39. {soup_cli-0.71.29 → soup_cli-0.71.30}/CODEOWNERS +0 -0
  40. {soup_cli-0.71.29 → soup_cli-0.71.30}/CODE_OF_CONDUCT.md +0 -0
  41. {soup_cli-0.71.29 → soup_cli-0.71.30}/CONTRIBUTORS.md +0 -0
  42. {soup_cli-0.71.29 → soup_cli-0.71.30}/Dockerfile +0 -0
  43. {soup_cli-0.71.29 → soup_cli-0.71.30}/LICENSE +0 -0
  44. {soup_cli-0.71.29 → soup_cli-0.71.30}/NOTICE +0 -0
  45. {soup_cli-0.71.29 → soup_cli-0.71.30}/SECURITY.md +0 -0
  46. {soup_cli-0.71.29 → soup_cli-0.71.30}/docker-compose.yml +0 -0
  47. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/adapters-and-governance.md +0 -0
  48. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/backends-and-ops.md +0 -0
  49. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/data.md +0 -0
  50. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/evaluation.md +0 -0
  51. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/models.md +0 -0
  52. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/peft-and-efficiency.md +0 -0
  53. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/performance-and-quantization.md +0 -0
  54. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/serving-and-export.md +0 -0
  55. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/superpowers/plans/2026-07-05-soup-shrink-depth-prune.md +0 -0
  56. {soup_cli-0.71.29 → soup_cli-0.71.30}/docs/superpowers/specs/2026-07-05-soup-shrink-depth-prune-design.md +0 -0
  57. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/README.md +0 -0
  58. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/dpo_chat.yaml +0 -0
  59. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/dpo_example.yaml +0 -0
  60. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/grpo_reasoning.yaml +0 -0
  61. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step1_sft.yaml +0 -0
  62. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step2_reward.yaml +0 -0
  63. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  64. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/sft_basic.yaml +0 -0
  65. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/configs/vision_llama.yaml +0 -0
  66. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/alpaca_tiny.jsonl +0 -0
  67. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/chat_preferences.jsonl +0 -0
  68. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/dpo_sample.jsonl +0 -0
  69. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/data/reasoning_math.jsonl +0 -0
  70. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/reward_hacking/rewards.py +0 -0
  71. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/synthetic_workflow.md +0 -0
  72. {soup_cli-0.71.29 → soup_cli-0.71.30}/examples/synthetic_workflow.yaml +0 -0
  73. {soup_cli-0.71.29 → soup_cli-0.71.30}/soup.png +0 -0
  74. {soup_cli-0.71.29 → soup_cli-0.71.30}/soup_logo_svg.svg +0 -0
  75. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/__main__.py +0 -0
  76. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/__init__.py +0 -0
  77. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/analyzer.py +0 -0
  78. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/decisions.py +0 -0
  79. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/autopilot/generate_config.py +0 -0
  80. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/__init__.py +0 -0
  81. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/pack.py +0 -0
  82. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/publish.py +0 -0
  83. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/run.py +0 -0
  84. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/schema.py +0 -0
  85. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/unpack.py +0 -0
  86. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cans/verify.py +0 -0
  87. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cli.py +0 -0
  88. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cloud/__init__.py +0 -0
  89. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/cloud/modal.py +0 -0
  90. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/__init__.py +0 -0
  91. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0550.py +0 -0
  92. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0610.py +0 -0
  93. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0650.py +0 -0
  94. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v07110.py +0 -0
  95. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/_webhook_cli.py +0 -0
  96. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ab.py +0 -0
  97. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/active_sample.py +0 -0
  98. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/adapters.py +0 -0
  99. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/advise.py +0 -0
  100. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/agent.py +0 -0
  101. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/airgap.py +0 -0
  102. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/apple_adapter.py +0 -0
  103. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/attest.py +0 -0
  104. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/audit_log.py +0 -0
  105. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/autopilot.py +0 -0
  106. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/bench.py +0 -0
  107. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/bom.py +0 -0
  108. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/build.py +0 -0
  109. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/can.py +0 -0
  110. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/chat.py +0 -0
  111. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/compile_cmd.py +0 -0
  112. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/compile_tools.py +0 -0
  113. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/completions.py +0 -0
  114. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/cost.py +0 -0
  115. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data.py +0 -0
  116. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_doctor.py +0 -0
  117. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_forge.py +0 -0
  118. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_mix.py +0 -0
  119. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/data_score.py +0 -0
  120. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  121. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/deploy.py +0 -0
  122. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/diagnose.py +0 -0
  123. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/diff.py +0 -0
  124. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/distill_prompt.py +0 -0
  125. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/doctor.py +0 -0
  126. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/drift_alarm.py +0 -0
  127. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/edit.py +0 -0
  128. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/env.py +0 -0
  129. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/eval.py +0 -0
  130. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/expect.py +0 -0
  131. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/export.py +0 -0
  132. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/fetch.py +0 -0
  133. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/generate.py +0 -0
  134. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/history.py +0 -0
  135. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/infer.py +0 -0
  136. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ingest.py +0 -0
  137. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/init.py +0 -0
  138. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/iterative_dpo.py +0 -0
  139. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/license_advisor.py +0 -0
  140. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/llama.py +0 -0
  141. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/local_rl.py +0 -0
  142. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/lock.py +0 -0
  143. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/loop.py +0 -0
  144. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/mcp.py +0 -0
  145. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/merge.py +0 -0
  146. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  147. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/migrate.py +0 -0
  148. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/monitor.py +0 -0
  149. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/plan.py +0 -0
  150. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/plugins.py +0 -0
  151. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/probe.py +0 -0
  152. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/profile.py +0 -0
  153. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/prune_prompt.py +0 -0
  154. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/push.py +0 -0
  155. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/quantize.py +0 -0
  156. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/quickstart.py +0 -0
  157. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ra_dit.py +0 -0
  158. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/recipes.py +0 -0
  159. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/registry.py +0 -0
  160. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/runs.py +0 -0
  161. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/serve.py +0 -0
  162. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ship.py +0 -0
  163. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/shrink.py +0 -0
  164. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/spectrum.py +0 -0
  165. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/steer.py +0 -0
  166. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/sweep.py +0 -0
  167. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tokenizer.py +0 -0
  168. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/train.py +0 -0
  169. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tui.py +0 -0
  170. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/tunability.py +0 -0
  171. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/ui.py +0 -0
  172. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/commands/why.py +0 -0
  173. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/__init__.py +0 -0
  174. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/config/loader.py +0 -0
  175. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/__init__.py +0 -0
  176. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  177. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  178. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  179. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  180. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  181. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  182. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  183. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  184. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  185. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  186. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  187. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  188. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/augment.py +0 -0
  189. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/chat_templates.py +0 -0
  190. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/collators.py +0 -0
  191. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/formats.py +0 -0
  192. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/loader.py +0 -0
  193. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/loss_mask.py +0 -0
  194. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/__init__.py +0 -0
  195. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/_utils.py +0 -0
  196. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/anthropic.py +0 -0
  197. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/ollama.py +0 -0
  198. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/providers/vllm.py +0 -0
  199. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/sft_format.py +0 -0
  200. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/__init__.py +0 -0
  201. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/code.py +0 -0
  202. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/conversation.py +0 -0
  203. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/preference.py +0 -0
  204. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/qa.py +0 -0
  205. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/reasoning.py +0 -0
  206. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/tool_calling.py +0 -0
  207. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/templates/verifiable.py +0 -0
  208. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/__init__.py +0 -0
  209. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/pair_builder.py +0 -0
  210. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/parsers.py +0 -0
  211. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/traces/quality.py +0 -0
  212. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/data/validator.py +0 -0
  213. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/__init__.py +0 -0
  214. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/arena.py +0 -0
  215. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  216. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/calibrate.py +0 -0
  217. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  218. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/custom.py +0 -0
  219. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/forgetting.py +0 -0
  220. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/gate.py +0 -0
  221. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/human.py +0 -0
  222. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/judge.py +0 -0
  223. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/leaderboard.py +0 -0
  224. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/eval/quant_check.py +0 -0
  225. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/experiment/__init__.py +0 -0
  226. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/experiment/tracker.py +0 -0
  227. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/__init__.py +0 -0
  228. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/registry.py +0 -0
  229. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/mcp_server/server.py +0 -0
  230. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/__init__.py +0 -0
  231. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/axolotl.py +0 -0
  232. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/common.py +0 -0
  233. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/llamafactory.py +0 -0
  234. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/migrate/unsloth.py +0 -0
  235. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/__init__.py +0 -0
  236. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/callback.py +0 -0
  237. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  238. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/display.py +0 -0
  239. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  240. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/hf_push.py +0 -0
  241. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  242. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/monitoring/trace_logger.py +0 -0
  243. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/plugins/__init__.py +0 -0
  244. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/py.typed +0 -0
  245. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/recipes/__init__.py +0 -0
  246. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/__init__.py +0 -0
  247. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/attach.py +0 -0
  248. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/diff.py +0 -0
  249. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/hashing.py +0 -0
  250. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/registry/store.py +0 -0
  251. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/__init__.py +0 -0
  252. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/audio.yaml +0 -0
  253. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/bco.yaml +0 -0
  254. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/chat.yaml +0 -0
  255. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/code.yaml +0 -0
  256. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/embedding.yaml +0 -0
  257. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  258. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  259. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  260. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/ipo.yaml +0 -0
  261. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/kto.yaml +0 -0
  262. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/longcontext.yaml +0 -0
  263. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/manifest.json +0 -0
  264. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/medical.yaml +0 -0
  265. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/moe.yaml +0 -0
  266. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/orpo.yaml +0 -0
  267. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/pretrain.yaml +0 -0
  268. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/reasoning.yaml +0 -0
  269. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/rlhf.yaml +0 -0
  270. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/simpo.yaml +0 -0
  271. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/tool-calling.yaml +0 -0
  272. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/templates/vision.yaml +0 -0
  273. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/__init__.py +0 -0
  274. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/bco.py +0 -0
  275. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/bitnet.py +0 -0
  276. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/classifier.py +0 -0
  277. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/distill.py +0 -0
  278. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/dpo.py +0 -0
  279. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/embedding.py +0 -0
  280. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/ipo.py +0 -0
  281. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/kto.py +0 -0
  282. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  283. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  284. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_routing.py +0 -0
  285. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_sft.py +0 -0
  286. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/mole_routing.py +0 -0
  287. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/orpo.py +0 -0
  288. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/ppo.py +0 -0
  289. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/preference.py +0 -0
  290. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/pretrain.py +0 -0
  291. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/raft.py +0 -0
  292. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/reward_model.py +0 -0
  293. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/rewards.py +0 -0
  294. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/sft.py +0 -0
  295. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/simpo.py +0 -0
  296. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/tts.py +0 -0
  297. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/trainer/unlearn.py +0 -0
  298. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/tui_app.py +0 -0
  299. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/__init__.py +0 -0
  300. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/app.py +0 -0
  301. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/plugins/__init__.py +0 -0
  302. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/app.js +0 -0
  303. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/index.html +0 -0
  304. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.png +0 -0
  305. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.svg +0 -0
  306. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/ui/static/style.css +0 -0
  307. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/__init__.py +0 -0
  308. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/_eval_text.py +0 -0
  309. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ab_test.py +0 -0
  310. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/activation_offload.py +0 -0
  311. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/active_sampler.py +0 -0
  312. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_bisect.py +0 -0
  313. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_branch.py +0 -0
  314. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_diff.py +0 -0
  315. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_merge.py +0 -0
  316. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_pr.py +0 -0
  317. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_scan.py +0 -0
  318. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_sign.py +0 -0
  319. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advanced_precision.py +0 -0
  320. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advise.py +0 -0
  321. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/advise_history.py +0 -0
  322. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_forge.py +0 -0
  323. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_rollout.py +0 -0
  324. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/agent_sandbox.py +0 -0
  325. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/airgap_bundle.py +0 -0
  326. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/annex_xi.py +0 -0
  327. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/anthropic_messages.py +0 -0
  328. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/apple_adapter.py +0 -0
  329. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/attest.py +0 -0
  330. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/audit_log.py +0 -0
  331. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/auto_quant.py +0 -0
  332. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/backend_detect.py +0 -0
  333. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/batch_probe.py +0 -0
  334. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/behavior_battery.py +0 -0
  335. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/bitnet.py +0 -0
  336. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/blame.py +0 -0
  337. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/block_expansion.py +0 -0
  338. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/bom.py +0 -0
  339. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot.py +0 -0
  340. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  341. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/build_dag.py +0 -0
  342. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/canary_discovery.py +0 -0
  343. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/canary_router.py +0 -0
  344. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/capability_suite.py +0 -0
  345. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/checklist_dsl.py +0 -0
  346. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  347. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/citation_faithful.py +0 -0
  348. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/classifier.py +0 -0
  349. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cmaes_merge.py +0 -0
  350. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/compile_tools.py +0 -0
  351. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/completions.py +0 -0
  352. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/constants.py +0 -0
  353. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/convergence.py +0 -0
  354. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/crash.py +0 -0
  355. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  356. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum.py +0 -0
  357. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  358. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/cut_ce.py +0 -0
  359. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_doctor.py +0 -0
  360. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_forge.py +0 -0
  361. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_lint.py +0 -0
  362. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_mix.py +0 -0
  363. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_pipeline.py +0 -0
  364. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/data_score.py +0 -0
  365. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deepspeed.py +0 -0
  366. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  367. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/demo_bundles.py +0 -0
  368. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  369. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_measure.py +0 -0
  370. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  371. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/_common.py +0 -0
  372. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/badge.py +0 -0
  373. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/citation.py +0 -0
  374. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  375. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  376. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/format.py +0 -0
  377. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/live.py +0 -0
  378. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  379. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  380. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  381. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/report.py +0 -0
  382. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/runner.py +0 -0
  383. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/distill.py +0 -0
  384. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/dpo_variants.py +0 -0
  385. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/drift_alarm.py +0 -0
  386. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  387. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/echo_trap.py +0 -0
  388. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_diff.py +0 -0
  389. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_governor.py +0 -0
  390. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/edit_kernels.py +0 -0
  391. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/encoding.py +0 -0
  392. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/energy.py +0 -0
  393. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/env_lock.py +0 -0
  394. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/errors.py +0 -0
  395. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_design.py +0 -0
  396. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  397. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  398. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/expectations.py +0 -0
  399. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fetch_examples.py +0 -0
  400. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/flash_attn.py +0 -0
  401. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fp8.py +0 -0
  402. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/freeze.py +0 -0
  403. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp.py +0 -0
  404. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  405. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/galore.py +0 -0
  406. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gguf_quant.py +0 -0
  407. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gpu.py +0 -0
  408. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gpu_monitor.py +0 -0
  409. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grace_codebook.py +0 -0
  410. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/graceful_save.py +0 -0
  411. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grad_accum.py +0 -0
  412. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  413. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_long_context.py +0 -0
  414. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_variants.py +0 -0
  415. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hardware_fit.py +0 -0
  416. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/harm_probe.py +0 -0
  417. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hf.py +0 -0
  418. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hf_space.py +0 -0
  419. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/hubs.py +0 -0
  420. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ingest_sources.py +0 -0
  421. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/integrations.py +0 -0
  422. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/interference.py +0 -0
  423. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/interference_live.py +0 -0
  424. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/irt.py +0 -0
  425. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/iterative_dpo.py +0 -0
  426. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  427. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/kernel_picker.py +0 -0
  428. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/knowledge_edit.py +0 -0
  429. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/kv_cache.py +0 -0
  430. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/launcher.py +0 -0
  431. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/license_advisor.py +0 -0
  432. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/license_matrix.py +0 -0
  433. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/liger.py +0 -0
  434. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/live_eval.py +0 -0
  435. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/llama_proxy.py +0 -0
  436. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/llama_server_timings.py +0 -0
  437. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl.py +0 -0
  438. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  439. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loftq_init.py +0 -0
  440. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/log_level.py +0 -0
  441. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/long_context.py +0 -0
  442. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/longlora.py +0 -0
  443. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_budget.py +0 -0
  444. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_daemon.py +0 -0
  445. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_iteration.py +0 -0
  446. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_stages.py +0 -0
  447. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/loop_state.py +0 -0
  448. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/lr_finder.py +0 -0
  449. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/lr_groups.py +0 -0
  450. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/magpie.py +0 -0
  451. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/metrics.py +0 -0
  452. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mii.py +0 -0
  453. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/minillm.py +0 -0
  454. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mix_proxy.py +0 -0
  455. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mixed_precision.py +0 -0
  456. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mlx.py +0 -0
  457. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mod.py +0 -0
  458. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/moe.py +0 -0
  459. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/moe_quant.py +0 -0
  460. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/mole_routing.py +0 -0
  461. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack.py +0 -0
  462. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_sampler.py +0 -0
  463. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_trainer.py +0 -0
  464. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/namespace_pin.py +0 -0
  465. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/neat_packing.py +0 -0
  466. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ngram_spec.py +0 -0
  467. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/nlg_metrics.py +0 -0
  468. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ollama.py +0 -0
  469. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/onboarding.py +0 -0
  470. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  471. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/paths.py +0 -0
  472. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_builder.py +0 -0
  473. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_patches.py +0 -0
  474. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/peft_wiring.py +0 -0
  475. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/persona_hub.py +0 -0
  476. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/pipeline.py +0 -0
  477. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/preference_combine.py +0 -0
  478. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prm.py +0 -0
  479. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/probe_kernel.py +0 -0
  480. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/probe_pack.py +0 -0
  481. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiler.py +0 -0
  482. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiling.py +0 -0
  483. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  484. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_compile.py +0 -0
  485. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_distill.py +0 -0
  486. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/prune_prompt.py +0 -0
  487. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/qat.py +0 -0
  488. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/qr_url.py +0 -0
  489. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/quality.py +0 -0
  490. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/quant_menu.py +0 -0
  491. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit.py +0 -0
  492. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit_run.py +0 -0
  493. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/raft.py +0 -0
  494. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_effort.py +0 -0
  495. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_parser.py +0 -0
  496. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_dag.py +0 -0
  497. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_run.py +0 -0
  498. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/registry.py +0 -0
  499. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/relora.py +0 -0
  500. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/replay.py +0 -0
  501. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/repro_receipt.py +0 -0
  502. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hack_control.py +0 -0
  503. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hacking.py +0 -0
  504. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ring_attention.py +0 -0
  505. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  506. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  507. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/run_cost.py +0 -0
  508. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sae_diff.py +0 -0
  509. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/save_formats.py +0 -0
  510. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/server_tools.py +0 -0
  511. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sglang.py +0 -0
  512. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ship_verdict.py +0 -0
  513. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/shortcuts.py +0 -0
  514. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/shrink.py +0 -0
  515. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/signing.py +0 -0
  516. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sleeper_probe.py +0 -0
  517. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/soup_lock.py +0 -0
  518. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spec_pairing.py +0 -0
  519. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spectrum_scan.py +0 -0
  520. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/spike_recovery.py +0 -0
  521. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sse_train_stream.py +0 -0
  522. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/steering.py +0 -0
  523. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/strict_safetensors.py +0 -0
  524. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/structured_output.py +0 -0
  525. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/sweep_config.py +0 -0
  526. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tail_latency.py +0 -0
  527. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/terraform_plan.py +0 -0
  528. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tool_outputs.py +0 -0
  529. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/topology.py +0 -0
  530. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tracing.py +0 -0
  531. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trackers.py +0 -0
  532. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/train_event_buffer.py +0 -0
  533. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trainer_plugins.py +0 -0
  534. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/trust_remote.py +0 -0
  535. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/truth_probe.py +0 -0
  536. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tts.py +0 -0
  537. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tts_codec.py +0 -0
  538. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/tunability.py +0 -0
  539. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/ui_env.py +0 -0
  540. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/uld.py +0 -0
  541. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  542. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning.py +0 -0
  543. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning_eval.py +0 -0
  544. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/unsloth.py +0 -0
  545. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/v028_features.py +0 -0
  546. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vector_bank.py +0 -0
  547. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vllm.py +0 -0
  548. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/vscode_setup.py +0 -0
  549. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/warmup.py +0 -0
  550. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/webhooks.py +0 -0
  551. {soup_cli-0.71.29 → soup_cli-0.71.30}/src/soup_cli/utils/why.py +0 -0
  552. {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/chat.yaml +0 -0
  553. {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/code.yaml +0 -0
  554. {soup_cli-0.71.29 → soup_cli-0.71.30}/templates/medical.yaml +0 -0
  555. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/__init__.py +0 -0
  556. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/conftest.py +0 -0
  557. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v053_qa.md +0 -0
  558. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v07114_qa.md +0 -0
  559. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/qa/v0716_qa.md +0 -0
  560. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_adapters.py +0 -0
  561. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_advanced_peft.py +0 -0
  562. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_assistant_mask.py +0 -0
  563. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_audio.py +0 -0
  564. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_auto_tuning.py +0 -0
  565. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_autopilot.py +0 -0
  566. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_awq_gptq_export.py +0 -0
  567. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_batch_probe.py +0 -0
  568. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bco.py +0 -0
  569. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bench.py +0 -0
  570. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_brain_rot_multilingual.py +0 -0
  571. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_bugfixes.py +0 -0
  572. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_build_dag.py +0 -0
  573. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_callback.py +0 -0
  574. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cans.py +0 -0
  575. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_chat.py +0 -0
  576. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_chat_template.py +0 -0
  577. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cli.py +0 -0
  578. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cli_subprocess.py +0 -0
  579. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_critical.py +0 -0
  580. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_deferred.py +0 -0
  581. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_high.py +0 -0
  582. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_medium_low.py +0 -0
  583. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_code_review_recurring.py +0 -0
  584. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_config.py +0 -0
  585. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_cost.py +0 -0
  586. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_crash_reporter.py +0 -0
  587. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_curriculum.py +0 -0
  588. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data.py +0 -0
  589. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_augment.py +0 -0
  590. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_sample.py +0 -0
  591. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_split.py +0 -0
  592. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_data_tools.py +0 -0
  593. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dataset_hub.py +0 -0
  594. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dataset_registry.py +0 -0
  595. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_deepspeed.py +0 -0
  596. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_deploy_ollama.py +0 -0
  597. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_diff.py +0 -0
  598. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_display.py +0 -0
  599. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_doctor.py +0 -0
  600. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dpo_example.py +0 -0
  601. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_dpo_variants.py +0 -0
  602. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_embedding.py +0 -0
  603. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_errors.py +0 -0
  604. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval.py +0 -0
  605. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval_gate.py +0 -0
  606. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_eval_platform.py +0 -0
  607. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_export.py +0 -0
  608. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_formats.py +0 -0
  609. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_fp8_recipe.py +0 -0
  610. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_freeze_training.py +0 -0
  611. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_generate.py +0 -0
  612. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_gpu.py +0 -0
  613. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_grpo.py +0 -0
  614. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_hf_integration.py +0 -0
  615. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_infer.py +0 -0
  616. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_inference_advanced.py +0 -0
  617. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_init.py +0 -0
  618. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ipo.py +0 -0
  619. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_jinja_analyzer.py +0 -0
  620. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_kto.py +0 -0
  621. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_loader.py +0 -0
  622. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_log_level.py +0 -0
  623. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_loss_watchdog.py +0 -0
  624. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_merge.py +0 -0
  625. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_migrate.py +0 -0
  626. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_mlx_backend.py +0 -0
  627. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_moe.py +0 -0
  628. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multi_adapter.py +0 -0
  629. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multi_gpu.py +0 -0
  630. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_config.py +0 -0
  631. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_invariants.py +0 -0
  632. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_multipack_sampler.py +0 -0
  633. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_neat_packing.py +0 -0
  634. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_neftune_rslora.py +0 -0
  635. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_onnx_tensorrt_export.py +0 -0
  636. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_orpo.py +0 -0
  637. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_packing.py +0 -0
  638. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_a_wave1.py +0 -0
  639. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_a_wave2.py +0 -0
  640. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_b.py +0 -0
  641. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_c.py +0 -0
  642. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_d.py +0 -0
  643. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_e.py +0 -0
  644. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_part_f_hardening.py +0 -0
  645. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_peft_methods.py +0 -0
  646. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_peft_patches.py +0 -0
  647. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_performance.py +0 -0
  648. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_pissa_init.py +0 -0
  649. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ppo.py +0 -0
  650. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_dispatcher.py +0 -0
  651. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_multi.py +0 -0
  652. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_preference_multi_runtime.py +0 -0
  653. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_pretrain.py +0 -0
  654. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_profile.py +0 -0
  655. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_profiling.py +0 -0
  656. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_progress.py +0 -0
  657. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_push.py +0 -0
  658. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_qat.py +0 -0
  659. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quality_filter.py +0 -0
  660. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quant_check.py +0 -0
  661. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quant_menu.py +0 -0
  662. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_quickstart.py +0 -0
  663. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_rank_pattern.py +0 -0
  664. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_recipes_v031.py +0 -0
  665. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_refusal_multilingual.py +0 -0
  666. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_registry.py +0 -0
  667. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_relora.py +0 -0
  668. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_replay.py +0 -0
  669. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_resume.py +0 -0
  670. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_rlvr.py +0 -0
  671. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_run_cost.py +0 -0
  672. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_runs.py +0 -0
  673. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_serve.py +0 -0
  674. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_server_generate.py +0 -0
  675. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_sglang_serve.py +0 -0
  676. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_simpo.py +0 -0
  677. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_smoke_train.py +0 -0
  678. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_speculative_decoding.py +0 -0
  679. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_sweep.py +0 -0
  680. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_synth_data_pro.py +0 -0
  681. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_templates_yaml.py +0 -0
  682. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tensorboard.py +0 -0
  683. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tool_calling.py +0 -0
  684. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trace_to_pref.py +0 -0
  685. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tracker.py +0 -0
  686. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trainer_coverage_v035.py +0 -0
  687. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trainer_init.py +0 -0
  688. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_training_intelligence.py +0 -0
  689. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_training_speed.py +0 -0
  690. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_trust_remote_code.py +0 -0
  691. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_tui.py +0 -0
  692. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui.py +0 -0
  693. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_chat.py +0 -0
  694. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_config_builder.py +0 -0
  695. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_live_monitor.py +0 -0
  696. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_ui_metrics.py +0 -0
  697. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_unsloth.py +0 -0
  698. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_c.py +0 -0
  699. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_d.py +0 -0
  700. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0401_part_e.py +0 -0
  701. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0402_part_a.py +0 -0
  702. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0402_part_b.py +0 -0
  703. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_a.py +0 -0
  704. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_b.py +0 -0
  705. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0403_part_c.py +0 -0
  706. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0404_part_a.py +0 -0
  707. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0404_part_b.py +0 -0
  708. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0405_part_a.py +0 -0
  709. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0406_part_a.py +0 -0
  710. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_a.py +0 -0
  711. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_b.py +0 -0
  712. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0410_part_c.py +0 -0
  713. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0420.py +0 -0
  714. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_a.py +0 -0
  715. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_b.py +0 -0
  716. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_c.py +0 -0
  717. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0430_part_d.py +0 -0
  718. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_a.py +0 -0
  719. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_b.py +0 -0
  720. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_c.py +0 -0
  721. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_part_d.py +0 -0
  722. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0440_review_followups.py +0 -0
  723. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0450.py +0 -0
  724. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0460_part_a.py +0 -0
  725. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0460_part_b.py +0 -0
  726. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0470_part_a.py +0 -0
  727. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0470_part_b.py +0 -0
  728. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0480_part_a.py +0 -0
  729. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0480_part_b.py +0 -0
  730. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0490.py +0 -0
  731. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_a.py +0 -0
  732. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_b.py +0 -0
  733. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_c.py +0 -0
  734. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_d.py +0 -0
  735. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0500_part_e.py +0 -0
  736. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0510.py +0 -0
  737. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0520.py +0 -0
  738. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0530.py +0 -0
  739. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v05310.py +0 -0
  740. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v05311.py +0 -0
  741. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_109.py +0 -0
  742. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_139.py +0 -0
  743. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_142.py +0 -0
  744. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0531_82.py +0 -0
  745. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0532.py +0 -0
  746. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0533.py +0 -0
  747. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0534.py +0 -0
  748. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0535.py +0 -0
  749. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0536.py +0 -0
  750. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0537.py +0 -0
  751. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0538.py +0 -0
  752. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0539.py +0 -0
  753. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0540.py +0 -0
  754. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0550.py +0 -0
  755. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0550_followups.py +0 -0
  756. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0560.py +0 -0
  757. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_a.py +0 -0
  758. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_b.py +0 -0
  759. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_c.py +0 -0
  760. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0570_part_d.py +0 -0
  761. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0580.py +0 -0
  762. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0590.py +0 -0
  763. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_a.py +0 -0
  764. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_b.py +0 -0
  765. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_c.py +0 -0
  766. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_d.py +0 -0
  767. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_e.py +0 -0
  768. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0600_part_f.py +0 -0
  769. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_a.py +0 -0
  770. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_b.py +0 -0
  771. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_c.py +0 -0
  772. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_d.py +0 -0
  773. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0610_part_e.py +0 -0
  774. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_followups.py +0 -0
  775. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_a.py +0 -0
  776. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_b.py +0 -0
  777. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_c.py +0 -0
  778. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_d.py +0 -0
  779. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0620_part_e.py +0 -0
  780. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_followups.py +0 -0
  781. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_a.py +0 -0
  782. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_b.py +0 -0
  783. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_c.py +0 -0
  784. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_d.py +0 -0
  785. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0630_part_e.py +0 -0
  786. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0631_206.py +0 -0
  787. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_followups.py +0 -0
  788. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_a.py +0 -0
  789. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_b.py +0 -0
  790. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_c.py +0 -0
  791. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_d.py +0 -0
  792. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_e.py +0 -0
  793. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0640_part_f.py +0 -0
  794. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_followups.py +0 -0
  795. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_a.py +0 -0
  796. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_b.py +0 -0
  797. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_c.py +0 -0
  798. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_d.py +0 -0
  799. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0650_part_e.py +0 -0
  800. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_cli.py +0 -0
  801. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_followups.py +0 -0
  802. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_a.py +0 -0
  803. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_b.py +0 -0
  804. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_c.py +0 -0
  805. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_d.py +0 -0
  806. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0660_part_e.py +0 -0
  807. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_followups.py +0 -0
  808. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_a.py +0 -0
  809. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_b.py +0 -0
  810. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_c.py +0 -0
  811. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_d.py +0 -0
  812. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_e.py +0 -0
  813. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0670_part_f.py +0 -0
  814. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_followups.py +0 -0
  815. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_a.py +0 -0
  816. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_b.py +0 -0
  817. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_c.py +0 -0
  818. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_d.py +0 -0
  819. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0680_part_e.py +0 -0
  820. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_a.py +0 -0
  821. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_b.py +0 -0
  822. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_c.py +0 -0
  823. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_d.py +0 -0
  824. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0690_part_e.py +0 -0
  825. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_a.py +0 -0
  826. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_b.py +0 -0
  827. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_c.py +0 -0
  828. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_d.py +0 -0
  829. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_e.py +0 -0
  830. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0700_part_f.py +0 -0
  831. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07110.py +0 -0
  832. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07111.py +0 -0
  833. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07112.py +0 -0
  834. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07113.py +0 -0
  835. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07114.py +0 -0
  836. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07115.py +0 -0
  837. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07116.py +0 -0
  838. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07117.py +0 -0
  839. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07118.py +0 -0
  840. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07119.py +0 -0
  841. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0712.py +0 -0
  842. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07120.py +0 -0
  843. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07121.py +0 -0
  844. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07122.py +0 -0
  845. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07123.py +0 -0
  846. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07125.py +0 -0
  847. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07126.py +0 -0
  848. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07127.py +0 -0
  849. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07128.py +0 -0
  850. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v07129.py +0 -0
  851. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0713.py +0 -0
  852. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0714.py +0 -0
  853. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0715.py +0 -0
  854. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0716.py +0 -0
  855. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0717.py +0 -0
  856. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0718.py +0 -0
  857. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_v0719.py +0 -0
  858. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_validator.py +0 -0
  859. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_vision.py +0 -0
  860. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_vllm_serve.py +0 -0
  861. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_warmup.py +0 -0
  862. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_why.py +0 -0
  863. {soup_cli-0.71.29 → soup_cli-0.71.30}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,44 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.30] - 2026-07-05
16
+
17
+ ### Added
18
+ - **PRM-guided GRPO** — use a trained Process Reward Model as the *per-step*
19
+ reward inside GRPO (the o1-era process-supervision signal). Set
20
+ `training.prm_reward: <PRM dir|id>` (a model produced by `soup train`
21
+ `task=prm`) and `training.prm_aggregate: min|prod|last`; the PRM splits each
22
+ generated completion into reasoning steps, scores every step with its reward
23
+ head, and folds the per-step scores into one scalar reward that GRPO
24
+ optimises. The PRM reward *replaces* `reward_fn` and rides the existing
25
+ reward-shaping + reward-hack-mitigation seam, so the v0.71.26 controller
26
+ observes it. Cross-validators gate `task='grpo'` + `backend='transformers'` +
27
+ `modality='text'`. Default aggregation is `min` (weakest-link); `prod`
28
+ assumes calibrated `[0,1]` step scores.
29
+ - **Bundled rollout environments** — three pure-Python toy environments
30
+ (`soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`) exposing a
31
+ `rollout(prompts)` entry point so the live `openenv` GRPO rollout path runs
32
+ out-of-the-box: `training.rollout_backend=openenv` +
33
+ `training.rollout_func=soup_cli.envs.calculator:rollout`. Three ready-made
34
+ recipes added (`grpo-env-calculator` / `grpo-env-retrieval-qa` /
35
+ `grpo-env-guess-number`); catalog 134 → 137.
36
+
37
+ ### Fixed
38
+ - **`soup train task=prm` producer conformance** (surfaced by the v0.71.30 live
39
+ smoke): the PRM trainer now casts its reward head to the base-model dtype
40
+ (bf16 CUDA runs previously crashed on the first `compute_loss`), saves the
41
+ tokenizer alongside the model (so a PRM checkpoint is loadable standalone),
42
+ and returns the standard trainer-result shape (previously the CLI crashed with
43
+ a `KeyError: 'initial_loss'` right after saving).
44
+
45
+ ### Notes
46
+ - Proof-of-mechanism only: validated on a tiny model (SmolLM2-135M) with a tiny
47
+ synthetic PRM and synthetic reward — not a production reward-model claim
48
+ (scale ask tracked in #286). The bundled environments are deterministic
49
+ single-shot *seeders*, not interactive multi-turn model-in-the-loop episodes
50
+ (the live `openenv` contract passes only prompts). Step split is a newline
51
+ heuristic; PRM completions are scored one forward pass each.
52
+
15
53
  ## [0.71.29] - 2026-07-05
16
54
 
17
55
  ### Added
@@ -110,17 +110,17 @@ src/soup_cli/
110
110
  experiment/ - SQLite experiment tracking
111
111
  eval/ - Eval platform (custom tasks, LLM judge, human eval, leaderboard)
112
112
  migrate/ - Config migration (LLaMA-Factory, Axolotl, Unsloth)
113
- recipes/ - Ready-made configs for popular models (134 recipes)
113
+ recipes/ - Ready-made configs for popular models (137 recipes)
114
114
  autopilot/ - Zero-config decision engine (v0.25.0)
115
115
  registry/ - Model Registry (hashing, store, diff, attach) (v0.26.0 + v0.33.0)
116
116
  cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
117
117
  data/traces/ - Trace-to-Preference harvester (v0.26.0)
118
118
  data/collators.py - CrossDocCollator for sample packing (v0.33.0)
119
- utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint
119
+ utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint, shrink
120
120
  templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (306 files, 15224 tests)
123
+ tests/ - Test suite (307 files, 15334 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.29
3
+ Version: 0.71.30
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,22 +193,27 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.29Make your model smaller, locally: `soup shrink`.** Depth-prune the least-important layers, then distill-heal with a binary SHIP / DON'T-SHIP verdict. Based on "The Unreasonable Ineffectiveness of the Deeper Layers" (arXiv:2403.17887).
196
+ **v0.71.30Process-supervised RL: PRM-guided GRPO.** Use a trained Process Reward Model to score each *reasoning step* of a GRPO completion the o1-era training signal plus bundled toy environments so the openenv rollout path runs out-of-the-box.
197
+
198
+ - **PRM as the GRPO reward.** Point `training.prm_reward` at a PRM you trained with
199
+ `soup train task=prm`; it splits each completion into steps, scores every step with the PRM's
200
+ reward head, and folds them (`min` / `prod` / `last`) into one reward that GRPO optimises —
201
+ replacing `reward_fn`. It rides the reward-shaping + reward-hack-mitigation seam, so the
202
+ v0.71.26 controller still watches it.
203
+ - **Bundled rollout environments.** `soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`
204
+ each expose a `rollout(prompts)` entry point; wire one with `rollout_backend=openenv` +
205
+ `rollout_func=soup_cli.envs.calculator:rollout` (three ready-made `grpo-env-*` recipes ship it).
206
+ - **Producer fixes too.** `soup train task=prm` now saves its tokenizer and no longer crashes on
207
+ its own summary — a PRM checkpoint is loadable standalone.
208
+ - **Proof-of-mechanism, honestly.** Live-validated on SmolLM2-135M (CPU): the PRM reward scores
209
+ good completions above bad and drives GRPO's advantages (`rewards/prm_reward` logged). Tiny
210
+ model + synthetic PRM — not a production reward-model claim (scale help wanted: #286).
197
211
 
198
- - **Importance-ranked depth pruning.** One forward pass per calibration prompt scores each
199
- contiguous layer block by the angular distance of the residual stream across it; the
200
- least-important block is dropped (the first and last layer are always protected).
201
- - **Distill-heal, Minitron-style.** `--heal` distills the original model into the pruned
202
- student (LoRA logit-KD) as an isolated `soup train` run, then fuses the adapter back so you
203
- ship a single dense smaller model — not a base + adapter.
204
- - **A verdict, not a dashboard.** Every run ends in **SHIP** or **DON'T SHIP** on a
205
- before/after perplexity ratio (`exit 0 = SHIP`, `2 = DON'T`, `1 = error`), so it drops into CI.
206
- - **Runs on a laptop GPU.** Live-validated on Windows + RTX 3050 with SmolLM2-135M: drop 25 %
207
- (30 → 22 layers, 21 % params) and drop-4 + CPU heal (perplexity recovered to ×1.35).
208
-
209
- ```bash
210
- soup shrink --model HuggingFaceTB/SmolLM2-135M-Instruct --drop-ratio 0.25 \
211
- --calib calib.jsonl --heal heal.jsonl --heal-steps 200 -o shrunk --device cpu
212
+ ```yaml
213
+ task: grpo
214
+ training:
215
+ prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir
216
+ prm_aggregate: min # weakest-link (default) | prod | last
212
217
  ```
213
218
 
214
219
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@@ -49,22 +49,27 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.29Make your model smaller, locally: `soup shrink`.** Depth-prune the least-important layers, then distill-heal with a binary SHIP / DON'T-SHIP verdict. Based on "The Unreasonable Ineffectiveness of the Deeper Layers" (arXiv:2403.17887).
53
-
54
- - **Importance-ranked depth pruning.** One forward pass per calibration prompt scores each
55
- contiguous layer block by the angular distance of the residual stream across it; the
56
- least-important block is dropped (the first and last layer are always protected).
57
- - **Distill-heal, Minitron-style.** `--heal` distills the original model into the pruned
58
- student (LoRA logit-KD) as an isolated `soup train` run, then fuses the adapter back so you
59
- ship a single dense smaller model not a base + adapter.
60
- - **A verdict, not a dashboard.** Every run ends in **SHIP** or **DON'T SHIP** on a
61
- before/after perplexity ratio (`exit 0 = SHIP`, `2 = DON'T`, `1 = error`), so it drops into CI.
62
- - **Runs on a laptop GPU.** Live-validated on Windows + RTX 3050 with SmolLM2-135M: drop 25 %
63
- (30 22 layers, 21 % params) and drop-4 + CPU heal (perplexity recovered to ×1.35).
52
+ **v0.71.30Process-supervised RL: PRM-guided GRPO.** Use a trained Process Reward Model to score each *reasoning step* of a GRPO completion the o1-era training signal plus bundled toy environments so the openenv rollout path runs out-of-the-box.
53
+
54
+ - **PRM as the GRPO reward.** Point `training.prm_reward` at a PRM you trained with
55
+ `soup train task=prm`; it splits each completion into steps, scores every step with the PRM's
56
+ reward head, and folds them (`min` / `prod` / `last`) into one reward that GRPO optimises —
57
+ replacing `reward_fn`. It rides the reward-shaping + reward-hack-mitigation seam, so the
58
+ v0.71.26 controller still watches it.
59
+ - **Bundled rollout environments.** `soup_cli.envs.calculator` / `retrieval_qa` / `guess_number`
60
+ each expose a `rollout(prompts)` entry point; wire one with `rollout_backend=openenv` +
61
+ `rollout_func=soup_cli.envs.calculator:rollout` (three ready-made `grpo-env-*` recipes ship it).
62
+ - **Producer fixes too.** `soup train task=prm` now saves its tokenizer and no longer crashes on
63
+ its own summary a PRM checkpoint is loadable standalone.
64
+ - **Proof-of-mechanism, honestly.** Live-validated on SmolLM2-135M (CPU): the PRM reward scores
65
+ good completions above bad and drives GRPO's advantages (`rewards/prm_reward` logged). Tiny
66
+ model + synthetic PRM — not a production reward-model claim (scale help wanted: #286).
64
67
 
65
- ```bash
66
- soup shrink --model HuggingFaceTB/SmolLM2-135M-Instruct --drop-ratio 0.25 \
67
- --calib calib.jsonl --heal heal.jsonl --heal-steps 200 -o shrunk --device cpu
68
+ ```yaml
69
+ task: grpo
70
+ training:
71
+ prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir
72
+ prm_aggregate: min # weakest-link (default) | prod | last
68
73
  ```
69
74
 
70
75
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@@ -8,7 +8,7 @@ feature reference — every `soup` capability, grouped by area.
8
8
  | Guide | Covers |
9
9
  |---|---|
10
10
  | [Training tasks & methods](training.md) | SFT, DPO/GRPO/PPO/KTO/ORPO/SimPO/IPO/BCO, tool-calling, PRM, pre-training, distillation, classification, vision/audio/TTS, unlearning, RAFT/RA-DIT, loop-hardening detectors |
11
- | [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning |
11
+ | [PEFT, long context & efficiency](peft-and-efficiency.md) | DoRA, LoRA+, rsLoRA, VeRA, OLoRA, NEFTune, PiSSA, ReLoRA, optimizer & PEFT zoo, LLaMA Pro, GaLore, YaRN/LongLoRA, packing, curriculum, auto-tuning, depth pruning + distill-heal (`soup shrink`) |
12
12
  | [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
13
13
  | [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
14
14
  | [Evaluation & probes](evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, `soup ship` verdict, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
@@ -133,7 +133,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
133
133
  soup migrate --from axolotl config.yml Import config from Axolotl
134
134
  soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
135
135
  soup migrate --from llamafactory c.yaml --dry-run Preview without writing
136
- soup recipes list List all 134 ready-made recipes
136
+ soup recipes list List all 137 ready-made recipes
137
137
  soup recipes show llama3.1-8b-sft Print recipe YAML
138
138
  soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
139
139
  soup recipes search "reasoning" Search by keyword/task/size
@@ -0,0 +1,133 @@
1
+ # PRM-guided GRPO + bundled rollout envs — Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: superpowers:test-driven-development, task-by-task. Steps use checkbox (`- [ ]`) syntax.
4
+
5
+ **Goal:** Let a trained Soup PRM score each reasoning step of a GRPO completion as the reward signal, and bundle 3 pure-python toy environments that seed the live `openenv` rollout path out-of-the-box.
6
+
7
+ **Architecture:** A pure-kernel + torch-lazy `PRMScorer` in `utils/prm_reward.py` becomes the GRPO `reward_fn` when `training.prm_reward` is set (replacing the configured reward, riding the existing shaping+buffer seam). Three `soup_cli/envs/*.py` modules expose `rollout(prompts)` entry points wired via `training.rollout_func`. Schema fields + cross-validators gate both.
8
+
9
+ **Tech Stack:** Python 3.10+, Pydantic v2, torch/transformers/safetensors (lazy), TRL GRPO, pytest.
10
+
11
+ ## Global Constraints
12
+
13
+ - Line length 100 (ruff E,F,I,N,W). No bare `print()` — use `rich.console.Console`.
14
+ - Lazy imports for torch/transformers/peft/safetensors inside functions, never module-level.
15
+ - Path containment: `os.path.realpath` + `os.path.commonpath`, NOT `Path.resolve()+relative_to()`.
16
+ - Pydantic v2 models in `config/schema.py`; assert specific error keywords in tests.
17
+ - Test file: `tests/test_v07130.py`. Use `assert result.exit_code == 0, (result.output, repr(result.exception))`.
18
+ - Version target: `0.71.29 → 0.71.30` (bump in `pyproject.toml` + `src/soup_cli/__init__.py`).
19
+ - Proof-of-mechanism honesty: tiny model / synthetic data only; scale ask extends #286.
20
+
21
+ ---
22
+
23
+ ### Task 1: PRM reward pure kernels
24
+
25
+ **Files:**
26
+ - Create: `src/soup_cli/utils/prm_reward.py`
27
+ - Test: `tests/test_v07130.py`
28
+
29
+ **Interfaces:**
30
+ - Produces: `split_steps(text: str) -> list[str]`, `aggregate_step_scores(scores: list[float], mode: str) -> float`, module constants `_MAX_STEPS`, `_MAX_STEP_CHARS`, `AGGREGATE_MODES: tuple[str,...]`.
31
+
32
+ - [ ] Step 1: Write failing tests `TestSplitSteps` (newline split; drop empty/whitespace; count cap `_MAX_STEPS`; per-step char cap; non-str→`[]`) and `TestAggregate` (min/prod/last correctness; empty→0.0; single; non-finite→treated safe; bad mode `ValueError` names modes; bool reject).
33
+ - [ ] Step 2: Run — expect ImportError / fail.
34
+ - [ ] Step 3: Implement kernels (no top-level torch). `split_steps`: `str.splitlines()`, strip, drop empties, truncate each to `_MAX_STEP_CHARS`, cap list to `_MAX_STEPS`. `aggregate_step_scores`: validate mode in `AGGREGATE_MODES`; empty→0.0; `min`→min, `last`→scores[-1], `prod`→math.prod; coerce non-finite to 0.0.
35
+ - [ ] Step 4: Run tests → PASS.
36
+ - [ ] Step 5: `ruff check` + commit `feat(prm): PRM reward pure kernels (split_steps/aggregate) (v0.71.30)`.
37
+
38
+ ---
39
+
40
+ ### Task 2: Schema fields + cross-validators
41
+
42
+ **Files:**
43
+ - Modify: `src/soup_cli/config/schema.py` (TrainingConfig fields near `reward_fn` ~L1043; field_validator; SoupConfig cross-validator near `_validate_rollout_backend` ~L4183)
44
+ - Test: `tests/test_v07130.py`
45
+
46
+ **Interfaces:**
47
+ - Produces: `TrainingConfig.prm_reward: Optional[str]`, `TrainingConfig.prm_aggregate: Literal["min","prod","last"]`; a `SoupConfig` `model_validator(mode="after")` `_validate_prm_reward`.
48
+
49
+ - [ ] Step 1: Write failing `TestPrmSchema` — happy config (task=grpo, transformers, text, prm_reward set, prm_aggregate=prod) parses via `load_config_from_string`; rejects: task≠grpo ("requires task='grpo'"), backend=mlx/unsloth ("transformers"), modality≠text ("modality='text'"), `prm_aggregate` non-default while `prm_reward None` (footgun keyword), null-byte prm_reward, oversize prm_reward.
50
+ - [ ] Step 2: Run → fail (fields absent).
51
+ - [ ] Step 3: Add fields + `field_validator("prm_reward", mode="before")` (null-byte/non-str/len≤512 reject) + SoupConfig `_validate_prm_reward` cross-validator (gates task/backend/modality; footgun on aggregate). Mirror `_validate_rollout_backend`.
52
+ - [ ] Step 4: Run → PASS.
53
+ - [ ] Step 5: ruff + commit `feat(prm): schema prm_reward/prm_aggregate + cross-validators (v0.71.30)`.
54
+
55
+ ---
56
+
57
+ ### Task 3: PRMScorer + build_prm_reward_fn (torch-lazy load + scoring)
58
+
59
+ **Files:**
60
+ - Modify: `src/soup_cli/utils/prm_reward.py`
61
+ - Test: `tests/test_v07130.py`
62
+
63
+ **Interfaces:**
64
+ - Consumes: `split_steps`, `aggregate_step_scores` (Task 1); `TrainingConfig` (Task 2).
65
+ - Produces: `PRMScorer(prm_path, aggregate, device="cpu", trust_remote_code=False)` with `__call__(completions, **kwargs) -> list[float]` and `__name__="prm_reward"`; `build_prm_reward_fn(tcfg, device, trust_remote_code) -> PRMScorer`; `load_reward_head_weights(prm_path) -> dict` helper.
66
+
67
+ - [ ] Step 1: Write failing `TestPRMScorer` — fixture: build a tiny `AutoModelForCausalLM` from a 2-layer config, attach `reward_head=nn.Linear(hidden,1)`, `save_pretrained(tmp)`; `PRMScorer(tmp,"min","cpu")` scores `[[{"role":"assistant","content":"step1\nstep2"}]]` → list len 1 of finite float. "not a PRM" fixture (base with no reward_head) → friendly `ValueError`/`RuntimeError` naming "reward_head". `build_prm_reward_fn` returns callable with `__name__=="prm_reward"`; outside-cwd path → containment reject.
68
+ - [ ] Step 2: Run → fail.
69
+ - [ ] Step 3: Implement. `load_reward_head_weights`: iterate `*.safetensors` in dir via `safetensors.safe_open`, collect `reward_head.*` tensors; empty→raise. `PRMScorer._ensure_loaded`: lazy tokenizer + `AutoModelForCausalLM.from_pretrained`, `reward_head=nn.Linear(hidden,1)`, `load_state_dict` the head, `eval()`+`requires_grad_(False)`+`.to(device)`. `__call__`: per completion → render prompt (from `kwargs["prompts"]`) + steps, tokenize, `no_grad` `output_hidden_states` forward, gather boundary hidden, `reward_head`→scalars, `aggregate_step_scores`. `build_prm_reward_fn`: realpath+commonpath containment for local paths, trust_remote_code probe+warn.
70
+ - [ ] Step 4: Run → PASS.
71
+ - [ ] Step 5: ruff + commit `feat(prm): PRMScorer + build_prm_reward_fn (safetensors head load) (v0.71.30)`.
72
+
73
+ ---
74
+
75
+ ### Task 4: GRPO integration
76
+
77
+ **Files:**
78
+ - Modify: `src/soup_cli/trainer/grpo.py` (`setup()`, the `load_reward_fn` block ~L224-229)
79
+ - Test: `tests/test_v07130.py`
80
+
81
+ **Interfaces:**
82
+ - Consumes: `build_prm_reward_fn` (Task 3).
83
+
84
+ - [ ] Step 1: Write failing `TestGrpoPrmWiring` — construct a SoupConfig with `prm_reward` set, monkeypatch `build_prm_reward_fn` to a sentinel, call the reward-selection path (extract a small helper `_select_reward_fn(tcfg, device, trust)` if cleaner, or assert via the setup path with mocked model load), assert the PRM scorer is chosen (not `load_reward_fn`).
85
+ - [ ] Step 2: Run → fail.
86
+ - [ ] Step 3: In `setup()`: `if tcfg.prm_reward is not None: reward_fn = build_prm_reward_fn(tcfg, self.device, self._trust_remote_code) else: reward_fn = load_reward_fn(...)`. Keep the shaping+buffer wrapping downstream unchanged.
87
+ - [ ] Step 4: Run → PASS.
88
+ - [ ] Step 5: ruff + commit `feat(prm): wire PRM reward into GRPO setup (v0.71.30)`.
89
+
90
+ ---
91
+
92
+ ### Task 5: Bundled rollout envs
93
+
94
+ **Files:**
95
+ - Create: `src/soup_cli/envs/__init__.py`, `calculator.py`, `retrieval_qa.py`, `guess_number.py`
96
+ - Test: `tests/test_v07130.py`
97
+
98
+ **Interfaces:**
99
+ - Produces: `soup_cli.envs.calculator:rollout`, `...retrieval_qa:rollout`, `...guess_number:rollout` — each `rollout(prompts) -> list[{"prompt": str, "answer": str}]`, deterministic (seeded `random.Random`), no I/O.
100
+
101
+ - [ ] Step 1: Write failing `TestEnvs` — each `rollout([])` returns non-empty rows; every row passes `agent_rollout._normalise_rollout_rows(rows, "openenv")`; determinism (two calls equal); calculator answers verified (parse "a OP b" from prompt, compute, assert == answer).
102
+ - [ ] Step 2: Run → fail.
103
+ - [ ] Step 3: Implement 3 modules. Each builds a fixed count of {prompt, answer} rows via `random.Random(seed)` (fixed seed → deterministic; no `Math.random`/wall-clock). calculator: arithmetic; retrieval_qa: doc+question, answer=span; guess_number: constraint deduction puzzles with a unique integer answer.
104
+ - [ ] Step 4: Run → PASS.
105
+ - [ ] Step 5: ruff + commit `feat(envs): bundled calculator/retrieval-qa/guess-number rollout envs (v0.71.30)`.
106
+
107
+ ---
108
+
109
+ ### Task 6: Recipes + no-top-level-torch AST test
110
+
111
+ **Files:**
112
+ - Modify: `src/soup_cli/recipes/catalog.py` (+3 GRPO env recipes)
113
+ - Test: `tests/test_v07130.py`
114
+
115
+ - [ ] Step 1: Write failing `TestRecipes` (3 new recipe names resolve + their YAML parses via `load_config_from_string`) + `TestNoTopLevelTorch` (AST-parse `utils/prm_reward.py`, assert no top-level `import torch/transformers/peft`).
116
+ - [ ] Step 2: Run → fail.
117
+ - [ ] Step 3: Add `grpo-env-calculator` / `grpo-env-retrieval-qa` / `grpo-env-guess-number` RecipeMeta entries (SmolLM2-135M, task=grpo, rollout_backend=openenv, rollout_func=`soup_cli.envs.*:rollout`, reward_fn=math/accuracy). Confirm the no-top-level-torch already holds.
118
+ - [ ] Step 4: Run → PASS.
119
+ - [ ] Step 5: ruff + commit `feat(recipes): 3 GRPO env recipes + AST purity test (v0.71.30)`.
120
+
121
+ ---
122
+
123
+ ### Task 7: Release docs (Release Checklist steps 7-13)
124
+
125
+ Version bump (`pyproject.toml` + `__init__.py` → 0.71.30); CHANGELOG; CLAUDE.md (arch line for `utils/prm_reward.py` + `envs/`, schema field list, CLI/train notes, recipe count 134→137, test-count refs, history-roll to `.claude/history/release-notes.md` + `tests-index.md`); README What's New; `docs/training.md` + `docs/commands.md`; CONTRIBUTING counts; plan.md flip. Handled after Tasks 1-6 pass the 5-review round + Step-6 smoke.
126
+
127
+ ---
128
+
129
+ ## Self-review
130
+
131
+ - **Spec coverage:** Part A schema (T2) + kernels (T1) + scorer (T3) + wiring (T4); Part B envs (T5) + recipes (T6); docs (T7). ✅
132
+ - **Type consistency:** `split_steps`/`aggregate_step_scores` (T1) consumed by `PRMScorer` (T3); `build_prm_reward_fn` (T3) consumed by grpo (T4); `rollout` signature uniform (T5). ✅
133
+ - **Placeholders:** none — each task has concrete test targets + implementation sketch (full code written during TDD RED/GREEN).
@@ -0,0 +1,152 @@
1
+ # v0.71.30 — PRM-guided GRPO + bundled rollout envs — Design
2
+
3
+ **Status:** approved 2026-07-05
4
+ **Slot:** v0.71.30 (first `[ ]` patch in `.claude/plan.md`)
5
+ **Type:** net-new mechanism (PRM-as-per-step-reward adapter + bundled envs package)
6
+
7
+ ## Pitch
8
+
9
+ Use a trained PRM (the v0.53.11 `PRMTrainerWrapper`, live) as a **per-step reward inside
10
+ GRPO** — the o1-era process-supervision training signal. Plus bundle 3 pure-python toy
11
+ "environments" so the live `openenv` rollout path (#125) runs out-of-the-box.
12
+
13
+ **Honesty constraint (this is an RL feature — cannot ship schema-only):** validation is
14
+ **proof-of-mechanism only** on a tiny model (SmolLM2-135M) + a tiny synthetic PRM. It is NOT
15
+ a 7B / real-PRM / production claim. Scale ask extends #286. State this loudly in the PR,
16
+ CHANGELOG, release notes, and CLAUDE.md known-limitations. Mirrors the v0.71.26 framing.
17
+
18
+ ## Decisions locked
19
+
20
+ - **PRM reward role = sole reward (replace).** When `training.prm_reward` is set, the PRM
21
+ scorer becomes THE reward function, replacing `reward_fn`. Simplest wiring — drops into the
22
+ existing single-fn shaping + buffer seam. Matches the "PRM reward curve" smoke.
23
+ - **PRM artifact = Soup-trained PRM only (v1).** Load base `AutoModelForCausalLM`, re-attach
24
+ `reward_head=nn.Linear(hidden,1)`, and load its weights from the saved `model.safetensors`
25
+ (`reward_head.*` keys). HF `AutoModelForSequenceClassification(num_labels=1)` interop is a
26
+ deferred follow-up.
27
+ - **Envs = deterministic single-shot seeders**, not interactive multi-turn episodes. The live
28
+ `openenv` contract calls `fn(seed_prompts)` — model/tokenizer are NOT passed — so an env is a
29
+ prompt+answer *generator* scored by the existing `accuracy`/`math` reward.
30
+ - **Aggregation default = `min`** (weakest-link; Lightman et al. "Let's Verify Step by Step").
31
+ - **Step split = newline heuristic (v1).**
32
+
33
+ ## Reuse map (verified in-repo 2026-07-05)
34
+
35
+ - Reward seam: `trainer/grpo.py::setup()` loads a single `reward_fn` via
36
+ `rewards.load_reward_fn(spec)`, then optionally wraps with
37
+ `reward_hack_control.apply_reward_shaping` + `rl_signal_buffer.wrap_reward_funcs(buffer)`
38
+ (the v0.71.26 mitigation seam). A PRM reward is just a `(completions, **kwargs) -> list[float]`
39
+ callable → rides that seam unchanged.
40
+ - PRM artifact: `trainer/prm.py::PRMTrainerWrapper` sets `base_model.reward_head =
41
+ nn.Linear(hidden,1,bias=True)` and `save_model`s the full model → the head weights live inside
42
+ `model.safetensors` under `reward_head.*` (base `from_pretrained` drops them as "unexpected").
43
+ - Scoring math mirror: `PRMTrainerWrapper.compute_loss` — forward `output_hidden_states=True`,
44
+ gather `last_hidden` at step-boundary positions, project via `reward_head`.
45
+ - Rollout: `utils/agent_rollout.py::launch_rollout` — `openenv` resolves `rollout_func`
46
+ (`module:fn`) and calls `fn(seed_prompts)`; rows go through `_normalise_rollout_rows`
47
+ (caps + anti-smuggle → `{prompt, answer?}`-only).
48
+ - Schema patterns: `rollout_func` field_validator + `_validate_rollout_backend` cross-validator;
49
+ `verifiable_domain` `reward_fn` cross-validator (`schema.py`).
50
+
51
+ ## Part A — PRM reward
52
+
53
+ ### Schema (`config/schema.py`, `TrainingConfig`)
54
+
55
+ - `prm_reward: Optional[str] = None` — path (or HF id) to a Soup-trained PRM.
56
+ `field_validator(mode="before")` rejects null-byte / non-str / oversize (shape only;
57
+ filesystem containment enforced at load, TOCTOU-safe).
58
+ - `prm_aggregate: Literal["min","prod","last"] = "min"`.
59
+ - `SoupConfig` cross-validator: `prm_reward` set ⇒ `task=='grpo'`, `backend=='transformers'`
60
+ (reward runs a transformers forward — mlx/unsloth rejected), `modality=='text'`;
61
+ `prm_aggregate != "min"` while `prm_reward is None` → footgun reject.
62
+
63
+ ### New module `utils/prm_reward.py` (NO top-level torch)
64
+
65
+ - `split_steps(text: str) -> list[str]` — newline heuristic v1; drop empty/whitespace; cap
66
+ count (`_MAX_STEPS`) and per-step chars. Pure.
67
+ - `aggregate_step_scores(scores: list[float], mode: str) -> float` — min/prod/last;
68
+ empty→0.0; non-finite-safe; bad-mode `ValueError`; bool guard. Pure kernel.
69
+ - `PRMScorer` — stateful callable:
70
+ - `__init__(prm_path, aggregate, device, trust_remote_code)` — stores config, no load yet.
71
+ - `_ensure_loaded()` — lazy: tokenizer + base `AutoModelForCausalLM` (dtype per device),
72
+ re-attach `reward_head`, load `reward_head.*` from any `*.safetensors` in the dir via
73
+ `safetensors.safe_open` (friendly error if absent), `eval()` + `requires_grad_(False)`,
74
+ move to device.
75
+ - `__call__(completions, **kwargs) -> list[float]` — per completion: render + prepend the
76
+ `prompts` kwarg as leading context (best-effort), `split_steps`, one `no_grad`
77
+ `output_hidden_states` forward, gather boundary hidden, `reward_head` → per-step scalars,
78
+ `aggregate_step_scores`. Per-completion loop (no batching — fine for tiny; perf follow-up).
79
+ - `build_prm_reward_fn(tcfg, device, trust_remote_code) -> PRMScorer` — validates local-path
80
+ containment (realpath + commonpath under cwd), `trust_remote_code` probe+warn, returns scorer.
81
+
82
+ ### Integration (`trainer/grpo.py::setup()`)
83
+
84
+ One insertion before `load_reward_fn`: if `tcfg.prm_reward is not None` →
85
+ `reward_fn = build_prm_reward_fn(tcfg, self.device, self._trust_remote_code)` instead of
86
+ `load_reward_fn(...)`. The existing `apply_reward_shaping` + `wrap_reward_funcs` wrapping applies
87
+ unchanged → the v0.71.26 mitigation controller + `mitigation_log.jsonl` observe the PRM reward.
88
+
89
+ ## Part B — bundled rollout envs
90
+
91
+ ### New package `soup_cli/envs/`
92
+
93
+ Each module exposes `rollout(prompts) -> list[{"prompt", "answer"}]`, deterministic (seeded RNG,
94
+ no I/O / no network), usable as `soup_cli.envs.<name>:rollout` in `training.rollout_func`:
95
+
96
+ - `calculator.py` — arithmetic problems, answer = the number (`math`/`accuracy` reward).
97
+ - `retrieval_qa.py` — short document + question, answer = a span (`accuracy` reward).
98
+ - `guess_number.py` — single-shot number-**deduction** puzzles (constraints → unique answer;
99
+ honestly framed as deducible, not interactive guessing).
100
+
101
+ Rows flow through the existing `_normalise_rollout_rows` → replace the GRPO prompt dataset.
102
+
103
+ ### Recipes (`recipes/catalog.py`, +3 → 137)
104
+
105
+ `grpo-env-calculator` / `grpo-env-retrieval-qa` / `grpo-env-guess-number` — SmolLM2-135M base,
106
+ `rollout_backend=openenv` + `rollout_func=soup_cli.envs.*:rollout` + reward. Parse-clean.
107
+
108
+ ## Data flow
109
+
110
+ - **PRM:** dataset prompts → GRPO generates N completions → `PRMScorer(completions, prompts)` →
111
+ per completion: split steps → PRM forward → gather boundary hidden → `reward_head` → per-step
112
+ scalars → `aggregate(min/prod/last)` → scalar reward list → GRPO advantages.
113
+ - **Envs:** `rollout_func` seeds `{prompt, answer}` rows → replace GRPO prompt dataset → GRPO
114
+ trains with `accuracy`/`math` reward.
115
+
116
+ ## Tests (`tests/test_v07130.py`)
117
+
118
+ - `split_steps` (newlines / empties / whitespace / count cap / char cap / non-str guard).
119
+ - `aggregate_step_scores` (min/prod/last correctness, empty→0, single, non-finite defensive,
120
+ bad-mode reject, bool guard).
121
+ - Schema parse + every cross-validator (task≠grpo, mlx/unsloth, modality≠text, footgun,
122
+ null-byte/oversize) — assert specific keywords.
123
+ - `PRMScorer` against a tiny **real saved PRM fixture** (2-layer CausalLM + reward_head →
124
+ `save_pretrained` → load → score → finite list of right length); "not a PRM" friendly error.
125
+ - grpo wiring: `prm_reward` set → PRM scorer built (inject/monkeypatch, CPU tiny).
126
+ - Each env's rows pass `_normalise_rollout_rows`; determinism; answers correct
127
+ (calculator arithmetic verified).
128
+ - 3 recipes parse via `load_config_from_string`; count bump.
129
+ - No-top-level-torch AST test on `utils/prm_reward.py`.
130
+
131
+ ## Security
132
+
133
+ - `prm_reward` local path: realpath + commonpath containment under cwd at load; `safe_open`
134
+ (safetensors — no pickle) for the reward_head weights; O_NOFOLLOW where reading. HF id (no
135
+ local path) allowed via `from_pretrained`. `trust_remote_code=False` probe+warn.
136
+ - Bounds: `_MAX_STEPS`, per-step char cap, aggregate mode allowlist.
137
+ - Envs: pure python, deterministic, no I/O / no network; rows re-validated by
138
+ `_normalise_rollout_rows` (caps + anti-smuggle).
139
+
140
+ ## Known limitations (release notes + CLAUDE.md)
141
+
142
+ 1. Proof-of-mechanism only — tiny PRM, synthetic data; scale ask extends #286.
143
+ 2. Envs are deterministic single-shot seeders, not interactive multi-turn model-in-the-loop
144
+ episodes — the live `openenv` contract passes only `prompts`.
145
+ 3. Step split = newline heuristic (v1); PRM scored per-completion, no batching (perf follow-up).
146
+ 4. PRM artifact v1 = Soup-trained format only (HF SeqClassification interop deferred).
147
+
148
+ ## Smoke (RTX 3050 / CPU)
149
+
150
+ Train a tiny PRM on synthetic step-labelled math → GRPO on SmolLM2-135M with `prm_reward`,
151
+ reward curve logged (mitigation log reused); one env end-to-end GRPO run (mirrors #125). Plus
152
+ every validator-reject config.
@@ -15,6 +15,7 @@
15
15
  - [EBFT / GDPO Loss Variants](#ebft--gdpo-loss-variants)
16
16
  - [GRPO Objective Variants](#grpo-objective-variants)
17
17
  - [Process Reward Model (PRM)](#process-reward-model-prm)
18
+ - [PRM-guided GRPO (process-supervised RL)](#prm-guided-grpo-process-supervised-rl)
18
19
  - [Weighted Multi-Objective Preference Loss](#weighted-multi-objective-preference-loss)
19
20
  - [MoE Model Support](#moe-model-support)
20
21
  - [Vision / Multimodal Fine-tuning](#vision--multimodal-fine-tuning)
@@ -343,7 +344,61 @@ training:
343
344
 
344
345
  The trainer loads `AutoModelForCausalLM`, attaches an `nn.Linear(hidden, 1)`
345
346
  reward head, and computes MSE between predicted scalars at step-boundary tokens
346
- and the per-step labels.
347
+ and the per-step labels. The reward head is saved inside the model checkpoint
348
+ (`reward_head.*` in `model.safetensors`) and the tokenizer is saved alongside it,
349
+ so the resulting directory is loadable standalone.
350
+
351
+
352
+ ## PRM-guided GRPO (process-supervised RL)
353
+
354
+ Use a trained PRM as the **per-step reward** inside GRPO — the o1-era
355
+ process-supervision signal. Set `training.prm_reward` to a PRM directory (a
356
+ `task=prm` checkpoint) or HF id; the PRM splits each generated completion into
357
+ reasoning steps (newline heuristic), scores every step with its reward head, and
358
+ folds the per-step scores into one scalar reward that GRPO optimises. It
359
+ **replaces** `reward_fn` and rides the existing reward-shaping +
360
+ reward-hack-mitigation seam, so the v0.71.26 controller still observes it (TRL
361
+ logs it as `rewards/prm_reward`).
362
+
363
+ ```yaml
364
+ task: grpo
365
+ backend: transformers # required (the PRM reward runs a transformers forward)
366
+ modality: text # required
367
+ data:
368
+ format: chatml
369
+ train: ./grpo_prompts.jsonl
370
+ training:
371
+ prm_reward: ./my-prm # a `soup train task=prm` checkpoint dir (or HF id)
372
+ prm_aggregate: min # weakest-link (default) | prod | last
373
+ num_generations: 4
374
+ grpo_beta: 0.04
375
+ ```
376
+
377
+ `prm_aggregate='min'` (weakest-link, the standard PRM aggregation) is the safe
378
+ default; `prod` assumes calibrated `[0,1]` step scores (Soup's PRM head is
379
+ trained with unconstrained MSE, so `prod` can blow up on uncalibrated labels).
380
+
381
+ **Bundled rollout environments.** Three deterministic pure-Python toy
382
+ environments seed the openenv rollout path out-of-the-box — pair any of them
383
+ with `rollout_backend=openenv`:
384
+
385
+ ```yaml
386
+ training:
387
+ rollout_backend: openenv
388
+ rollout_func: soup_cli.envs.calculator:rollout # or retrieval_qa / guess_number
389
+ reward_fn: verifiable
390
+ verifiable_domain: math
391
+ ```
392
+
393
+ Ready-made recipes: `grpo-env-calculator`, `grpo-env-retrieval-qa`,
394
+ `grpo-env-guess-number`. The environments are deterministic single-shot
395
+ prompt/answer *seeders* (the live openenv contract passes only the seed prompts,
396
+ not the model) — not interactive multi-turn episodes.
397
+
398
+ **Scope:** proof-of-mechanism only — validated on SmolLM2-135M with a tiny
399
+ synthetic PRM (the PRM reward scores good completions above bad and drives GRPO's
400
+ advantages). Not a production reward-model claim; scale validation is help-wanted
401
+ (#286).
347
402
 
348
403
 
349
404
  ## Weighted Multi-Objective Preference Loss
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.29"
7
+ version = "0.71.30"
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.29"
3
+ __version__ = "0.71.30"