soup-cli 0.71.28__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.28 → soup_cli-0.71.30}/CHANGELOG.md +67 -0
  2. {soup_cli-0.71.28 → soup_cli-0.71.30}/CONTRIBUTING.md +4 -4
  3. {soup_cli-0.71.28 → soup_cli-0.71.30}/PKG-INFO +22 -20
  4. {soup_cli-0.71.28 → soup_cli-0.71.30}/README.md +21 -19
  5. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/README.md +1 -1
  6. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/commands.md +4 -1
  7. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/peft-and-efficiency.md +51 -0
  8. soup_cli-0.71.30/docs/superpowers/plans/2026-07-05-prm-guided-grpo.md +133 -0
  9. soup_cli-0.71.30/docs/superpowers/plans/2026-07-05-soup-shrink-depth-prune.md +607 -0
  10. soup_cli-0.71.30/docs/superpowers/specs/2026-07-05-prm-guided-grpo-design.md +152 -0
  11. soup_cli-0.71.30/docs/superpowers/specs/2026-07-05-soup-shrink-depth-prune-design.md +218 -0
  12. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/training.md +56 -1
  13. {soup_cli-0.71.28 → soup_cli-0.71.30}/pyproject.toml +1 -1
  14. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/__init__.py +1 -1
  15. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cli.py +11 -0
  16. soup_cli-0.71.30/src/soup_cli/commands/shrink.py +656 -0
  17. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/config/schema.py +75 -0
  18. soup_cli-0.71.30/src/soup_cli/envs/__init__.py +18 -0
  19. soup_cli-0.71.30/src/soup_cli/envs/_common.py +29 -0
  20. soup_cli-0.71.30/src/soup_cli/envs/calculator.py +41 -0
  21. soup_cli-0.71.30/src/soup_cli/envs/guess_number.py +44 -0
  22. soup_cli-0.71.30/src/soup_cli/envs/retrieval_qa.py +54 -0
  23. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/recipes/catalog.py +99 -0
  24. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/registry/store.py +2 -0
  25. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/grpo.py +51 -31
  26. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/prm.py +58 -2
  27. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/live_eval.py +9 -2
  28. soup_cli-0.71.30/src/soup_cli/utils/prm_reward.py +373 -0
  29. soup_cli-0.71.30/src/soup_cli/utils/shrink.py +341 -0
  30. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_recipes.py +3 -2
  31. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07124.py +3 -3
  32. soup_cli-0.71.30/tests/test_v07129.py +1267 -0
  33. soup_cli-0.71.30/tests/test_v07130.py +797 -0
  34. {soup_cli-0.71.28 → soup_cli-0.71.30}/.dockerignore +0 -0
  35. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/FUNDING.yml +0 -0
  36. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  37. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  38. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  39. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/pull_request_template.md +0 -0
  40. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/workflows/ci.yml +0 -0
  41. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/workflows/docker.yml +0 -0
  42. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/workflows/publish.yml +0 -0
  43. {soup_cli-0.71.28 → soup_cli-0.71.30}/.github/workflows/recipe-validation.yml +0 -0
  44. {soup_cli-0.71.28 → soup_cli-0.71.30}/.gitignore +0 -0
  45. {soup_cli-0.71.28 → soup_cli-0.71.30}/.mailmap +0 -0
  46. {soup_cli-0.71.28 → soup_cli-0.71.30}/.pre-commit-config.yaml +0 -0
  47. {soup_cli-0.71.28 → soup_cli-0.71.30}/AGENTS.md +0 -0
  48. {soup_cli-0.71.28 → soup_cli-0.71.30}/CODEOWNERS +0 -0
  49. {soup_cli-0.71.28 → soup_cli-0.71.30}/CODE_OF_CONDUCT.md +0 -0
  50. {soup_cli-0.71.28 → soup_cli-0.71.30}/CONTRIBUTORS.md +0 -0
  51. {soup_cli-0.71.28 → soup_cli-0.71.30}/Dockerfile +0 -0
  52. {soup_cli-0.71.28 → soup_cli-0.71.30}/LICENSE +0 -0
  53. {soup_cli-0.71.28 → soup_cli-0.71.30}/NOTICE +0 -0
  54. {soup_cli-0.71.28 → soup_cli-0.71.30}/SECURITY.md +0 -0
  55. {soup_cli-0.71.28 → soup_cli-0.71.30}/docker-compose.yml +0 -0
  56. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/adapters-and-governance.md +0 -0
  57. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/backends-and-ops.md +0 -0
  58. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/data.md +0 -0
  59. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/evaluation.md +0 -0
  60. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/models.md +0 -0
  61. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/performance-and-quantization.md +0 -0
  62. {soup_cli-0.71.28 → soup_cli-0.71.30}/docs/serving-and-export.md +0 -0
  63. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/README.md +0 -0
  64. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/dpo_chat.yaml +0 -0
  65. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/dpo_example.yaml +0 -0
  66. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/grpo_reasoning.yaml +0 -0
  67. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/rlhf_step1_sft.yaml +0 -0
  68. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/rlhf_step2_reward.yaml +0 -0
  69. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  70. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/sft_basic.yaml +0 -0
  71. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/configs/vision_llama.yaml +0 -0
  72. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/data/alpaca_tiny.jsonl +0 -0
  73. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/data/chat_preferences.jsonl +0 -0
  74. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/data/dpo_sample.jsonl +0 -0
  75. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/data/reasoning_math.jsonl +0 -0
  76. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/reward_hacking/rewards.py +0 -0
  77. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/synthetic_workflow.md +0 -0
  78. {soup_cli-0.71.28 → soup_cli-0.71.30}/examples/synthetic_workflow.yaml +0 -0
  79. {soup_cli-0.71.28 → soup_cli-0.71.30}/soup.png +0 -0
  80. {soup_cli-0.71.28 → soup_cli-0.71.30}/soup_logo_svg.svg +0 -0
  81. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/__main__.py +0 -0
  82. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/autopilot/__init__.py +0 -0
  83. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/autopilot/analyzer.py +0 -0
  84. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/autopilot/decisions.py +0 -0
  85. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/autopilot/generate_config.py +0 -0
  86. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/__init__.py +0 -0
  87. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/pack.py +0 -0
  88. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/publish.py +0 -0
  89. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/run.py +0 -0
  90. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/schema.py +0 -0
  91. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/unpack.py +0 -0
  92. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cans/verify.py +0 -0
  93. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cloud/__init__.py +0 -0
  94. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/cloud/modal.py +0 -0
  95. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/__init__.py +0 -0
  96. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0550.py +0 -0
  97. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0610.py +0 -0
  98. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v0650.py +0 -0
  99. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/_eval_v07110.py +0 -0
  100. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/_webhook_cli.py +0 -0
  101. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/ab.py +0 -0
  102. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/active_sample.py +0 -0
  103. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/adapters.py +0 -0
  104. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/advise.py +0 -0
  105. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/agent.py +0 -0
  106. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/airgap.py +0 -0
  107. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/apple_adapter.py +0 -0
  108. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/attest.py +0 -0
  109. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/audit_log.py +0 -0
  110. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/autopilot.py +0 -0
  111. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/bench.py +0 -0
  112. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/bom.py +0 -0
  113. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/build.py +0 -0
  114. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/can.py +0 -0
  115. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/chat.py +0 -0
  116. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/compile_cmd.py +0 -0
  117. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/compile_tools.py +0 -0
  118. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/completions.py +0 -0
  119. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/cost.py +0 -0
  120. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/data.py +0 -0
  121. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/data_doctor.py +0 -0
  122. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/data_forge.py +0 -0
  123. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/data_mix.py +0 -0
  124. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/data_score.py +0 -0
  125. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  126. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/deploy.py +0 -0
  127. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/diagnose.py +0 -0
  128. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/diff.py +0 -0
  129. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/distill_prompt.py +0 -0
  130. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/doctor.py +0 -0
  131. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/drift_alarm.py +0 -0
  132. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/edit.py +0 -0
  133. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/env.py +0 -0
  134. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/eval.py +0 -0
  135. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/expect.py +0 -0
  136. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/export.py +0 -0
  137. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/fetch.py +0 -0
  138. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/generate.py +0 -0
  139. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/history.py +0 -0
  140. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/infer.py +0 -0
  141. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/ingest.py +0 -0
  142. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/init.py +0 -0
  143. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/iterative_dpo.py +0 -0
  144. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/license_advisor.py +0 -0
  145. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/llama.py +0 -0
  146. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/local_rl.py +0 -0
  147. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/lock.py +0 -0
  148. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/loop.py +0 -0
  149. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/mcp.py +0 -0
  150. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/merge.py +0 -0
  151. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  152. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/migrate.py +0 -0
  153. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/monitor.py +0 -0
  154. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/plan.py +0 -0
  155. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/plugins.py +0 -0
  156. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/probe.py +0 -0
  157. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/profile.py +0 -0
  158. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/prune_prompt.py +0 -0
  159. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/push.py +0 -0
  160. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/quantize.py +0 -0
  161. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/quickstart.py +0 -0
  162. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/ra_dit.py +0 -0
  163. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/recipes.py +0 -0
  164. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/registry.py +0 -0
  165. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/runs.py +0 -0
  166. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/serve.py +0 -0
  167. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/ship.py +0 -0
  168. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/spectrum.py +0 -0
  169. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/steer.py +0 -0
  170. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/sweep.py +0 -0
  171. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/tokenizer.py +0 -0
  172. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/train.py +0 -0
  173. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/tui.py +0 -0
  174. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/tunability.py +0 -0
  175. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/ui.py +0 -0
  176. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/commands/why.py +0 -0
  177. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/config/__init__.py +0 -0
  178. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/config/loader.py +0 -0
  179. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/__init__.py +0 -0
  180. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  181. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  182. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  183. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  184. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  185. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  186. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  187. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  188. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  189. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  190. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  191. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  192. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/augment.py +0 -0
  193. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/chat_templates.py +0 -0
  194. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/collators.py +0 -0
  195. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/formats.py +0 -0
  196. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/loader.py +0 -0
  197. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/loss_mask.py +0 -0
  198. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/providers/__init__.py +0 -0
  199. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/providers/_utils.py +0 -0
  200. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/providers/anthropic.py +0 -0
  201. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/providers/ollama.py +0 -0
  202. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/providers/vllm.py +0 -0
  203. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/sft_format.py +0 -0
  204. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/__init__.py +0 -0
  205. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/code.py +0 -0
  206. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/conversation.py +0 -0
  207. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/preference.py +0 -0
  208. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/qa.py +0 -0
  209. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/reasoning.py +0 -0
  210. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/tool_calling.py +0 -0
  211. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/templates/verifiable.py +0 -0
  212. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/traces/__init__.py +0 -0
  213. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/traces/pair_builder.py +0 -0
  214. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/traces/parsers.py +0 -0
  215. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/traces/quality.py +0 -0
  216. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/data/validator.py +0 -0
  217. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/__init__.py +0 -0
  218. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/arena.py +0 -0
  219. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  220. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/calibrate.py +0 -0
  221. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  222. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/custom.py +0 -0
  223. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/forgetting.py +0 -0
  224. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/gate.py +0 -0
  225. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/human.py +0 -0
  226. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/judge.py +0 -0
  227. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/leaderboard.py +0 -0
  228. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/eval/quant_check.py +0 -0
  229. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/experiment/__init__.py +0 -0
  230. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/experiment/tracker.py +0 -0
  231. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/mcp_server/__init__.py +0 -0
  232. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/mcp_server/registry.py +0 -0
  233. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/mcp_server/server.py +0 -0
  234. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/migrate/__init__.py +0 -0
  235. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/migrate/axolotl.py +0 -0
  236. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/migrate/common.py +0 -0
  237. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/migrate/llamafactory.py +0 -0
  238. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/migrate/unsloth.py +0 -0
  239. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/__init__.py +0 -0
  240. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/callback.py +0 -0
  241. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  242. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/display.py +0 -0
  243. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  244. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/hf_push.py +0 -0
  245. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  246. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/monitoring/trace_logger.py +0 -0
  247. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/plugins/__init__.py +0 -0
  248. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/py.typed +0 -0
  249. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/recipes/__init__.py +0 -0
  250. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/registry/__init__.py +0 -0
  251. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/registry/attach.py +0 -0
  252. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/registry/diff.py +0 -0
  253. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/registry/hashing.py +0 -0
  254. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/__init__.py +0 -0
  255. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/audio.yaml +0 -0
  256. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/bco.yaml +0 -0
  257. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/chat.yaml +0 -0
  258. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/code.yaml +0 -0
  259. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/embedding.yaml +0 -0
  260. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  261. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  262. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  263. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/ipo.yaml +0 -0
  264. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/kto.yaml +0 -0
  265. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/longcontext.yaml +0 -0
  266. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/manifest.json +0 -0
  267. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/medical.yaml +0 -0
  268. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/moe.yaml +0 -0
  269. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/orpo.yaml +0 -0
  270. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/pretrain.yaml +0 -0
  271. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/reasoning.yaml +0 -0
  272. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/rlhf.yaml +0 -0
  273. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/simpo.yaml +0 -0
  274. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/tool-calling.yaml +0 -0
  275. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/templates/vision.yaml +0 -0
  276. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/__init__.py +0 -0
  277. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/bco.py +0 -0
  278. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/bitnet.py +0 -0
  279. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/classifier.py +0 -0
  280. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/distill.py +0 -0
  281. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/dpo.py +0 -0
  282. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/embedding.py +0 -0
  283. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/ipo.py +0 -0
  284. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/kto.py +0 -0
  285. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  286. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  287. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_routing.py +0 -0
  288. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/mlx_sft.py +0 -0
  289. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/mole_routing.py +0 -0
  290. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/orpo.py +0 -0
  291. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/ppo.py +0 -0
  292. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/preference.py +0 -0
  293. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/pretrain.py +0 -0
  294. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/raft.py +0 -0
  295. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/reward_model.py +0 -0
  296. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/rewards.py +0 -0
  297. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/sft.py +0 -0
  298. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/simpo.py +0 -0
  299. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/tts.py +0 -0
  300. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/trainer/unlearn.py +0 -0
  301. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/tui_app.py +0 -0
  302. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/__init__.py +0 -0
  303. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/app.py +0 -0
  304. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/plugins/__init__.py +0 -0
  305. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/static/app.js +0 -0
  306. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/static/index.html +0 -0
  307. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.png +0 -0
  308. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/static/logo.svg +0 -0
  309. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/ui/static/style.css +0 -0
  310. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/__init__.py +0 -0
  311. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/_eval_text.py +0 -0
  312. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ab_test.py +0 -0
  313. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/activation_offload.py +0 -0
  314. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/active_sampler.py +0 -0
  315. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_bisect.py +0 -0
  316. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_branch.py +0 -0
  317. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_diff.py +0 -0
  318. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_merge.py +0 -0
  319. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_pr.py +0 -0
  320. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_scan.py +0 -0
  321. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/adapter_sign.py +0 -0
  322. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/advanced_precision.py +0 -0
  323. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/advise.py +0 -0
  324. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/advise_history.py +0 -0
  325. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/agent_forge.py +0 -0
  326. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/agent_rollout.py +0 -0
  327. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/agent_sandbox.py +0 -0
  328. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/airgap_bundle.py +0 -0
  329. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/annex_xi.py +0 -0
  330. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/anthropic_messages.py +0 -0
  331. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/apple_adapter.py +0 -0
  332. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/attest.py +0 -0
  333. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/audit_log.py +0 -0
  334. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/auto_quant.py +0 -0
  335. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/backend_detect.py +0 -0
  336. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/batch_probe.py +0 -0
  337. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/behavior_battery.py +0 -0
  338. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/bitnet.py +0 -0
  339. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/blame.py +0 -0
  340. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/block_expansion.py +0 -0
  341. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/bom.py +0 -0
  342. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot.py +0 -0
  343. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  344. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/build_dag.py +0 -0
  345. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/canary_discovery.py +0 -0
  346. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/canary_router.py +0 -0
  347. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/capability_suite.py +0 -0
  348. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/checklist_dsl.py +0 -0
  349. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  350. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/citation_faithful.py +0 -0
  351. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/classifier.py +0 -0
  352. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/cmaes_merge.py +0 -0
  353. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/compile_tools.py +0 -0
  354. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/completions.py +0 -0
  355. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/constants.py +0 -0
  356. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/convergence.py +0 -0
  357. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/crash.py +0 -0
  358. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  359. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum.py +0 -0
  360. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  361. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/cut_ce.py +0 -0
  362. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_doctor.py +0 -0
  363. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_forge.py +0 -0
  364. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_lint.py +0 -0
  365. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_mix.py +0 -0
  366. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_pipeline.py +0 -0
  367. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/data_score.py +0 -0
  368. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/deepspeed.py +0 -0
  369. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  370. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/demo_bundles.py +0 -0
  371. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  372. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/deploy_measure.py +0 -0
  373. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  374. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/_common.py +0 -0
  375. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/badge.py +0 -0
  376. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/citation.py +0 -0
  377. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  378. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  379. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/format.py +0 -0
  380. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/live.py +0 -0
  381. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  382. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  383. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  384. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/report.py +0 -0
  385. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/diagnose/runner.py +0 -0
  386. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/distill.py +0 -0
  387. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/dpo_variants.py +0 -0
  388. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/drift_alarm.py +0 -0
  389. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  390. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/echo_trap.py +0 -0
  391. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/edit_diff.py +0 -0
  392. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/edit_governor.py +0 -0
  393. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/edit_kernels.py +0 -0
  394. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/encoding.py +0 -0
  395. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/energy.py +0 -0
  396. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/env_lock.py +0 -0
  397. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/errors.py +0 -0
  398. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/eval_design.py +0 -0
  399. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  400. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  401. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/expectations.py +0 -0
  402. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/fetch_examples.py +0 -0
  403. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/flash_attn.py +0 -0
  404. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/fp8.py +0 -0
  405. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/freeze.py +0 -0
  406. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp.py +0 -0
  407. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  408. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/galore.py +0 -0
  409. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/gguf_quant.py +0 -0
  410. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/gpu.py +0 -0
  411. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/gpu_monitor.py +0 -0
  412. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/grace_codebook.py +0 -0
  413. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/graceful_save.py +0 -0
  414. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/grad_accum.py +0 -0
  415. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  416. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_long_context.py +0 -0
  417. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/grpo_variants.py +0 -0
  418. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/hardware_fit.py +0 -0
  419. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/harm_probe.py +0 -0
  420. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/hf.py +0 -0
  421. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/hf_space.py +0 -0
  422. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/hubs.py +0 -0
  423. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ingest_sources.py +0 -0
  424. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/integrations.py +0 -0
  425. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/interference.py +0 -0
  426. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/interference_live.py +0 -0
  427. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/irt.py +0 -0
  428. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/iterative_dpo.py +0 -0
  429. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  430. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/kernel_picker.py +0 -0
  431. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/knowledge_edit.py +0 -0
  432. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/kv_cache.py +0 -0
  433. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/launcher.py +0 -0
  434. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/license_advisor.py +0 -0
  435. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/license_matrix.py +0 -0
  436. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/liger.py +0 -0
  437. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/llama_proxy.py +0 -0
  438. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/llama_server_timings.py +0 -0
  439. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl.py +0 -0
  440. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  441. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loftq_init.py +0 -0
  442. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/log_level.py +0 -0
  443. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/long_context.py +0 -0
  444. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/longlora.py +0 -0
  445. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loop_budget.py +0 -0
  446. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loop_daemon.py +0 -0
  447. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loop_iteration.py +0 -0
  448. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loop_stages.py +0 -0
  449. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/loop_state.py +0 -0
  450. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/lr_finder.py +0 -0
  451. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/lr_groups.py +0 -0
  452. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/magpie.py +0 -0
  453. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/metrics.py +0 -0
  454. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mii.py +0 -0
  455. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/minillm.py +0 -0
  456. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mix_proxy.py +0 -0
  457. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mixed_precision.py +0 -0
  458. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mlx.py +0 -0
  459. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mod.py +0 -0
  460. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/moe.py +0 -0
  461. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/moe_quant.py +0 -0
  462. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/mole_routing.py +0 -0
  463. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/multipack.py +0 -0
  464. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_sampler.py +0 -0
  465. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/multipack_trainer.py +0 -0
  466. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/namespace_pin.py +0 -0
  467. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/neat_packing.py +0 -0
  468. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ngram_spec.py +0 -0
  469. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/nlg_metrics.py +0 -0
  470. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ollama.py +0 -0
  471. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/onboarding.py +0 -0
  472. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  473. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/paths.py +0 -0
  474. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/peft_builder.py +0 -0
  475. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/peft_patches.py +0 -0
  476. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/peft_wiring.py +0 -0
  477. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/persona_hub.py +0 -0
  478. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/pipeline.py +0 -0
  479. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/preference_combine.py +0 -0
  480. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/prm.py +0 -0
  481. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/probe_kernel.py +0 -0
  482. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/probe_pack.py +0 -0
  483. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/profiler.py +0 -0
  484. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/profiling.py +0 -0
  485. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  486. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_compile.py +0 -0
  487. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/prompt_distill.py +0 -0
  488. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/prune_prompt.py +0 -0
  489. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/qat.py +0 -0
  490. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/qr_url.py +0 -0
  491. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/quality.py +0 -0
  492. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/quant_menu.py +0 -0
  493. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit.py +0 -0
  494. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ra_dit_run.py +0 -0
  495. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/raft.py +0 -0
  496. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_effort.py +0 -0
  497. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/reasoning_parser.py +0 -0
  498. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_dag.py +0 -0
  499. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/recipe_run.py +0 -0
  500. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/registry.py +0 -0
  501. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/relora.py +0 -0
  502. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/replay.py +0 -0
  503. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/repro_receipt.py +0 -0
  504. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hack_control.py +0 -0
  505. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/reward_hacking.py +0 -0
  506. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ring_attention.py +0 -0
  507. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  508. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  509. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/run_cost.py +0 -0
  510. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/sae_diff.py +0 -0
  511. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/save_formats.py +0 -0
  512. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/server_tools.py +0 -0
  513. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/sglang.py +0 -0
  514. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ship_verdict.py +0 -0
  515. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/shortcuts.py +0 -0
  516. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/signing.py +0 -0
  517. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/sleeper_probe.py +0 -0
  518. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/soup_lock.py +0 -0
  519. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/spec_pairing.py +0 -0
  520. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/spectrum_scan.py +0 -0
  521. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/spike_recovery.py +0 -0
  522. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/sse_train_stream.py +0 -0
  523. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/steering.py +0 -0
  524. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/strict_safetensors.py +0 -0
  525. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/structured_output.py +0 -0
  526. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/sweep_config.py +0 -0
  527. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tail_latency.py +0 -0
  528. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/terraform_plan.py +0 -0
  529. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tool_outputs.py +0 -0
  530. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/topology.py +0 -0
  531. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tracing.py +0 -0
  532. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/trackers.py +0 -0
  533. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/train_event_buffer.py +0 -0
  534. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/trainer_plugins.py +0 -0
  535. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/trust_remote.py +0 -0
  536. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/truth_probe.py +0 -0
  537. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tts.py +0 -0
  538. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tts_codec.py +0 -0
  539. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/tunability.py +0 -0
  540. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/ui_env.py +0 -0
  541. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/uld.py +0 -0
  542. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  543. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning.py +0 -0
  544. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/unlearning_eval.py +0 -0
  545. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/unsloth.py +0 -0
  546. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/v028_features.py +0 -0
  547. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/vector_bank.py +0 -0
  548. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/vllm.py +0 -0
  549. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/vscode_setup.py +0 -0
  550. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/warmup.py +0 -0
  551. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/webhooks.py +0 -0
  552. {soup_cli-0.71.28 → soup_cli-0.71.30}/src/soup_cli/utils/why.py +0 -0
  553. {soup_cli-0.71.28 → soup_cli-0.71.30}/templates/chat.yaml +0 -0
  554. {soup_cli-0.71.28 → soup_cli-0.71.30}/templates/code.yaml +0 -0
  555. {soup_cli-0.71.28 → soup_cli-0.71.30}/templates/medical.yaml +0 -0
  556. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/__init__.py +0 -0
  557. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/conftest.py +0 -0
  558. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/qa/v053_qa.md +0 -0
  559. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/qa/v07114_qa.md +0 -0
  560. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/qa/v0716_qa.md +0 -0
  561. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_adapters.py +0 -0
  562. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_advanced_peft.py +0 -0
  563. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_assistant_mask.py +0 -0
  564. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_audio.py +0 -0
  565. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_auto_tuning.py +0 -0
  566. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_autopilot.py +0 -0
  567. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_awq_gptq_export.py +0 -0
  568. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_batch_probe.py +0 -0
  569. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_bco.py +0 -0
  570. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_bench.py +0 -0
  571. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_brain_rot_multilingual.py +0 -0
  572. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_bugfixes.py +0 -0
  573. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_build_dag.py +0 -0
  574. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_callback.py +0 -0
  575. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_cans.py +0 -0
  576. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_chat.py +0 -0
  577. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_chat_template.py +0 -0
  578. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_cli.py +0 -0
  579. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_cli_subprocess.py +0 -0
  580. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_code_review_critical.py +0 -0
  581. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_code_review_deferred.py +0 -0
  582. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_code_review_high.py +0 -0
  583. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_code_review_medium_low.py +0 -0
  584. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_code_review_recurring.py +0 -0
  585. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_config.py +0 -0
  586. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_cost.py +0 -0
  587. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_crash_reporter.py +0 -0
  588. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_curriculum.py +0 -0
  589. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_data.py +0 -0
  590. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_data_augment.py +0 -0
  591. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_data_sample.py +0 -0
  592. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_data_split.py +0 -0
  593. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_data_tools.py +0 -0
  594. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_dataset_hub.py +0 -0
  595. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_dataset_registry.py +0 -0
  596. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_deepspeed.py +0 -0
  597. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_deploy_ollama.py +0 -0
  598. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_diff.py +0 -0
  599. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_display.py +0 -0
  600. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_doctor.py +0 -0
  601. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_dpo_example.py +0 -0
  602. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_dpo_variants.py +0 -0
  603. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_embedding.py +0 -0
  604. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_errors.py +0 -0
  605. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_eval.py +0 -0
  606. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_eval_gate.py +0 -0
  607. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_eval_platform.py +0 -0
  608. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_export.py +0 -0
  609. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_formats.py +0 -0
  610. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_fp8_recipe.py +0 -0
  611. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_freeze_training.py +0 -0
  612. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_generate.py +0 -0
  613. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_gpu.py +0 -0
  614. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_grpo.py +0 -0
  615. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_hf_integration.py +0 -0
  616. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_infer.py +0 -0
  617. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_inference_advanced.py +0 -0
  618. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_init.py +0 -0
  619. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ipo.py +0 -0
  620. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_jinja_analyzer.py +0 -0
  621. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_kto.py +0 -0
  622. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_loader.py +0 -0
  623. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_log_level.py +0 -0
  624. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_loss_watchdog.py +0 -0
  625. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_merge.py +0 -0
  626. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_migrate.py +0 -0
  627. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_mlx_backend.py +0 -0
  628. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_moe.py +0 -0
  629. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_multi_adapter.py +0 -0
  630. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_multi_gpu.py +0 -0
  631. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_multipack_config.py +0 -0
  632. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_multipack_invariants.py +0 -0
  633. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_multipack_sampler.py +0 -0
  634. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_neat_packing.py +0 -0
  635. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_neftune_rslora.py +0 -0
  636. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_onnx_tensorrt_export.py +0 -0
  637. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_orpo.py +0 -0
  638. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_packing.py +0 -0
  639. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_a_wave1.py +0 -0
  640. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_a_wave2.py +0 -0
  641. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_b.py +0 -0
  642. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_c.py +0 -0
  643. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_d.py +0 -0
  644. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_e.py +0 -0
  645. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_part_f_hardening.py +0 -0
  646. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_peft_methods.py +0 -0
  647. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_peft_patches.py +0 -0
  648. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_performance.py +0 -0
  649. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_pissa_init.py +0 -0
  650. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ppo.py +0 -0
  651. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_preference_dispatcher.py +0 -0
  652. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_preference_multi.py +0 -0
  653. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_preference_multi_runtime.py +0 -0
  654. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_pretrain.py +0 -0
  655. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_profile.py +0 -0
  656. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_profiling.py +0 -0
  657. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_progress.py +0 -0
  658. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_push.py +0 -0
  659. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_qat.py +0 -0
  660. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_quality_filter.py +0 -0
  661. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_quant_check.py +0 -0
  662. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_quant_menu.py +0 -0
  663. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_quickstart.py +0 -0
  664. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_rank_pattern.py +0 -0
  665. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_recipes_v031.py +0 -0
  666. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_refusal_multilingual.py +0 -0
  667. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_registry.py +0 -0
  668. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_relora.py +0 -0
  669. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_replay.py +0 -0
  670. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_resume.py +0 -0
  671. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_rlvr.py +0 -0
  672. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_run_cost.py +0 -0
  673. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_runs.py +0 -0
  674. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_serve.py +0 -0
  675. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_server_generate.py +0 -0
  676. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_sglang_serve.py +0 -0
  677. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_simpo.py +0 -0
  678. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_smoke_train.py +0 -0
  679. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_speculative_decoding.py +0 -0
  680. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_sweep.py +0 -0
  681. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_synth_data_pro.py +0 -0
  682. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_templates_yaml.py +0 -0
  683. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_tensorboard.py +0 -0
  684. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_tool_calling.py +0 -0
  685. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_trace_to_pref.py +0 -0
  686. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_tracker.py +0 -0
  687. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_trainer_coverage_v035.py +0 -0
  688. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_trainer_init.py +0 -0
  689. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_training_intelligence.py +0 -0
  690. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_training_speed.py +0 -0
  691. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_trust_remote_code.py +0 -0
  692. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_tui.py +0 -0
  693. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ui.py +0 -0
  694. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ui_chat.py +0 -0
  695. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ui_config_builder.py +0 -0
  696. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ui_live_monitor.py +0 -0
  697. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_ui_metrics.py +0 -0
  698. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_unsloth.py +0 -0
  699. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0401_part_c.py +0 -0
  700. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0401_part_d.py +0 -0
  701. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0401_part_e.py +0 -0
  702. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0402_part_a.py +0 -0
  703. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0402_part_b.py +0 -0
  704. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0403_part_a.py +0 -0
  705. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0403_part_b.py +0 -0
  706. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0403_part_c.py +0 -0
  707. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0404_part_a.py +0 -0
  708. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0404_part_b.py +0 -0
  709. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0405_part_a.py +0 -0
  710. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0406_part_a.py +0 -0
  711. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0410_part_a.py +0 -0
  712. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0410_part_b.py +0 -0
  713. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0410_part_c.py +0 -0
  714. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0420.py +0 -0
  715. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0430_part_a.py +0 -0
  716. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0430_part_b.py +0 -0
  717. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0430_part_c.py +0 -0
  718. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0430_part_d.py +0 -0
  719. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0440_part_a.py +0 -0
  720. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0440_part_b.py +0 -0
  721. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0440_part_c.py +0 -0
  722. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0440_part_d.py +0 -0
  723. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0440_review_followups.py +0 -0
  724. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0450.py +0 -0
  725. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0460_part_a.py +0 -0
  726. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0460_part_b.py +0 -0
  727. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0470_part_a.py +0 -0
  728. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0470_part_b.py +0 -0
  729. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0480_part_a.py +0 -0
  730. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0480_part_b.py +0 -0
  731. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0490.py +0 -0
  732. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0500_part_a.py +0 -0
  733. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0500_part_b.py +0 -0
  734. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0500_part_c.py +0 -0
  735. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0500_part_d.py +0 -0
  736. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0500_part_e.py +0 -0
  737. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0510.py +0 -0
  738. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0520.py +0 -0
  739. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0530.py +0 -0
  740. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v05310.py +0 -0
  741. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v05311.py +0 -0
  742. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0531_109.py +0 -0
  743. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0531_139.py +0 -0
  744. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0531_142.py +0 -0
  745. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0531_82.py +0 -0
  746. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0532.py +0 -0
  747. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0533.py +0 -0
  748. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0534.py +0 -0
  749. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0535.py +0 -0
  750. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0536.py +0 -0
  751. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0537.py +0 -0
  752. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0538.py +0 -0
  753. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0539.py +0 -0
  754. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0540.py +0 -0
  755. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0550.py +0 -0
  756. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0550_followups.py +0 -0
  757. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0560.py +0 -0
  758. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0570_part_a.py +0 -0
  759. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0570_part_b.py +0 -0
  760. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0570_part_c.py +0 -0
  761. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0570_part_d.py +0 -0
  762. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0580.py +0 -0
  763. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0590.py +0 -0
  764. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_a.py +0 -0
  765. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_b.py +0 -0
  766. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_c.py +0 -0
  767. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_d.py +0 -0
  768. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_e.py +0 -0
  769. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0600_part_f.py +0 -0
  770. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0610_part_a.py +0 -0
  771. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0610_part_b.py +0 -0
  772. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0610_part_c.py +0 -0
  773. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0610_part_d.py +0 -0
  774. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0610_part_e.py +0 -0
  775. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_followups.py +0 -0
  776. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_part_a.py +0 -0
  777. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_part_b.py +0 -0
  778. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_part_c.py +0 -0
  779. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_part_d.py +0 -0
  780. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0620_part_e.py +0 -0
  781. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_followups.py +0 -0
  782. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_part_a.py +0 -0
  783. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_part_b.py +0 -0
  784. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_part_c.py +0 -0
  785. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_part_d.py +0 -0
  786. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0630_part_e.py +0 -0
  787. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0631_206.py +0 -0
  788. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_followups.py +0 -0
  789. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_a.py +0 -0
  790. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_b.py +0 -0
  791. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_c.py +0 -0
  792. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_d.py +0 -0
  793. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_e.py +0 -0
  794. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0640_part_f.py +0 -0
  795. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_followups.py +0 -0
  796. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_part_a.py +0 -0
  797. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_part_b.py +0 -0
  798. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_part_c.py +0 -0
  799. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_part_d.py +0 -0
  800. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0650_part_e.py +0 -0
  801. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_cli.py +0 -0
  802. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_followups.py +0 -0
  803. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_part_a.py +0 -0
  804. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_part_b.py +0 -0
  805. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_part_c.py +0 -0
  806. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_part_d.py +0 -0
  807. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0660_part_e.py +0 -0
  808. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_followups.py +0 -0
  809. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_a.py +0 -0
  810. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_b.py +0 -0
  811. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_c.py +0 -0
  812. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_d.py +0 -0
  813. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_e.py +0 -0
  814. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0670_part_f.py +0 -0
  815. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_followups.py +0 -0
  816. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_part_a.py +0 -0
  817. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_part_b.py +0 -0
  818. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_part_c.py +0 -0
  819. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_part_d.py +0 -0
  820. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0680_part_e.py +0 -0
  821. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0690_part_a.py +0 -0
  822. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0690_part_b.py +0 -0
  823. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0690_part_c.py +0 -0
  824. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0690_part_d.py +0 -0
  825. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0690_part_e.py +0 -0
  826. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_a.py +0 -0
  827. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_b.py +0 -0
  828. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_c.py +0 -0
  829. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_d.py +0 -0
  830. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_e.py +0 -0
  831. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0700_part_f.py +0 -0
  832. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07110.py +0 -0
  833. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07111.py +0 -0
  834. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07112.py +0 -0
  835. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07113.py +0 -0
  836. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07114.py +0 -0
  837. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07115.py +0 -0
  838. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07116.py +0 -0
  839. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07117.py +0 -0
  840. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07118.py +0 -0
  841. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07119.py +0 -0
  842. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0712.py +0 -0
  843. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07120.py +0 -0
  844. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07121.py +0 -0
  845. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07122.py +0 -0
  846. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07123.py +0 -0
  847. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07125.py +0 -0
  848. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07126.py +0 -0
  849. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07127.py +0 -0
  850. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v07128.py +0 -0
  851. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0713.py +0 -0
  852. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0714.py +0 -0
  853. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0715.py +0 -0
  854. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0716.py +0 -0
  855. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0717.py +0 -0
  856. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0718.py +0 -0
  857. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_v0719.py +0 -0
  858. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_validator.py +0 -0
  859. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_vision.py +0 -0
  860. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_vllm_serve.py +0 -0
  861. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_warmup.py +0 -0
  862. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_why.py +0 -0
  863. {soup_cli-0.71.28 → soup_cli-0.71.30}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,73 @@ 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
