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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (901) hide show
  1. {soup_cli-0.71.38 → soup_cli-0.71.40}/CHANGELOG.md +86 -0
  2. {soup_cli-0.71.38 → soup_cli-0.71.40}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.38 → soup_cli-0.71.40}/PKG-INFO +33 -27
  4. {soup_cli-0.71.38 → soup_cli-0.71.40}/README.md +32 -26
  5. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/commands.md +8 -1
  6. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/evaluation.md +30 -0
  7. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/training.md +31 -0
  8. {soup_cli-0.71.38 → soup_cli-0.71.40}/pyproject.toml +1 -1
  9. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/__init__.py +1 -1
  10. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cli.py +12 -0
  11. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ci.py +7 -0
  12. soup_cli-0.71.40/src/soup_cli/commands/reward.py +225 -0
  13. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ship.py +323 -22
  14. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/config/schema.py +102 -4
  15. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/envs/calculator.py +2 -1
  16. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/envs/guess_number.py +1 -1
  17. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/grpo.py +9 -3
  18. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/rewards.py +41 -0
  19. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ci_workflow.py +42 -4
  20. soup_cli-0.71.40/src/soup_cli/utils/reward_synth.py +716 -0
  21. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ship_verdict.py +78 -1
  22. soup_cli-0.71.40/tests/test_v07139.py +802 -0
  23. soup_cli-0.71.40/tests/test_v07140.py +855 -0
  24. {soup_cli-0.71.38 → soup_cli-0.71.40}/.dockerignore +0 -0
  25. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/FUNDING.yml +0 -0
  26. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  27. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  28. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  29. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/pull_request_template.md +0 -0
  30. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/workflows/ci.yml +0 -0
  31. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/workflows/docker.yml +0 -0
  32. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/workflows/publish.yml +0 -0
  33. {soup_cli-0.71.38 → soup_cli-0.71.40}/.github/workflows/recipe-validation.yml +0 -0
  34. {soup_cli-0.71.38 → soup_cli-0.71.40}/.gitignore +0 -0
  35. {soup_cli-0.71.38 → soup_cli-0.71.40}/.mailmap +0 -0
  36. {soup_cli-0.71.38 → soup_cli-0.71.40}/.pre-commit-config.yaml +0 -0
  37. {soup_cli-0.71.38 → soup_cli-0.71.40}/AGENTS.md +0 -0
  38. {soup_cli-0.71.38 → soup_cli-0.71.40}/CODEOWNERS +0 -0
  39. {soup_cli-0.71.38 → soup_cli-0.71.40}/CODE_OF_CONDUCT.md +0 -0
  40. {soup_cli-0.71.38 → soup_cli-0.71.40}/CONTRIBUTORS.md +0 -0
  41. {soup_cli-0.71.38 → soup_cli-0.71.40}/Dockerfile +0 -0
  42. {soup_cli-0.71.38 → soup_cli-0.71.40}/LICENSE +0 -0
  43. {soup_cli-0.71.38 → soup_cli-0.71.40}/NOTICE +0 -0
  44. {soup_cli-0.71.38 → soup_cli-0.71.40}/SECURITY.md +0 -0
  45. {soup_cli-0.71.38 → soup_cli-0.71.40}/docker-compose.yml +0 -0
  46. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/README.md +0 -0
  47. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/adapters-and-governance.md +0 -0
  48. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/backends-and-ops.md +0 -0
  49. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/compliance.md +0 -0
  50. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/data.md +0 -0
  51. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/models.md +0 -0
  52. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/peft-and-efficiency.md +0 -0
  53. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/performance-and-quantization.md +0 -0
  54. {soup_cli-0.71.38 → soup_cli-0.71.40}/docs/serving-and-export.md +0 -0
  55. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/README.md +0 -0
  56. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/dpo_chat.yaml +0 -0
  57. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/dpo_example.yaml +0 -0
  58. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/grpo_reasoning.yaml +0 -0
  59. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/rlhf_step1_sft.yaml +0 -0
  60. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/rlhf_step2_reward.yaml +0 -0
  61. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  62. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/sft_basic.yaml +0 -0
  63. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/configs/vision_llama.yaml +0 -0
  64. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/data/alpaca_tiny.jsonl +0 -0
  65. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/data/chat_preferences.jsonl +0 -0
  66. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/data/dpo_sample.jsonl +0 -0
  67. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/data/reasoning_math.jsonl +0 -0
  68. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/reward_hacking/rewards.py +0 -0
  69. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/synthetic_workflow.md +0 -0
  70. {soup_cli-0.71.38 → soup_cli-0.71.40}/examples/synthetic_workflow.yaml +0 -0
  71. {soup_cli-0.71.38 → soup_cli-0.71.40}/soup.png +0 -0
  72. {soup_cli-0.71.38 → soup_cli-0.71.40}/soup_logo_svg.svg +0 -0
  73. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/__main__.py +0 -0
  74. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/autopilot/__init__.py +0 -0
  75. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/autopilot/analyzer.py +0 -0
  76. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/autopilot/decisions.py +0 -0
  77. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/autopilot/generate_config.py +0 -0
  78. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/__init__.py +0 -0
  79. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/pack.py +0 -0
  80. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/publish.py +0 -0
  81. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/run.py +0 -0
  82. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/schema.py +0 -0
  83. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/unpack.py +0 -0
  84. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cans/verify.py +0 -0
  85. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cloud/__init__.py +0 -0
  86. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/cloud/modal.py +0 -0
  87. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/__init__.py +0 -0
  88. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0550.py +0 -0
  89. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0610.py +0 -0
  90. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v0650.py +0 -0
  91. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/_eval_v07110.py +0 -0
  92. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/_webhook_cli.py +0 -0
  93. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ab.py +0 -0
  94. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/active_sample.py +0 -0
  95. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/adapters.py +0 -0
  96. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/advise.py +0 -0
  97. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/agent.py +0 -0
  98. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/airgap.py +0 -0
  99. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/apple_adapter.py +0 -0
  100. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/attest.py +0 -0
  101. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/audit_log.py +0 -0
  102. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/autopilot.py +0 -0
  103. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/bench.py +0 -0
  104. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/bom.py +0 -0
  105. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/build.py +0 -0
  106. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/can.py +0 -0
  107. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/card.py +0 -0
  108. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/chat.py +0 -0
  109. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/compile_cmd.py +0 -0
  110. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/compile_tools.py +0 -0
  111. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/completions.py +0 -0
  112. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/cost.py +0 -0
  113. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data.py +0 -0
  114. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_canary.py +0 -0
  115. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_doctor.py +0 -0
  116. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_forge.py +0 -0
  117. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_mix.py +0 -0
  118. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_score.py +0 -0
  119. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/data_topics.py +0 -0
  120. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  121. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/deploy.py +0 -0
  122. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/diagnose.py +0 -0
  123. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/diff.py +0 -0
  124. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/distill_prompt.py +0 -0
  125. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/doctor.py +0 -0
  126. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/draft.py +0 -0
  127. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/drift_alarm.py +0 -0
  128. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/edit.py +0 -0
  129. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/env.py +0 -0
  130. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/eval.py +0 -0
  131. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/expect.py +0 -0
  132. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/export.py +0 -0
  133. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/fetch.py +0 -0
  134. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/generate.py +0 -0
  135. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/history.py +0 -0
  136. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/infer.py +0 -0
  137. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ingest.py +0 -0
  138. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/init.py +0 -0
  139. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/iterative_dpo.py +0 -0
  140. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/license_advisor.py +0 -0
  141. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/llama.py +0 -0
  142. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/local_rl.py +0 -0
  143. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/lock.py +0 -0
  144. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/loop.py +0 -0
  145. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/mcp.py +0 -0
  146. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/merge.py +0 -0
  147. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  148. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/migrate.py +0 -0
  149. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/monitor.py +0 -0
  150. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/plan.py +0 -0
  151. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/plugins.py +0 -0
  152. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/probe.py +0 -0
  153. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/profile.py +0 -0
  154. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/prune_prompt.py +0 -0
  155. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/push.py +0 -0
  156. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/quantize.py +0 -0
  157. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/quickstart.py +0 -0
  158. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ra_dit.py +0 -0
  159. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/recipes.py +0 -0
  160. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/registry.py +0 -0
  161. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/runs.py +0 -0
  162. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/serve.py +0 -0
  163. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/shrink.py +0 -0
  164. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/spectrum.py +0 -0
  165. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/steer.py +0 -0
  166. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/sweep.py +0 -0
  167. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/tokenizer.py +0 -0
  168. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/train.py +0 -0
  169. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/tui.py +0 -0
  170. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/tunability.py +0 -0
  171. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/ui.py +0 -0
  172. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/commands/why.py +0 -0
  173. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/config/__init__.py +0 -0
  174. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/config/loader.py +0 -0
  175. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/__init__.py +0 -0
  176. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  177. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  178. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  179. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  180. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  181. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  182. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  183. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  184. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  185. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  186. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  187. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  188. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  189. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  190. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  191. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/augment.py +0 -0
  192. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/chat_templates.py +0 -0
  193. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/collators.py +0 -0
  194. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/formats.py +0 -0
  195. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/loader.py +0 -0
  196. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/loss_mask.py +0 -0
  197. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/providers/__init__.py +0 -0
  198. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/providers/_utils.py +0 -0
  199. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/providers/anthropic.py +0 -0
  200. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/providers/ollama.py +0 -0
  201. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/providers/vllm.py +0 -0
  202. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/sft_format.py +0 -0
  203. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/__init__.py +0 -0
  204. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/code.py +0 -0
  205. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/conversation.py +0 -0
  206. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/preference.py +0 -0
  207. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/qa.py +0 -0
  208. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/reasoning.py +0 -0
  209. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/tool_calling.py +0 -0
  210. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/templates/verifiable.py +0 -0
  211. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/traces/__init__.py +0 -0
  212. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/traces/pair_builder.py +0 -0
  213. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/traces/parsers.py +0 -0
  214. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/traces/quality.py +0 -0
  215. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/data/validator.py +0 -0
  216. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/envs/__init__.py +0 -0
  217. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/envs/_common.py +0 -0
  218. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/envs/retrieval_qa.py +0 -0
  219. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/__init__.py +0 -0
  220. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/arena.py +0 -0
  221. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  222. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/calibrate.py +0 -0
  223. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  224. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/custom.py +0 -0
  225. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/forgetting.py +0 -0
  226. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/gate.py +0 -0
  227. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/gate_suites.py +0 -0
  228. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/human.py +0 -0
  229. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/judge.py +0 -0
  230. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/leaderboard.py +0 -0
  231. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/eval/quant_check.py +0 -0
  232. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/experiment/__init__.py +0 -0
  233. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/experiment/tracker.py +0 -0
  234. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/mcp_server/__init__.py +0 -0
  235. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/mcp_server/registry.py +0 -0
  236. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/mcp_server/server.py +0 -0
  237. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/migrate/__init__.py +0 -0
  238. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/migrate/axolotl.py +0 -0
  239. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/migrate/common.py +0 -0
  240. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/migrate/llamafactory.py +0 -0
  241. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/migrate/unsloth.py +0 -0
  242. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/__init__.py +0 -0
  243. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/callback.py +0 -0
  244. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  245. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/display.py +0 -0
  246. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  247. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/hf_push.py +0 -0
  248. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  249. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/monitoring/trace_logger.py +0 -0
  250. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/plugins/__init__.py +0 -0
  251. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/py.typed +0 -0
  252. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/recipes/__init__.py +0 -0
  253. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/recipes/catalog.py +0 -0
  254. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/registry/__init__.py +0 -0
  255. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/registry/attach.py +0 -0
  256. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/registry/diff.py +0 -0
  257. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/registry/hashing.py +0 -0
  258. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/registry/store.py +0 -0
  259. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/__init__.py +0 -0
  260. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/audio.yaml +0 -0
  261. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/bco.yaml +0 -0
  262. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/chat.yaml +0 -0
  263. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/code.yaml +0 -0
  264. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/embedding.yaml +0 -0
  265. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  266. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  267. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  268. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  269. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/hipaa.yaml +0 -0
  270. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/ipo.yaml +0 -0
  271. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/kto.yaml +0 -0
  272. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/longcontext.yaml +0 -0
  273. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/manifest.json +0 -0
  274. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/medical.yaml +0 -0
  275. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/moe.yaml +0 -0
  276. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/orpo.yaml +0 -0
  277. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/pretrain.yaml +0 -0
  278. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/reasoning.yaml +0 -0
  279. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/rlhf.yaml +0 -0
  280. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/simpo.yaml +0 -0
  281. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/soc2.yaml +0 -0
  282. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  283. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/tool-calling.yaml +0 -0
  284. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/templates/vision.yaml +0 -0
  285. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/__init__.py +0 -0
  286. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/asr.py +0 -0
  287. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/bco.py +0 -0
  288. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/bitnet.py +0 -0
  289. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/classifier.py +0 -0
  290. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/distill.py +0 -0
  291. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/dpo.py +0 -0
  292. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/embedding.py +0 -0
  293. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/ipo.py +0 -0
  294. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/kto.py +0 -0
  295. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  296. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  297. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_routing.py +0 -0
  298. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/mlx_sft.py +0 -0
  299. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/mole_routing.py +0 -0
  300. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/online_dpo.py +0 -0
  301. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/orpo.py +0 -0
  302. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/ppo.py +0 -0
  303. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/preference.py +0 -0
  304. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/pretrain.py +0 -0
  305. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/prm.py +0 -0
  306. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/raft.py +0 -0
  307. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/reward_model.py +0 -0
  308. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/sft.py +0 -0
  309. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/simpo.py +0 -0
  310. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/tts.py +0 -0
  311. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/trainer/unlearn.py +0 -0
  312. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/tui_app.py +0 -0
  313. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/__init__.py +0 -0
  314. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/app.py +0 -0
  315. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/plugins/__init__.py +0 -0
  316. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/static/app.js +0 -0
  317. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/static/index.html +0 -0
  318. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.png +0 -0
  319. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/static/logo.svg +0 -0
  320. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/ui/static/style.css +0 -0
  321. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/__init__.py +0 -0
  322. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/_eval_text.py +0 -0
  323. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ab_test.py +0 -0
  324. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/activation_offload.py +0 -0
  325. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/active_sampler.py +0 -0
  326. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  327. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_bisect.py +0 -0
  328. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_branch.py +0 -0
  329. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_diff.py +0 -0
  330. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_fuse.py +0 -0
  331. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_merge.py +0 -0
  332. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_pr.py +0 -0
  333. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_scan.py +0 -0
  334. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/adapter_sign.py +0 -0
  335. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/advanced_precision.py +0 -0
  336. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/advise.py +0 -0
  337. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/advise_history.py +0 -0
  338. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/agent_forge.py +0 -0
  339. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/agent_rollout.py +0 -0
  340. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/agent_sandbox.py +0 -0
  341. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/airgap_bundle.py +0 -0
  342. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/annex_xi.py +0 -0
  343. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/anthropic_messages.py +0 -0
  344. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/apple_adapter.py +0 -0
  345. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/asr_metrics.py +0 -0
  346. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/attest.py +0 -0
  347. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/audit_log.py +0 -0
  348. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/auto_quant.py +0 -0
  349. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/backend_detect.py +0 -0
  350. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/batch_probe.py +0 -0
  351. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/behavior_battery.py +0 -0
  352. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/best_of_n.py +0 -0
  353. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/bitnet.py +0 -0
  354. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/blame.py +0 -0
  355. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/block_expansion.py +0 -0
  356. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/bom.py +0 -0
  357. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot.py +0 -0
  358. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  359. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/build_dag.py +0 -0
  360. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/canary.py +0 -0
  361. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/canary_discovery.py +0 -0
  362. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/canary_router.py +0 -0
  363. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/capability_suite.py +0 -0
  364. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/checklist_dsl.py +0 -0
  365. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  366. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/citation_faithful.py +0 -0
  367. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/classifier.py +0 -0
  368. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/cmaes_merge.py +0 -0
  369. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/compile_tools.py +0 -0
  370. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/completions.py +0 -0
  371. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/constants.py +0 -0
  372. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/convergence.py +0 -0
  373. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/crash.py +0 -0
  374. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  375. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum.py +0 -0
  376. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  377. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/cut_ce.py +0 -0
  378. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_doctor.py +0 -0
  379. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_forge.py +0 -0
  380. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_lint.py +0 -0
  381. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_mix.py +0 -0
  382. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_pipeline.py +0 -0
  383. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/data_score.py +0 -0
  384. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/deepspeed.py +0 -0
  385. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  386. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/demo_bundles.py +0 -0
  387. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  388. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/deploy_measure.py +0 -0
  389. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  390. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/_common.py +0 -0
  391. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/badge.py +0 -0
  392. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/citation.py +0 -0
  393. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  394. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  395. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/format.py +0 -0
  396. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/live.py +0 -0
  397. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  398. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  399. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  400. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/report.py +0 -0
  401. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/diagnose/runner.py +0 -0
  402. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/distill.py +0 -0
  403. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/dpo_variants.py +0 -0
  404. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/draft.py +0 -0
  405. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/drift_alarm.py +0 -0
  406. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  407. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/echo_trap.py +0 -0
  408. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/edit_diff.py +0 -0
  409. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/edit_governor.py +0 -0
  410. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/edit_kernels.py +0 -0
  411. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/embed.py +0 -0
  412. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/encoding.py +0 -0
  413. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/energy.py +0 -0
  414. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/env_lock.py +0 -0
  415. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/errors.py +0 -0
  416. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/eval_design.py +0 -0
  417. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  418. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  419. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/evolve.py +0 -0
  420. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/expectations.py +0 -0
  421. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/fetch_examples.py +0 -0
  422. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/flash_attn.py +0 -0
  423. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/fp8.py +0 -0
  424. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/freeze.py +0 -0
  425. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp.py +0 -0
  426. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  427. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/galore.py +0 -0
  428. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/gguf_quant.py +0 -0
  429. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/gpu.py +0 -0
  430. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/gpu_monitor.py +0 -0
  431. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/grace_codebook.py +0 -0
  432. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/graceful_save.py +0 -0
  433. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/grad_accum.py +0 -0
  434. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  435. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_long_context.py +0 -0
  436. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/grpo_variants.py +0 -0
  437. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/hardware_fit.py +0 -0
  438. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/harm_probe.py +0 -0
  439. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/hf.py +0 -0
  440. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/hf_space.py +0 -0
  441. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/hubs.py +0 -0
  442. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ingest_sources.py +0 -0
  443. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/integrations.py +0 -0
  444. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/interference.py +0 -0
  445. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/interference_live.py +0 -0
  446. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/irt.py +0 -0
  447. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/iterative_dpo.py +0 -0
  448. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  449. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/kernel_picker.py +0 -0
  450. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/knowledge_edit.py +0 -0
  451. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/kv_cache.py +0 -0
  452. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/launcher.py +0 -0
  453. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/license_advisor.py +0 -0
  454. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/license_matrix.py +0 -0
  455. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/liger.py +0 -0
  456. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/lisa.py +0 -0
  457. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/live_eval.py +0 -0
  458. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/llama_proxy.py +0 -0
  459. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/llama_server_timings.py +0 -0
  460. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl.py +0 -0
  461. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  462. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loftq_init.py +0 -0
  463. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/log_level.py +0 -0
  464. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/long_context.py +0 -0
  465. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/longlora.py +0 -0
  466. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loop_budget.py +0 -0
  467. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loop_daemon.py +0 -0
  468. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loop_iteration.py +0 -0
  469. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loop_stages.py +0 -0
  470. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/loop_state.py +0 -0
  471. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/lr_finder.py +0 -0
  472. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/lr_groups.py +0 -0
  473. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/magpie.py +0 -0
  474. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/metrics.py +0 -0
  475. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mii.py +0 -0
  476. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/minillm.py +0 -0
  477. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mix_proxy.py +0 -0
  478. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mixed_precision.py +0 -0
  479. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mlx.py +0 -0
  480. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mod.py +0 -0
  481. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/moe.py +0 -0
  482. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/moe_quant.py +0 -0
  483. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/mole_routing.py +0 -0
  484. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/multipack.py +0 -0
  485. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_sampler.py +0 -0
  486. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/multipack_trainer.py +0 -0
  487. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/namespace_pin.py +0 -0
  488. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/neat_packing.py +0 -0
  489. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ngram_spec.py +0 -0
  490. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/nlg_metrics.py +0 -0
  491. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ollama.py +0 -0
  492. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/onboarding.py +0 -0
  493. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  494. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/paths.py +0 -0
  495. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/peft_builder.py +0 -0
  496. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/peft_patches.py +0 -0
  497. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/peft_wiring.py +0 -0
  498. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/persona_hub.py +0 -0
  499. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/pipeline.py +0 -0
  500. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/preference_combine.py +0 -0
  501. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/prm.py +0 -0
  502. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/prm_reward.py +0 -0
  503. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/probe_kernel.py +0 -0
  504. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/probe_pack.py +0 -0
  505. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/profiler.py +0 -0
  506. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/profiling.py +0 -0
  507. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  508. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_compile.py +0 -0
  509. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/prompt_distill.py +0 -0
  510. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/prune_prompt.py +0 -0
  511. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/qat.py +0 -0
  512. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/qr_url.py +0 -0
  513. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/quality.py +0 -0
  514. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/quant_menu.py +0 -0
  515. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit.py +0 -0
  516. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ra_dit_run.py +0 -0
  517. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/raft.py +0 -0
  518. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_effort.py +0 -0
  519. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/reasoning_parser.py +0 -0
  520. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_dag.py +0 -0
  521. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/recipe_run.py +0 -0
  522. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/registry.py +0 -0
  523. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/rehearsal.py +0 -0
  524. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/relora.py +0 -0
  525. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/replay.py +0 -0
  526. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/repro_receipt.py +0 -0
  527. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hack_control.py +0 -0
  528. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/reward_hacking.py +0 -0
  529. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ring_attention.py +0 -0
  530. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  531. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  532. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/run_cost.py +0 -0
  533. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/sae_diff.py +0 -0
  534. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/save_formats.py +0 -0
  535. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/semdedup.py +0 -0
  536. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/server_tools.py +0 -0
  537. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/sglang.py +0 -0
  538. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/shortcuts.py +0 -0
  539. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/shrink.py +0 -0
  540. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/signing.py +0 -0
  541. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/sleeper_probe.py +0 -0
  542. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/soup_lock.py +0 -0
  543. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/spec_pairing.py +0 -0
  544. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/spectrum_scan.py +0 -0
  545. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/spike_recovery.py +0 -0
  546. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/sse_train_stream.py +0 -0
  547. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/steering.py +0 -0
  548. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/strict_safetensors.py +0 -0
  549. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/structured_output.py +0 -0
  550. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/sweep_config.py +0 -0
  551. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tail_latency.py +0 -0
  552. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/terraform_plan.py +0 -0
  553. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tool_outputs.py +0 -0
  554. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/topics.py +0 -0
  555. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/topology.py +0 -0
  556. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tracing.py +0 -0
  557. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/trackers.py +0 -0
  558. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/train_event_buffer.py +0 -0
  559. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/trainer_plugins.py +0 -0
  560. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/trust_remote.py +0 -0
  561. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/truth_probe.py +0 -0
  562. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tts.py +0 -0
  563. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tts_codec.py +0 -0
  564. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/tunability.py +0 -0
  565. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/ui_env.py +0 -0
  566. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/uld.py +0 -0
  567. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  568. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning.py +0 -0
  569. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/unlearning_eval.py +0 -0
  570. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/unsloth.py +0 -0
  571. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/v028_features.py +0 -0
  572. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/vector_bank.py +0 -0
  573. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/vllm.py +0 -0
  574. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/vscode_setup.py +0 -0
  575. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/warmup.py +0 -0
  576. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/webhooks.py +0 -0
  577. {soup_cli-0.71.38 → soup_cli-0.71.40}/src/soup_cli/utils/why.py +0 -0
  578. {soup_cli-0.71.38 → soup_cli-0.71.40}/templates/chat.yaml +0 -0
  579. {soup_cli-0.71.38 → soup_cli-0.71.40}/templates/code.yaml +0 -0
  580. {soup_cli-0.71.38 → soup_cli-0.71.40}/templates/medical.yaml +0 -0
  581. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/__init__.py +0 -0
  582. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/conftest.py +0 -0
  583. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/qa/v053_qa.md +0 -0
  584. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/qa/v07114_qa.md +0 -0
  585. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/qa/v0716_qa.md +0 -0
  586. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_adapters.py +0 -0
  587. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_advanced_peft.py +0 -0
  588. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_assistant_mask.py +0 -0
  589. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_audio.py +0 -0
  590. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_auto_tuning.py +0 -0
  591. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_autopilot.py +0 -0
  592. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_awq_gptq_export.py +0 -0
  593. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_batch_probe.py +0 -0
  594. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_bco.py +0 -0
  595. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_bench.py +0 -0
  596. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_brain_rot_multilingual.py +0 -0
  597. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_bugfixes.py +0 -0
  598. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_build_dag.py +0 -0
  599. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_callback.py +0 -0
  600. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_cans.py +0 -0
  601. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_chat.py +0 -0
  602. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_chat_template.py +0 -0
  603. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_cli.py +0 -0
  604. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_cli_subprocess.py +0 -0
  605. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_code_review_critical.py +0 -0
  606. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_code_review_deferred.py +0 -0
  607. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_code_review_high.py +0 -0
  608. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_code_review_medium_low.py +0 -0
  609. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_code_review_recurring.py +0 -0
  610. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_config.py +0 -0
  611. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_cost.py +0 -0
  612. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_crash_reporter.py +0 -0
  613. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_curriculum.py +0 -0
  614. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_data.py +0 -0
  615. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_data_augment.py +0 -0
  616. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_data_sample.py +0 -0
  617. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_data_split.py +0 -0
  618. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_data_tools.py +0 -0
  619. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_dataset_hub.py +0 -0
  620. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_dataset_registry.py +0 -0
  621. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_deepspeed.py +0 -0
  622. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_deploy_ollama.py +0 -0
  623. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_diff.py +0 -0
  624. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_display.py +0 -0
  625. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_doctor.py +0 -0
  626. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_dpo_example.py +0 -0
  627. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_dpo_variants.py +0 -0
  628. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_embedding.py +0 -0
  629. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_errors.py +0 -0
  630. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_eval.py +0 -0
  631. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_eval_gate.py +0 -0
  632. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_eval_platform.py +0 -0
  633. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_export.py +0 -0
  634. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_formats.py +0 -0
  635. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_fp8_recipe.py +0 -0
  636. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_freeze_training.py +0 -0
  637. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_generate.py +0 -0
  638. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_gpu.py +0 -0
  639. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_grpo.py +0 -0
  640. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_hf_integration.py +0 -0
  641. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_infer.py +0 -0
  642. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_inference_advanced.py +0 -0
  643. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_init.py +0 -0
  644. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ipo.py +0 -0
  645. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_jinja_analyzer.py +0 -0
  646. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_kto.py +0 -0
  647. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_loader.py +0 -0
  648. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_log_level.py +0 -0
  649. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_loss_watchdog.py +0 -0
  650. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_merge.py +0 -0
  651. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_migrate.py +0 -0
  652. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_mlx_backend.py +0 -0
  653. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_moe.py +0 -0
  654. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_multi_adapter.py +0 -0
  655. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_multi_gpu.py +0 -0
  656. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_multipack_config.py +0 -0
  657. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_multipack_invariants.py +0 -0
  658. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_multipack_sampler.py +0 -0
  659. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_neat_packing.py +0 -0
  660. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_neftune_rslora.py +0 -0
  661. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_onnx_tensorrt_export.py +0 -0
  662. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_orpo.py +0 -0
  663. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_packing.py +0 -0
  664. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_a_wave1.py +0 -0
  665. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_a_wave2.py +0 -0
  666. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_b.py +0 -0
  667. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_c.py +0 -0
  668. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_d.py +0 -0
  669. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_e.py +0 -0
  670. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_part_f_hardening.py +0 -0
  671. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_peft_methods.py +0 -0
  672. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_peft_patches.py +0 -0
  673. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_performance.py +0 -0
  674. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_pissa_init.py +0 -0
  675. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ppo.py +0 -0
  676. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_preference_dispatcher.py +0 -0
  677. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_preference_multi.py +0 -0
  678. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_preference_multi_runtime.py +0 -0
  679. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_pretrain.py +0 -0
  680. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_profile.py +0 -0
  681. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_profiling.py +0 -0
  682. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_progress.py +0 -0
  683. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_push.py +0 -0
  684. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_qat.py +0 -0
  685. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_quality_filter.py +0 -0
  686. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_quant_check.py +0 -0
  687. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_quant_menu.py +0 -0
  688. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_quickstart.py +0 -0
  689. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_rank_pattern.py +0 -0
  690. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_recipes.py +0 -0
  691. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_recipes_v031.py +0 -0
  692. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_refusal_multilingual.py +0 -0
  693. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_registry.py +0 -0
  694. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_relora.py +0 -0
  695. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_replay.py +0 -0
  696. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_resume.py +0 -0
  697. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_review_fixes_v07133.py +0 -0
  698. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_rlvr.py +0 -0
  699. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_run_cost.py +0 -0
  700. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_runs.py +0 -0
  701. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_serve.py +0 -0
  702. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_server_generate.py +0 -0
  703. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_sglang_serve.py +0 -0
  704. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_simpo.py +0 -0
  705. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_smoke_train.py +0 -0
  706. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_speculative_decoding.py +0 -0
  707. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_sweep.py +0 -0
  708. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_synth_data_pro.py +0 -0
  709. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_templates_yaml.py +0 -0
  710. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_tensorboard.py +0 -0
  711. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_tool_calling.py +0 -0
  712. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_trace_to_pref.py +0 -0
  713. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_tracker.py +0 -0
  714. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_trainer_coverage_v035.py +0 -0
  715. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_trainer_init.py +0 -0
  716. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_training_intelligence.py +0 -0
  717. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_training_speed.py +0 -0
  718. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_trust_remote_code.py +0 -0
  719. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_tui.py +0 -0
  720. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ui.py +0 -0
  721. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ui_chat.py +0 -0
  722. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ui_config_builder.py +0 -0
  723. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ui_live_monitor.py +0 -0
  724. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_ui_metrics.py +0 -0
  725. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_unsloth.py +0 -0
  726. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0401_part_c.py +0 -0
  727. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0401_part_d.py +0 -0
  728. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0401_part_e.py +0 -0
  729. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0402_part_a.py +0 -0
  730. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0402_part_b.py +0 -0
  731. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0403_part_a.py +0 -0
  732. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0403_part_b.py +0 -0
  733. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0403_part_c.py +0 -0
  734. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0404_part_a.py +0 -0
  735. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0404_part_b.py +0 -0
  736. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0405_part_a.py +0 -0
  737. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0406_part_a.py +0 -0
  738. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0410_part_a.py +0 -0
  739. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0410_part_b.py +0 -0
  740. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0410_part_c.py +0 -0
  741. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0420.py +0 -0
  742. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0430_part_a.py +0 -0
  743. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0430_part_b.py +0 -0
  744. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0430_part_c.py +0 -0
  745. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0430_part_d.py +0 -0
  746. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0440_part_a.py +0 -0
  747. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0440_part_b.py +0 -0
  748. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0440_part_c.py +0 -0
  749. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0440_part_d.py +0 -0
  750. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0440_review_followups.py +0 -0
  751. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0450.py +0 -0
  752. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0460_part_a.py +0 -0
  753. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0460_part_b.py +0 -0
  754. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0470_part_a.py +0 -0
  755. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0470_part_b.py +0 -0
  756. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0480_part_a.py +0 -0
  757. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0480_part_b.py +0 -0
  758. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0490.py +0 -0
  759. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0500_part_a.py +0 -0
  760. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0500_part_b.py +0 -0
  761. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0500_part_c.py +0 -0
  762. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0500_part_d.py +0 -0
  763. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0500_part_e.py +0 -0
  764. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0510.py +0 -0
  765. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0520.py +0 -0
  766. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0530.py +0 -0
  767. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v05310.py +0 -0
  768. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v05311.py +0 -0
  769. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0531_109.py +0 -0
  770. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0531_139.py +0 -0
  771. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0531_142.py +0 -0
  772. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0531_82.py +0 -0
  773. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0532.py +0 -0
  774. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0533.py +0 -0
  775. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0534.py +0 -0
  776. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0535.py +0 -0
  777. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0536.py +0 -0
  778. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0537.py +0 -0
  779. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0538.py +0 -0
  780. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0539.py +0 -0
  781. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0540.py +0 -0
  782. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0550.py +0 -0
  783. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0550_followups.py +0 -0
  784. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0560.py +0 -0
  785. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0570_part_a.py +0 -0
  786. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0570_part_b.py +0 -0
  787. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0570_part_c.py +0 -0
  788. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0570_part_d.py +0 -0
  789. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0580.py +0 -0
  790. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0590.py +0 -0
  791. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_a.py +0 -0
  792. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_b.py +0 -0
  793. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_c.py +0 -0
  794. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_d.py +0 -0
  795. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_e.py +0 -0
  796. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0600_part_f.py +0 -0
  797. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0610_part_a.py +0 -0
  798. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0610_part_b.py +0 -0
  799. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0610_part_c.py +0 -0
  800. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0610_part_d.py +0 -0
  801. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0610_part_e.py +0 -0
  802. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_followups.py +0 -0
  803. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_part_a.py +0 -0
  804. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_part_b.py +0 -0
  805. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_part_c.py +0 -0
  806. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_part_d.py +0 -0
  807. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0620_part_e.py +0 -0
  808. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_followups.py +0 -0
  809. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_part_a.py +0 -0
  810. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_part_b.py +0 -0
  811. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_part_c.py +0 -0
  812. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_part_d.py +0 -0
  813. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0630_part_e.py +0 -0
  814. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0631_206.py +0 -0
  815. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_followups.py +0 -0
  816. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_a.py +0 -0
  817. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_b.py +0 -0
  818. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_c.py +0 -0
  819. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_d.py +0 -0
  820. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_e.py +0 -0
  821. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0640_part_f.py +0 -0
  822. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_followups.py +0 -0
  823. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_part_a.py +0 -0
  824. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_part_b.py +0 -0
  825. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_part_c.py +0 -0
  826. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_part_d.py +0 -0
  827. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0650_part_e.py +0 -0
  828. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_cli.py +0 -0
  829. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_followups.py +0 -0
  830. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_part_a.py +0 -0
  831. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_part_b.py +0 -0
  832. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_part_c.py +0 -0
  833. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_part_d.py +0 -0
  834. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0660_part_e.py +0 -0
  835. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_followups.py +0 -0
  836. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_a.py +0 -0
  837. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_b.py +0 -0
  838. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_c.py +0 -0
  839. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_d.py +0 -0
  840. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_e.py +0 -0
  841. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0670_part_f.py +0 -0
  842. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_followups.py +0 -0
  843. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_part_a.py +0 -0
  844. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_part_b.py +0 -0
  845. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_part_c.py +0 -0
  846. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_part_d.py +0 -0
  847. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0680_part_e.py +0 -0
  848. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0690_part_a.py +0 -0
  849. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0690_part_b.py +0 -0
  850. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0690_part_c.py +0 -0
  851. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0690_part_d.py +0 -0
  852. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0690_part_e.py +0 -0
  853. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_a.py +0 -0
  854. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_b.py +0 -0
  855. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_c.py +0 -0
  856. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_d.py +0 -0
  857. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_e.py +0 -0
  858. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0700_part_f.py +0 -0
  859. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07110.py +0 -0
  860. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07111.py +0 -0
  861. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07112.py +0 -0
  862. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07113.py +0 -0
  863. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07114.py +0 -0
  864. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07115.py +0 -0
  865. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07116.py +0 -0
  866. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07117.py +0 -0
  867. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07118.py +0 -0
  868. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07119.py +0 -0
  869. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0712.py +0 -0
  870. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07120.py +0 -0
  871. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07121.py +0 -0
  872. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07122.py +0 -0
  873. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07123.py +0 -0
  874. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07124.py +0 -0
  875. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07125.py +0 -0
  876. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07126.py +0 -0
  877. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07127.py +0 -0
  878. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07128.py +0 -0
  879. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07129.py +0 -0
  880. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0713.py +0 -0
  881. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07130.py +0 -0
  882. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07131.py +0 -0
  883. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07132.py +0 -0
  884. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07133.py +0 -0
  885. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07134.py +0 -0
  886. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07135.py +0 -0
  887. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07136.py +0 -0
  888. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07137.py +0 -0
  889. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v07138.py +0 -0
  890. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0714.py +0 -0
  891. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0715.py +0 -0
  892. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0716.py +0 -0
  893. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0717.py +0 -0
  894. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0718.py +0 -0
  895. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_v0719.py +0 -0
  896. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_validator.py +0 -0
  897. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_vision.py +0 -0
  898. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_vllm_serve.py +0 -0
  899. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_warmup.py +0 -0
  900. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_why.py +0 -0
  901. {soup_cli-0.71.38 → soup_cli-0.71.40}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,92 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.40] - 2026-07-19
16
+
17
+ **`soup reward synth`: auto-generate a deterministic reward verifier from your data.**
18
+ Point it at a JSONL of reference (gold) outputs and it infers a verifier, emits a
19
+ readable / committable `.py` reward function, and — the moat — *refuses* to emit one
20
+ that can't tell your references from auto-generated bad answers. Nothing in
21
+ TRL / Unsloth / Axolotl / OpenRLHF synthesizes a reward; every reward today is
22
+ hand-written, hand-picked, or a trained-weights artifact.
23
+
24
+ ### Added
25
+
26
+ - **`soup reward synth <references.jsonl> -o reward.py`** — deterministic verifier
27
+ synthesis. Four families, auto-detected (or pick with `--kind`): `numeric`
28
+ (last-number / `\boxed{}` / `####` extraction, exact or `--tolerance`), `json_schema`
29
+ (induced keys + types + required), `regex` (positional char-classes over
30
+ equal-length golds), `tool_call` (per-tool `required`/`allowed` argument binding).
31
+ The emitted file is self-contained and rides `load_reward_fn`'s existing `.py`
32
+ path — no new trusted-exec surface; you read, edit, commit, and diff it.
33
+ - **Mandatory calibration report** — the synthesized verifier is loaded back and run
34
+ against its own references (must accept ≥90%) and auto-perturbed negatives (must
35
+ reject). A degenerate always-accept verifier is **refused** (`exit 2`), never
36
+ silently emitted. `--plan-only` reports the induced spec without writing;
37
+ `--output-report` persists the calibration JSON.
38
+ - **Comma-separated `reward_fn` (`"accuracy,format"`)** now trains — it resolves to a
39
+ reward *ensemble* (`GRPOTrainer(reward_funcs=[...])`, and unlocks the `rm_ensemble`
40
+ reward-hack detector which needs ≥2 rewards). GRPO-only, validated at config-parse
41
+ time. Fixes a recipe (`deepseek-v3-reasoning`) that shipped exactly this and
42
+ previously crashed with `Unknown reward function` (#311).
43
+
44
+ ### Changed / Fixed
45
+
46
+ - `training.reward_fn` gains a field validator (null-byte / blank / oversize /
47
+ empty-comma-segment rejection) — the oldest arbitrary-code field was the least
48
+ guarded. Comma + `verifiable` without a `verifiable_domain` now fails at parse
49
+ time like the bare `verifiable` form.
50
+ - `envs/calculator.py` / `envs/guess_number.py` docstrings corrected: the reward is
51
+ `reward_fn: verifiable` + `verifiable_domain: math` (the bare `reward_fn='math'`
52
+ they showed was never valid).
53
+
54
+ ## [0.71.39] - 2026-07-19
55
+
56
+ **"CI for weights, not prompts": close the evidence loop.** `soup ship`'s verdict is
57
+ now something Soup can emit, commit, review, and bind to the exact model that
58
+ produced it — turning the `soup ci init` gate from "edit two numbers in a JSON file"
59
+ into a reproducible, provenance-bound check that renders on every PR.
60
+
61
+ ### Added
62
+
63
+ - **`soup ship --emit-evidence <path>`** — re-serialises the verdict into the
64
+ `--evidence` INPUT schema, so a run's output is replayable as input: feeding it
65
+ back through `--evidence` (same `--forgetting-threshold`) reproduces an identical
66
+ verdict. Output is finally input.
67
+ - **`ShipConfig` under `eval.ship` in `soup.yaml` + `soup ship --config soup.yaml`** —
68
+ commit the gate policy (`task_eval` / `task_mode` / `general_suite` /
69
+ `forgetting_threshold` / `judge_model` / `baseline`) so the verdict is reviewable in
70
+ a PR diff and reproducible. An explicit CLI flag always wins (CLI > config > default).
71
+ - **`soup ship --push owner/repo#N`** — post the verdict as a GitHub PR comment
72
+ (reuses the `soup adapters pr --push` `gh api` plumbing). Best-effort: a missing
73
+ token / `gh` failure warns but never flips the SHIP / DON'T-SHIP exit code.
74
+ - **Evidence provenance + staleness gate.** With `--emit-evidence`, `--config` STAMPS
75
+ a `provenance` block (`config_sha` — a semantic, order-insensitive recipe hash — plus
76
+ `base_model` and a best-effort `data_sha`) onto the evidence. With `--evidence`
77
+ alone, `--config` GATES: it refuses (exit 3) evidence whose `config_sha` drifted
78
+ from the committed config, so a PR that changed `soup.yaml` but forgot to recompute
79
+ its evidence is caught. The gate policy (`eval.ship`) is EXCLUDED from the hash, so
80
+ tuning `forgetting_threshold` never falsely invalidates evidence about an unchanged
81
+ model.
82
+ - **`soup ci init --config <soup.yaml>`** — binds the generated gate's `soup ship`
83
+ step to the committed config (provenance/staleness enforcement in CI).
84
+
85
+ ### Changed
86
+
87
+ - **Exit-code note:** `soup ship --config` usage / staleness errors are exit `3`
88
+ (usage), preserving `0 = SHIP`, `2 = DON'T SHIP`, `1 = runtime` from v0.71.38.
89
+
90
+ ### Security
91
+
92
+ - `provenance.config_sha` read from untrusted evidence is shape-validated as a hex
93
+ digest before being echoed (a raw value could smuggle terminal ESC bytes past
94
+ `rich.markup.escape`).
95
+ - `provenance.data_sha` hashes the training file through an `O_NOFOLLOW` fd with a
96
+ symlink-rejecting containment check and an 8 GiB cap (was an unguarded `hash_file`).
97
+ - `soup ci init`'s path validation now rejects `#` and the YAML 1.1 line breaks
98
+ (NEL / LS / PS), closing a plain-scalar comment-truncation of the generated `run:`
99
+ step (also hardens the pre-existing `--data` / `--suite` / `--evidence` args).
100
+
15
101
  ## [0.71.38] - 2026-07-17
16
102
 
17
103
  **`soup ship`'s regression leg now has teeth.** Leg 2 (the catastrophic-forgetting
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (316 files, 16330 tests)
123
+ tests/ - Test suite (318 files, 16490 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.38
3
+ Version: 0.71.40
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,41 +193,47 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.38The gate grows teeth.** `soup ship` answers the one question that matters after a fine-tune — *did my task improve WITHOUT silently breaking everything else?* This release makes the "without breaking everything else" half real.
197
-
198
- - **A gate that actually catches regressions.** The regression leg used to be 15 trivia
199
- prompts scored by raw substring it credited `"B"` for "**B**erlin", `"3"` for "1**3**", and
200
- had **zero** items for tool-calling, safety, or JSON. Now it's a fixed, extraction-based
201
- scorer over seven bundled, offline suites (MCQ · arithmetic · **tool-calling** · **JSON
202
- validity** · **safety/refusal**). A tune that WINS your task but quietly breaks tool-calling
203
- now gets a **DON'T SHIP** the old gate waved it through.
204
- - **Zero new dependencies, no network.** Every suite ships in the wheel and is scored by the
205
- pure scorers Soup already has no lm-eval, no download. `soup ci init`'s core-only gate keeps
206
- working.
207
- - **Distinct exit codes for CI.** Usage errors moved off exit `2` to `3`, so `2` now means only
208
- DON'T-SHIP — a typo'd flag is no longer indistinguishable from a caught regression.
209
- - **Breaking, on purpose.** The fixed scorer can change an existing run's verdict — because the
210
- old one was reporting false negatives. Recompute any committed `--baseline`.
196
+ **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
197
+
198
+ - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
199
+ exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
200
+ (per-tool `required`/`allowed` argument binding a call can't borrow another tool's keys).
201
+ - **A calibration report is the moat.** The verifier is loaded back and run against its own references
202
+ (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
203
+ is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
204
+ - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path you read,
205
+ edit, commit, and diff it like any other reward.
206
+ - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
207
+ the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
211
208
 
212
209
  ```bash
213
- # leg 1 (task win) AND leg 2 (no regression on the bundled suite) -> one verdict
214
- soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
215
- # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
210
+ # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
211
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
216
212
 
217
- soup ship --evidence scores.json # offline verdict from pre-computed scores
213
+ # then train against the reward you just generated
214
+ # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
218
215
  ```
219
216
 
220
217
  <details>
221
- <summary>Previous release — v0.71.36, Data Moat II (semantic dedup · topics · canaries · replay)</summary>
218
+ <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
219
+
220
+ `soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
221
+ run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
222
+ reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).
223
+ `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
224
+
225
+ </details>
226
+
227
+ <details>
228
+ <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
222
229
 
223
- `soup data dedup --semantic` dedups by meaning; `soup data topics` shows a coverage table;
224
- `soup data canary insert|check` proves whether a model memorized inserted secrets (exit 2 on a
225
- leak); `soup train --replay old.jsonl` interleaves old data so a new task doesn't erase it.
230
+ `soup ship`'s regression leg became real: a fixed, extraction-based scorer over seven bundled,
231
+ offline suites (MCQ · arithmetic · tool-calling · JSON validity · safety/refusal). A tune that
232
+ wins your task but quietly breaks tool-calling now gets a **DON'T SHIP**. Zero new deps.
226
233
 
227
234
  ```bash
228
- soup data topics train.jsonl
229
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
230
- soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
235
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
236
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
231
237
  ```
232
238
 
233
239
  </details>
@@ -49,41 +49,47 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.38The gate grows teeth.** `soup ship` answers the one question that matters after a fine-tune — *did my task improve WITHOUT silently breaking everything else?* This release makes the "without breaking everything else" half real.
53
-
54
- - **A gate that actually catches regressions.** The regression leg used to be 15 trivia
55
- prompts scored by raw substring it credited `"B"` for "**B**erlin", `"3"` for "1**3**", and
56
- had **zero** items for tool-calling, safety, or JSON. Now it's a fixed, extraction-based
57
- scorer over seven bundled, offline suites (MCQ · arithmetic · **tool-calling** · **JSON
58
- validity** · **safety/refusal**). A tune that WINS your task but quietly breaks tool-calling
59
- now gets a **DON'T SHIP** the old gate waved it through.
60
- - **Zero new dependencies, no network.** Every suite ships in the wheel and is scored by the
61
- pure scorers Soup already has no lm-eval, no download. `soup ci init`'s core-only gate keeps
62
- working.
63
- - **Distinct exit codes for CI.** Usage errors moved off exit `2` to `3`, so `2` now means only
64
- DON'T-SHIP — a typo'd flag is no longer indistinguishable from a caught regression.
65
- - **Breaking, on purpose.** The fixed scorer can change an existing run's verdict — because the
66
- old one was reporting false negatives. Recompute any committed `--baseline`.
52
+ **v0.71.40`soup reward synth`: generate a reward verifier from your data.** Point it at a JSONL of reference (gold) outputs and it infers a deterministic verifier, writes a readable / committable `.py` reward function, and the part nobody else does — *refuses* to emit one that can't tell your references from bad answers. Nothing in TRL / Unsloth / Axolotl synthesizes a reward.
53
+
54
+ - **Four families, auto-detected** (or pick with `--kind`): `numeric` (`\boxed{}` / `####` / last-number,
55
+ exact or `--tolerance`), `json_schema` (induced keys + types + required), `regex`, and `tool_call`
56
+ (per-tool `required`/`allowed` argument binding a call can't borrow another tool's keys).
57
+ - **A calibration report is the moat.** The verifier is loaded back and run against its own references
58
+ (must accept ≥ 90%) and auto-generated bad answers (must reject). A degenerate always-accept verifier
59
+ is **refused** (exit 2), never silently shipped. `--plan-only` previews; `--output-report` saves the JSON.
60
+ - **No new exec surface.** The emitted file rides the existing `reward_fn: reward.py` path you read,
61
+ edit, commit, and diff it like any other reward.
62
+ - **Reward ensembles now train.** `reward_fn: "accuracy,format"` loads as multiple rewards (and unlocks
63
+ the `rm_ensemble` reward-hack detector) a recipe that shipped exactly this used to crash. (#311)
67
64
 
68
65
  ```bash
69
- # leg 1 (task win) AND leg 2 (no regression on the bundled suite) -> one verdict
70
- soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
71
- # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
66
+ # synth a verifier from reference answers, calibrate it, keep it only if it discriminates
67
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
72
68
 
73
- soup ship --evidence scores.json # offline verdict from pre-computed scores
69
+ # then train against the reward you just generated
70
+ # training: { reward_fn: reward.py } (or an ensemble: reward_fn: "accuracy,format")
74
71
  ```
75
72
 
76
73
  <details>
77
- <summary>Previous release — v0.71.36, Data Moat II (semantic dedup · topics · canaries · replay)</summary>
74
+ <summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>
78
75
 
79
- `soup data dedup --semantic` dedups by meaning; `soup data topics` shows a coverage table;
80
- `soup data canary insert|check` proves whether a model memorized inserted secrets (exit 2 on a
81
- leak); `soup train --replay old.jsonl` interleaves old data so a new task doesn't erase it.
76
+ `soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a
77
+ run replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy
78
+ reviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence exit 3).
79
+ `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.
80
+
81
+ </details>
82
+
83
+ <details>
84
+ <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
85
+
86
+ `soup ship`'s regression leg became real: a fixed, extraction-based scorer over seven bundled,
87
+ offline suites (MCQ · arithmetic · tool-calling · JSON validity · safety/refusal). A tune that
88
+ wins your task but quietly breaks tool-calling now gets a **DON'T SHIP**. Zero new deps.
82
89
 
83
90
  ```bash
84
- soup data topics train.jsonl
85
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
86
- soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
91
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
92
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
87
93
  ```
88
94
 
89
95
  </details>
@@ -166,9 +166,12 @@ soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via
166
166
  soup ship ... --task-mode pairwise --judge-model ollama://llama3.1 Leg-1 via swap-debiased judge win-rate (base=0.5) (v0.71.31)
167
167
  soup ship ... # leg-2 default = 7 bundled offline suites (MCQ/arithmetic + tool_call/format_json/safety, extraction scorer, ~40 items each) (v0.71.38)
168
168
  soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 override + recorded base scores
169
+ soup ship ... --emit-evidence ev.json Re-serialise the scores as replayable --evidence input (output-is-input, #312) (v0.71.39)
170
+ soup ship ... --config soup.yaml Read eval.ship gate defaults; --evidence GATES on provenance, --emit-evidence STAMPS it (v0.71.39)
171
+ soup ship ... --push owner/repo#N Post the verdict as a GitHub PR comment (best-effort; never flips the exit code) (v0.71.39)
169
172
  soup card <registry-id> -o MODELCARD.md HF model card from a registry entry: training config, evals, hashes, lineage, artifacts (v0.71.35)
170
173
  soup push --model ./out --repo you/m --card <registry-id> Upload that registry-driven card as the README (HF only) (v0.71.35)
171
- soup ci init [--data d.jsonl --suite s.yaml --evidence ev.json] [--branch main --python 3.11] [--force] Write .github/workflows/soup-gate.yml: data validate -> expect -> ship gate on every PR (v0.71.35)
174
+ soup ci init [--data d.jsonl --suite s.yaml --evidence ev.json] [--config soup.yaml] [--branch main --python 3.11] [--force] Write .github/workflows/soup-gate.yml: data validate -> expect -> ship gate on every PR (v0.71.35); --config binds the gate to a committed config so it refuses stale evidence (v0.71.39)
172
175
  soup mcp serve MCP server over stdio (drive Soup from Claude Code / Cursor / Cline; requires [mcp] extra) (v0.71.28)
173
176
  soup mcp serve --allow-mutating Also expose plan-only train_start / export tools (never execute) (v0.71.28)
174
177
  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)
@@ -179,6 +182,10 @@ soup draft measure ... --min-acceptance 0.6 -o report.json Exit 2 below the flo
179
182
  soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/ Distil a DENSE speculative-decoding draft + register it (v0.71.33)
180
183
  soup draft distill ... --steps N --device cpu --force --plan-only Training budget / device / overwrite -o / render the config only
181
184
  soup draft list List local drafts that `soup serve --auto-spec` will pick up (v0.71.33)
185
+ soup reward synth refs.jsonl -o reward.py Synthesize a deterministic reward verifier from gold outputs (v0.71.40)
186
+ soup reward synth ... --kind numeric|json_schema|regex|tool_call Force a verifier family (default: auto-detect)
187
+ soup reward synth ... --plan-only Report the induced spec + calibration plan; write nothing
188
+ soup reward synth ... --output-report r.json --min-discrimination 0.5 Save the calibration JSON / set the refusal threshold (exit 0 emit / 2 refuse / 1 error)
182
189
  soup tui Full-screen Textual dashboard (requires [tui] extra)
183
190
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
184
191
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -378,6 +378,36 @@ Exit codes (v0.71.38): **0 = SHIP · 2 = DON'T SHIP · 3 = usage/flag error · 1
378
378
  lives in `soup_cli.utils.ship_verdict` (`decide_ship` is a pure function — the whole truth table
379
379
  is CPU-testable); the bundled suites live in `soup_cli.eval.gate_suites`.
380
380
 
381
+ ### Closing the evidence loop (v0.71.39)
382
+
383
+ The verdict is now emittable, committable, and provenance-bound so a fine-tuning gate runs on
384
+ every PR instead of relying on a hand-edited JSON file.
385
+
386
+ - **`--emit-evidence <path>`** re-serialises the scores into the `--evidence` INPUT schema, so a
387
+ run's output is replayable as input — feeding it back through `--evidence` (same threshold)
388
+ reproduces an identical verdict.
389
+ - **`--config soup.yaml`** reads a committed `eval.ship` block for the gate defaults
390
+ (`task_eval` / `task_mode` / `general_suite` / `forgetting_threshold` / `judge_model` /
391
+ `baseline`); an explicit CLI flag always wins. This makes the gate reviewable in a PR diff.
392
+ - **Provenance + staleness.** With `--emit-evidence`, `--config` STAMPS a `provenance` block
393
+ (`config_sha` — a semantic, order-insensitive recipe hash that EXCLUDES the `eval.ship` gate
394
+ policy, so tuning the threshold never invalidates evidence — plus `base_model` and a
395
+ best-effort `data_sha`). With `--evidence` alone, `--config` GATES: it refuses (exit 3)
396
+ evidence whose `config_sha` drifted from the committed config.
397
+ - **`--push owner/repo#N`** posts the verdict as a GitHub PR comment (best-effort — a missing
398
+ token or `gh` failure warns but never flips the SHIP / DON'T-SHIP exit code).
399
+
400
+ ```bash
401
+ # Producer (train job): compute or stamp scores, bound to the committed recipe
402
+ soup ship --evidence scores.json --config soup.yaml --emit-evidence ship_evidence.json
403
+
404
+ # Gate (PR CI): refuse evidence that doesn't match the committed config, comment the verdict
405
+ soup ship --evidence ship_evidence.json --config soup.yaml --push owner/repo#42
406
+ ```
407
+
408
+ `soup ci init --config soup.yaml` binds the generated workflow's ship step to the committed
409
+ config, so the whole loop runs in CI (see [commands.md](commands.md)).
410
+
381
411
 
382
412
  ## NLG Evaluation Metrics (BLEU + ROUGE)
383
413
 
@@ -866,6 +866,37 @@ training:
866
866
  reward_fn: ./my_reward.py
867
867
  ```
868
868
 
869
+ **Reward ensembles** — list several rewards, comma-separated, and they combine (GRPO only).
870
+ This also unlocks the `rm_ensemble` reward-hack detector, which needs ≥ 2 rewards:
871
+ ```yaml
872
+ training:
873
+ reward_fn: "accuracy,format" # both are scored every step
874
+ ```
875
+
876
+ ### Synthesize a verifier from your data (`soup reward synth`)
877
+
878
+ Don't hand-write a verifier — generate one from reference (gold) outputs. Soup infers a
879
+ *deterministic* verifier (numeric / JSON-schema / regex / tool-call), writes a readable, editable
880
+ `.py`, and **refuses to emit** one that can't tell your references from auto-generated bad answers
881
+ (the mandatory calibration report). The emitted file is a normal `reward_fn: reward.py`.
882
+
883
+ ```bash
884
+ # infer + calibrate + emit (exit 0 kept, 2 refused, 1 error)
885
+ soup reward synth references.jsonl -o reward.py --output-report calib.json
886
+
887
+ # preview the induced spec without writing anything
888
+ soup reward synth references.jsonl --plan-only
889
+
890
+ # force a family instead of auto-detecting
891
+ soup reward synth answers.jsonl -o reward.py --kind numeric --tolerance 1e-6
892
+ ```
893
+
894
+ References are a JSONL where each row's gold answer is in an `answer` field (override with
895
+ `--field`) or the last assistant turn of a `messages` list. `--min-discrimination` sets how
896
+ strongly the verifier must separate references from perturbed negatives before it's emitted.
897
+ v1 is deterministic families only — a `\boxed{}`/`####` marker helps the numeric verifier, and
898
+ completions are prompted to mark their answer (standard RLVR practice).
899
+
869
900
  ### Verifiable Rewards (RLVR)
870
901
 
871
902
  Use `reward_fn: verifiable` with a `verifiable_domain` for deterministic, math-checkable rewards — no judge model, no heuristics. Great for GRPO on math, code, or structured-output tasks.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.38"
7
+ version = "0.71.40"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.38"
3
+ __version__ = "0.71.40"
@@ -563,6 +563,18 @@ app.add_typer(
563
563
  ),
564
564
  )
565
565
 
566
+ # v0.71.40 — `soup reward synth` auto-generate a deterministic verifier.
567
+ from soup_cli.commands import reward as _reward_cmd # noqa: E402
568
+
569
+ app.add_typer(
570
+ _reward_cmd.app,
571
+ name="reward",
572
+ help=(
573
+ "Synthesize a deterministic reward verifier from reference outputs, with "
574
+ "a calibration report that refuses degenerate verifiers (v0.71.40)."
575
+ ),
576
+ )
577
+
566
578
 
567
579
  def _rewrite_advise_argv(argv: list) -> list:
568
580
  """Inject `run` between `advise` and a non-subcommand first argument.
@@ -6,6 +6,8 @@
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ from typing import Optional
10
+
9
11
  import typer
10
12
  from rich.console import Console
11
13
  from rich.markup import escape
@@ -33,6 +35,10 @@ def init(
33
35
  "3.11", "--python", help="Python version for the CI runner (e.g. 3.11)"
34
36
  ),
35
37
  branch: str = typer.Option("main", "--branch", help="Branch the workflow triggers on"),
38
+ config: Optional[str] = typer.Option(
39
+ None, "--config",
40
+ help="Bind the ship gate to a committed soup.yaml (refuses stale evidence)",
41
+ ),
36
42
  output: str = typer.Option(
37
43
  ".github/workflows/soup-gate.yml", "-o", "--output", help="Workflow output path"
38
44
  ),
@@ -48,6 +54,7 @@ def init(
48
54
  branch=branch,
49
55
  output_path=output,
50
56
  overwrite=force,
57
+ config_path=config,
51
58
  )
52
59
  except (ValueError, TypeError, OSError) as exc:
53
60
  console.print(f"[red]{escape(str(exc))}[/]")