+
53
+ ## [0.71.29] - 2026-07-05
54
+
55
+ ### Added
56
+ - **`soup shrink`** — depth-prune a model + optional distill-heal
57
+ ("The Unreasonable Ineffectiveness of the Deeper Layers", arXiv:2403.17887).
58
+ Ranks decoder layers by the angular distance of the residual stream across a
59
+ contiguous block over a calibration set, drops the least-important block
60
+ (first and last layer always protected), optionally *heals* by distilling the
61
+ original model into the pruned student, and emits a single dense smaller model
62
+ plus a one-screen **SHIP / DON'T SHIP** perplexity verdict.
63
+ `soup shrink --model <id|path> [--drop-ratio 0.25 | --drop-layers N] --calib
64
+ <calib.jsonl> [--heal <heal.jsonl> --heal-steps N] [--tolerance 0.10]
65
+ [-o <dir>] [--device cpu] [--attach-to-registry <id>] [--plan-only]`.
66
+ Exit codes: 0 = SHIP, 2 = DON'T SHIP, 1 = error. The heal runs as an isolated
67
+ `soup train` subprocess (LoRA-student logit distillation) and the adapter is
68
+ fused back so the shipped artifact stays a single dense model. Arch allowlist
69
+ v1: Llama / Qwen / SmolLM. Validated live on SmolLM2-135M (drop 25 %: 30 -> 22
70
+ layers, ppl x2.98 unhealed; drop 4 + heal: ppl x1.35, recovered).
71
+
72
+ ### Security
73
+ - `soup shrink` contains `--calib` / `--heal` / `--output-dir` (and every
74
+ derived write path: `<out>/model`, `<out>/heal_adapter`, the fuse staging dir)
75
+ under cwd with `os.path.realpath` + `commonpath` + O_NOFOLLOW + symlink
76
+ rejection, re-validating derived paths right before each write (TOCTOU). The
77
+ heal subprocess uses an argv list (no shell) with a timeout; its config is
78
+ schema-validated before spawn; subprocess output is C0/ESC-stripped before it
79
+ reaches the terminal. `--model` defaults `trust_remote_code=False` with a
80
+ probe + warn.
81
+
15
82
  ## [0.71.28] - 2026-07-04
16
83
 
17
84
  ### 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 (305 files, 15140 tests)
123
+ tests/ - Test suite (307 files, 15334 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -150,7 +150,7 @@ pytest tests/test_data.py::test_detect_alpaca_format -v
150
150
  pytest tests/ --cov=soup_cli --cov-report=html
151
151
  ```
152
152
 
153
- ### Test Files (305 files)
153
+ ### Test Files (306 files)
154
154
 
155
155
  > A representative sample of the suite below. The full table lives in
156
156
  > [`.claude/CLAUDE.md`](.claude/CLAUDE.md); run `pytest tests/ -v` for the complete list.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.28
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,25 +193,27 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.28Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
197
-
198
- - **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
199
- `recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
200
- `diagnose_evidence`, `ship_evidence` your agent can inspect data, search recipes, read runs,
201
- and get a ship verdict without you leaving the chat.
202
- - **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
203
- mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
204
- render the exact command that would run. Every path argument re-enters cwd containment +
205
- symlink rejection; output is control-char sanitized; errors are path-free.
206
- - **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
207
- (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
208
- - **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
209
- call` end-to-end on Windows + RTX 3050 read tools return real JSON, the mutating tools
210
- refuse without the flag, and a path-traversal argument is rejected.
211
-
212
- ```jsonc
213
- // .mcp.json (Claude Code) or claude_desktop_config.json
214
- { "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
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).
211
+
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
215
217
  ```
216
218
 
217
219
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@@ -49,25 +49,27 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.28Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
53
-
54
- - **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
55
- `recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
56
- `diagnose_evidence`, `ship_evidence` your agent can inspect data, search recipes, read runs,
57
- and get a ship verdict without you leaving the chat.
58
- - **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
59
- mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
60
- render the exact command that would run. Every path argument re-enters cwd containment +
61
- symlink rejection; output is control-char sanitized; errors are path-free.
62
- - **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
63
- (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
64
- - **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
65
- call` end-to-end on Windows + RTX 3050 read tools return real JSON, the mutating tools
66
- refuse without the flag, and a path-traversal argument is rejected.
67
-
68
- ```jsonc
69
- // .mcp.json (Claude Code) or claude_desktop_config.json
70
- { "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
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).
67
+
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
71
73
  ```
72
74
 
73
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
@@ -158,6 +158,9 @@ soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via
158
158
  soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 + recorded base scores
159
159
  soup mcp serve MCP server over stdio (drive Soup from Claude Code / Cursor / Cline; requires [mcp] extra) (v0.71.28)
160
160
  soup mcp serve --allow-mutating Also expose plan-only train_start / export tools (never execute) (v0.71.28)
161
+ soup shrink --model <id|path> --drop-ratio 0.25 --calib c.jsonl -o shrunk Depth-prune least-important layer block + SHIP/DON'T-SHIP ppl verdict (exit 0/2/1) (v0.71.29)
162
+ soup shrink ... --drop-layers N --heal h.jsonl --heal-steps 200 --device cpu Drop N layers + distill-heal (fuse LoRA back to one dense model)
163
+ soup shrink ... --tolerance 0.10 --plan-only [--attach-to-registry <id>] Ppl-regression tolerance / print importance table only / registry attach
161
164
  soup tui Full-screen Textual dashboard (requires [tui] extra)
162
165
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
163
166
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -24,6 +24,57 @@
24
24
  - [Training Stability & Auto-Tuning](#training-stability--auto-tuning)
25
25
  - [Training Intelligence (Forgetting + Checkpoint Quality)](#training-intelligence-forgetting--checkpoint-quality)
26
26
  - [GaLore (Memory-Efficient Full-Parameter Training)](#galore-memory-efficient-full-parameter-training)
27
+ - [Depth Pruning + Distill-Heal (`soup shrink`)](#depth-pruning--distill-heal-soup-shrink)
28
+
29
+ ---
30
+
31
+ ## Depth Pruning + Distill-Heal (`soup shrink`)
32
+
33
+ `soup shrink` makes a model smaller by dropping its least-important **contiguous
34
+ block of decoder layers**, then optionally *healing* the loss with knowledge
35
+ distillation. It implements "The Unreasonable Ineffectiveness of the Deeper
36
+ Layers" (Gromov et al., arXiv:2403.17887), with a Minitron-style distillation
37
+ heal instead of the paper's plain LoRA fine-tune.
38
+
39
+ **How it ranks layers.** For each candidate block `[L, L+n)`, one forward pass
40
+ per calibration prompt (`output_hidden_states=True`) measures the **angular
41
+ distance** of the residual stream entering (`hidden_states[L]`) vs leaving
42
+ (`hidden_states[L+n]`) the block, averaged over every non-pad token across the
43
+ calibration set. The block with the *lowest* distance transforms the residual
44
+ stream least, so it is the safest to drop. The first and last decoder layers are
45
+ always protected (they carry the most transformation).
46
+
47
+ ```bash
48
+ # See the importance table + chosen block without writing anything:
49
+ soup shrink --model HuggingFaceTB/SmolLM2-135M-Instruct --drop-ratio 0.25 \
50
+ --calib calib.jsonl --device cpu --plan-only
51
+
52
+ # Prune 25% + heal (distill the original into the pruned student, fuse to one
53
+ # dense model) + get a SHIP/DON'T-SHIP perplexity verdict:
54
+ soup shrink --model HuggingFaceTB/SmolLM2-135M-Instruct --drop-ratio 0.25 \
55
+ --calib calib.jsonl --heal heal.jsonl --heal-steps 200 \
56
+ --tolerance 0.10 -o shrunk --device cpu --attach-to-registry <id>
57
+ ```
58
+
59
+ - **`--drop-ratio F` / `--drop-layers N`** (exactly one) — how many contiguous
60
+ layers to drop; the *position* is chosen automatically by the importance scan.
61
+ - **`--calib <jsonl>`** — calibration prompts (`{"text": ...}` / `{"prompt":
62
+ ...}` / chat `messages`). Must stay under cwd.
63
+ - **`--heal <jsonl> --heal-steps N`** — distill the full-depth original into the
64
+ pruned student (LoRA logit-KD) as an isolated `soup train` subprocess, then
65
+ fuse the adapter back into the pruned base so the output is a single dense
66
+ model. Heal keeps the teacher resident (~2× model memory); with `--device
67
+ cpu` the heal runs on CPU (validated ≤ 3 B on a 4 GB card).
68
+ - **`--tolerance F`** — ship if the perplexity regression stays within `F`
69
+ (default `0.10` = 10 %). Exit code `0 = SHIP`, `2 = DON'T SHIP`, `1 = error`.
70
+ - **`-o <dir>`** — the shrunk model lands in `<dir>/model`; the verdict in
71
+ `<dir>/shrink_report.json`.
72
+
73
+ **Arch support (v1):** Llama / Qwen / SmolLM. Others are a friendly reject.
74
+ The importance pass loads the model, so live-validated on ≤ 3 B; larger models
75
+ work but are unvalidated on the reference hardware. Perplexity is an unweighted
76
+ mean of per-example perplexities — valid for the before/after *ratio* the
77
+ verdict uses, not directly comparable to `soup eval` absolute numbers.
27
78
 
28
79
  ---
29
80
 
@@ -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).