soup-cli 0.71.37__tar.gz → 0.71.39__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 (900) hide show
  1. {soup_cli-0.71.37 → soup_cli-0.71.39}/CHANGELOG.md +89 -0
  2. {soup_cli-0.71.37 → soup_cli-0.71.39}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.37 → soup_cli-0.71.39}/PKG-INFO +32 -27
  4. {soup_cli-0.71.37 → soup_cli-0.71.39}/README.md +31 -26
  5. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/commands.md +7 -3
  6. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/evaluation.md +52 -5
  7. {soup_cli-0.71.37 → soup_cli-0.71.39}/pyproject.toml +2 -1
  8. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/__init__.py +1 -1
  9. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ci.py +7 -0
  10. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ship.py +394 -85
  11. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/config/schema.py +41 -0
  12. soup_cli-0.71.39/src/soup_cli/data/_fixtures/gate/format_json.jsonl +40 -0
  13. soup_cli-0.71.39/src/soup_cli/data/_fixtures/gate/safety.jsonl +40 -0
  14. soup_cli-0.71.39/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +40 -0
  15. soup_cli-0.71.39/src/soup_cli/eval/forgetting.py +350 -0
  16. soup_cli-0.71.39/src/soup_cli/eval/gate_suites.py +234 -0
  17. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ci_workflow.py +42 -4
  18. soup_cli-0.71.39/src/soup_cli/utils/diagnose/__init__.py +57 -0
  19. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ship_verdict.py +78 -1
  20. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_a_wave1.py +7 -3
  21. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_training_intelligence.py +6 -3
  22. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07125.py +11 -9
  23. soup_cli-0.71.39/tests/test_v07138.py +598 -0
  24. soup_cli-0.71.39/tests/test_v07139.py +802 -0
  25. soup_cli-0.71.37/src/soup_cli/eval/forgetting.py +0 -121
  26. soup_cli-0.71.37/src/soup_cli/utils/diagnose/__init__.py +0 -42
  27. {soup_cli-0.71.37 → soup_cli-0.71.39}/.dockerignore +0 -0
  28. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/FUNDING.yml +0 -0
  29. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  30. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  31. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  32. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/pull_request_template.md +0 -0
  33. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/workflows/ci.yml +0 -0
  34. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/workflows/docker.yml +0 -0
  35. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/workflows/publish.yml +0 -0
  36. {soup_cli-0.71.37 → soup_cli-0.71.39}/.github/workflows/recipe-validation.yml +0 -0
  37. {soup_cli-0.71.37 → soup_cli-0.71.39}/.gitignore +0 -0
  38. {soup_cli-0.71.37 → soup_cli-0.71.39}/.mailmap +0 -0
  39. {soup_cli-0.71.37 → soup_cli-0.71.39}/.pre-commit-config.yaml +0 -0
  40. {soup_cli-0.71.37 → soup_cli-0.71.39}/AGENTS.md +0 -0
  41. {soup_cli-0.71.37 → soup_cli-0.71.39}/CODEOWNERS +0 -0
  42. {soup_cli-0.71.37 → soup_cli-0.71.39}/CODE_OF_CONDUCT.md +0 -0
  43. {soup_cli-0.71.37 → soup_cli-0.71.39}/CONTRIBUTORS.md +0 -0
  44. {soup_cli-0.71.37 → soup_cli-0.71.39}/Dockerfile +0 -0
  45. {soup_cli-0.71.37 → soup_cli-0.71.39}/LICENSE +0 -0
  46. {soup_cli-0.71.37 → soup_cli-0.71.39}/NOTICE +0 -0
  47. {soup_cli-0.71.37 → soup_cli-0.71.39}/SECURITY.md +0 -0
  48. {soup_cli-0.71.37 → soup_cli-0.71.39}/docker-compose.yml +0 -0
  49. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/README.md +0 -0
  50. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/adapters-and-governance.md +0 -0
  51. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/backends-and-ops.md +0 -0
  52. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/compliance.md +0 -0
  53. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/data.md +0 -0
  54. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/models.md +0 -0
  55. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/peft-and-efficiency.md +0 -0
  56. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/performance-and-quantization.md +0 -0
  57. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/serving-and-export.md +0 -0
  58. {soup_cli-0.71.37 → soup_cli-0.71.39}/docs/training.md +0 -0
  59. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/README.md +0 -0
  60. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/dpo_chat.yaml +0 -0
  61. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/dpo_example.yaml +0 -0
  62. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/grpo_reasoning.yaml +0 -0
  63. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/rlhf_step1_sft.yaml +0 -0
  64. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/rlhf_step2_reward.yaml +0 -0
  65. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  66. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/sft_basic.yaml +0 -0
  67. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/configs/vision_llama.yaml +0 -0
  68. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/data/alpaca_tiny.jsonl +0 -0
  69. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/data/chat_preferences.jsonl +0 -0
  70. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/data/dpo_sample.jsonl +0 -0
  71. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/data/reasoning_math.jsonl +0 -0
  72. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/reward_hacking/rewards.py +0 -0
  73. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/synthetic_workflow.md +0 -0
  74. {soup_cli-0.71.37 → soup_cli-0.71.39}/examples/synthetic_workflow.yaml +0 -0
  75. {soup_cli-0.71.37 → soup_cli-0.71.39}/soup.png +0 -0
  76. {soup_cli-0.71.37 → soup_cli-0.71.39}/soup_logo_svg.svg +0 -0
  77. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/__main__.py +0 -0
  78. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/autopilot/__init__.py +0 -0
  79. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/autopilot/analyzer.py +0 -0
  80. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/autopilot/decisions.py +0 -0
  81. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/autopilot/generate_config.py +0 -0
  82. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/__init__.py +0 -0
  83. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/pack.py +0 -0
  84. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/publish.py +0 -0
  85. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/run.py +0 -0
  86. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/schema.py +0 -0
  87. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/unpack.py +0 -0
  88. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cans/verify.py +0 -0
  89. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cli.py +0 -0
  90. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cloud/__init__.py +0 -0
  91. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/cloud/modal.py +0 -0
  92. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/__init__.py +0 -0
  93. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/_eval_v0550.py +0 -0
  94. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/_eval_v0610.py +0 -0
  95. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/_eval_v0650.py +0 -0
  96. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/_eval_v07110.py +0 -0
  97. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/_webhook_cli.py +0 -0
  98. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ab.py +0 -0
  99. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/active_sample.py +0 -0
  100. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/adapters.py +0 -0
  101. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/advise.py +0 -0
  102. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/agent.py +0 -0
  103. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/airgap.py +0 -0
  104. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/apple_adapter.py +0 -0
  105. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/attest.py +0 -0
  106. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/audit_log.py +0 -0
  107. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/autopilot.py +0 -0
  108. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/bench.py +0 -0
  109. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/bom.py +0 -0
  110. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/build.py +0 -0
  111. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/can.py +0 -0
  112. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/card.py +0 -0
  113. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/chat.py +0 -0
  114. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/compile_cmd.py +0 -0
  115. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/compile_tools.py +0 -0
  116. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/completions.py +0 -0
  117. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/cost.py +0 -0
  118. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data.py +0 -0
  119. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_canary.py +0 -0
  120. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_doctor.py +0 -0
  121. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_forge.py +0 -0
  122. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_mix.py +0 -0
  123. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_score.py +0 -0
  124. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/data_topics.py +0 -0
  125. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  126. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/deploy.py +0 -0
  127. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/diagnose.py +0 -0
  128. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/diff.py +0 -0
  129. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/distill_prompt.py +0 -0
  130. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/doctor.py +0 -0
  131. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/draft.py +0 -0
  132. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/drift_alarm.py +0 -0
  133. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/edit.py +0 -0
  134. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/env.py +0 -0
  135. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/eval.py +0 -0
  136. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/expect.py +0 -0
  137. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/export.py +0 -0
  138. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/fetch.py +0 -0
  139. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/generate.py +0 -0
  140. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/history.py +0 -0
  141. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/infer.py +0 -0
  142. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ingest.py +0 -0
  143. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/init.py +0 -0
  144. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/iterative_dpo.py +0 -0
  145. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/license_advisor.py +0 -0
  146. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/llama.py +0 -0
  147. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/local_rl.py +0 -0
  148. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/lock.py +0 -0
  149. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/loop.py +0 -0
  150. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/mcp.py +0 -0
  151. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/merge.py +0 -0
  152. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  153. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/migrate.py +0 -0
  154. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/monitor.py +0 -0
  155. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/plan.py +0 -0
  156. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/plugins.py +0 -0
  157. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/probe.py +0 -0
  158. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/profile.py +0 -0
  159. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/prune_prompt.py +0 -0
  160. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/push.py +0 -0
  161. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/quantize.py +0 -0
  162. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/quickstart.py +0 -0
  163. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ra_dit.py +0 -0
  164. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/recipes.py +0 -0
  165. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/registry.py +0 -0
  166. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/runs.py +0 -0
  167. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/serve.py +0 -0
  168. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/shrink.py +0 -0
  169. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/spectrum.py +0 -0
  170. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/steer.py +0 -0
  171. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/sweep.py +0 -0
  172. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/tokenizer.py +0 -0
  173. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/train.py +0 -0
  174. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/tui.py +0 -0
  175. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/tunability.py +0 -0
  176. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/ui.py +0 -0
  177. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/commands/why.py +0 -0
  178. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/config/__init__.py +0 -0
  179. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/config/loader.py +0 -0
  180. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/__init__.py +0 -0
  181. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  182. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  183. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  184. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  185. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  186. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  187. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  188. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  189. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  190. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  191. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  192. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  193. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/augment.py +0 -0
  194. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/chat_templates.py +0 -0
  195. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/collators.py +0 -0
  196. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/formats.py +0 -0
  197. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/loader.py +0 -0
  198. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/loss_mask.py +0 -0
  199. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/providers/__init__.py +0 -0
  200. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/providers/_utils.py +0 -0
  201. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/providers/anthropic.py +0 -0
  202. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/providers/ollama.py +0 -0
  203. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/providers/vllm.py +0 -0
  204. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/sft_format.py +0 -0
  205. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/__init__.py +0 -0
  206. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/code.py +0 -0
  207. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/conversation.py +0 -0
  208. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/preference.py +0 -0
  209. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/qa.py +0 -0
  210. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/reasoning.py +0 -0
  211. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/tool_calling.py +0 -0
  212. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/templates/verifiable.py +0 -0
  213. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/traces/__init__.py +0 -0
  214. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/traces/pair_builder.py +0 -0
  215. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/traces/parsers.py +0 -0
  216. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/traces/quality.py +0 -0
  217. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/data/validator.py +0 -0
  218. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/envs/__init__.py +0 -0
  219. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/envs/_common.py +0 -0
  220. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/envs/calculator.py +0 -0
  221. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/envs/guess_number.py +0 -0
  222. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/envs/retrieval_qa.py +0 -0
  223. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/__init__.py +0 -0
  224. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/arena.py +0 -0
  225. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  226. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/calibrate.py +0 -0
  227. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  228. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/custom.py +0 -0
  229. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/gate.py +0 -0
  230. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/human.py +0 -0
  231. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/judge.py +0 -0
  232. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/leaderboard.py +0 -0
  233. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/eval/quant_check.py +0 -0
  234. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/experiment/__init__.py +0 -0
  235. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/experiment/tracker.py +0 -0
  236. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/mcp_server/__init__.py +0 -0
  237. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/mcp_server/registry.py +0 -0
  238. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/mcp_server/server.py +0 -0
  239. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/migrate/__init__.py +0 -0
  240. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/migrate/axolotl.py +0 -0
  241. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/migrate/common.py +0 -0
  242. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/migrate/llamafactory.py +0 -0
  243. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/migrate/unsloth.py +0 -0
  244. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/__init__.py +0 -0
  245. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/callback.py +0 -0
  246. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  247. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/display.py +0 -0
  248. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  249. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/hf_push.py +0 -0
  250. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  251. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/monitoring/trace_logger.py +0 -0
  252. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/plugins/__init__.py +0 -0
  253. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/py.typed +0 -0
  254. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/recipes/__init__.py +0 -0
  255. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/recipes/catalog.py +0 -0
  256. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/registry/__init__.py +0 -0
  257. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/registry/attach.py +0 -0
  258. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/registry/diff.py +0 -0
  259. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/registry/hashing.py +0 -0
  260. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/registry/store.py +0 -0
  261. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/__init__.py +0 -0
  262. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/audio.yaml +0 -0
  263. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/bco.yaml +0 -0
  264. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/chat.yaml +0 -0
  265. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/code.yaml +0 -0
  266. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/embedding.yaml +0 -0
  267. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  268. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  269. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  270. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  271. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/hipaa.yaml +0 -0
  272. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/ipo.yaml +0 -0
  273. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/kto.yaml +0 -0
  274. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/longcontext.yaml +0 -0
  275. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/manifest.json +0 -0
  276. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/medical.yaml +0 -0
  277. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/moe.yaml +0 -0
  278. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/orpo.yaml +0 -0
  279. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/pretrain.yaml +0 -0
  280. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/reasoning.yaml +0 -0
  281. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/rlhf.yaml +0 -0
  282. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/simpo.yaml +0 -0
  283. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/soc2.yaml +0 -0
  284. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  285. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/tool-calling.yaml +0 -0
  286. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/templates/vision.yaml +0 -0
  287. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/__init__.py +0 -0
  288. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/asr.py +0 -0
  289. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/bco.py +0 -0
  290. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/bitnet.py +0 -0
  291. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/classifier.py +0 -0
  292. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/distill.py +0 -0
  293. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/dpo.py +0 -0
  294. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/embedding.py +0 -0
  295. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/grpo.py +0 -0
  296. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/ipo.py +0 -0
  297. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/kto.py +0 -0
  298. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  299. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  300. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/mlx_routing.py +0 -0
  301. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/mlx_sft.py +0 -0
  302. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/mole_routing.py +0 -0
  303. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/online_dpo.py +0 -0
  304. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/orpo.py +0 -0
  305. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/ppo.py +0 -0
  306. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/preference.py +0 -0
  307. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/pretrain.py +0 -0
  308. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/prm.py +0 -0
  309. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/raft.py +0 -0
  310. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/reward_model.py +0 -0
  311. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/rewards.py +0 -0
  312. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/sft.py +0 -0
  313. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/simpo.py +0 -0
  314. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/tts.py +0 -0
  315. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/trainer/unlearn.py +0 -0
  316. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/tui_app.py +0 -0
  317. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/__init__.py +0 -0
  318. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/app.py +0 -0
  319. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/plugins/__init__.py +0 -0
  320. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/static/app.js +0 -0
  321. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/static/index.html +0 -0
  322. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/static/logo.png +0 -0
  323. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/static/logo.svg +0 -0
  324. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/ui/static/style.css +0 -0
  325. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/__init__.py +0 -0
  326. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/_eval_text.py +0 -0
  327. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ab_test.py +0 -0
  328. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/activation_offload.py +0 -0
  329. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/active_sampler.py +0 -0
  330. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  331. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_bisect.py +0 -0
  332. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_branch.py +0 -0
  333. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_diff.py +0 -0
  334. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_fuse.py +0 -0
  335. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_merge.py +0 -0
  336. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_pr.py +0 -0
  337. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_scan.py +0 -0
  338. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/adapter_sign.py +0 -0
  339. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/advanced_precision.py +0 -0
  340. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/advise.py +0 -0
  341. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/advise_history.py +0 -0
  342. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/agent_forge.py +0 -0
  343. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/agent_rollout.py +0 -0
  344. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/agent_sandbox.py +0 -0
  345. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/airgap_bundle.py +0 -0
  346. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/annex_xi.py +0 -0
  347. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/anthropic_messages.py +0 -0
  348. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/apple_adapter.py +0 -0
  349. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/asr_metrics.py +0 -0
  350. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/attest.py +0 -0
  351. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/audit_log.py +0 -0
  352. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/auto_quant.py +0 -0
  353. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/backend_detect.py +0 -0
  354. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/batch_probe.py +0 -0
  355. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/behavior_battery.py +0 -0
  356. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/best_of_n.py +0 -0
  357. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/bitnet.py +0 -0
  358. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/blame.py +0 -0
  359. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/block_expansion.py +0 -0
  360. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/bom.py +0 -0
  361. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/brain_rot.py +0 -0
  362. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  363. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/build_dag.py +0 -0
  364. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/canary.py +0 -0
  365. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/canary_discovery.py +0 -0
  366. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/canary_router.py +0 -0
  367. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/capability_suite.py +0 -0
  368. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/checklist_dsl.py +0 -0
  369. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  370. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/citation_faithful.py +0 -0
  371. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/classifier.py +0 -0
  372. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/cmaes_merge.py +0 -0
  373. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/compile_tools.py +0 -0
  374. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/completions.py +0 -0
  375. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/constants.py +0 -0
  376. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/convergence.py +0 -0
  377. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/crash.py +0 -0
  378. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  379. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/curriculum.py +0 -0
  380. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  381. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/cut_ce.py +0 -0
  382. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_doctor.py +0 -0
  383. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_forge.py +0 -0
  384. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_lint.py +0 -0
  385. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_mix.py +0 -0
  386. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_pipeline.py +0 -0
  387. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/data_score.py +0 -0
  388. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/deepspeed.py +0 -0
  389. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  390. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/demo_bundles.py +0 -0
  391. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  392. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/deploy_measure.py +0 -0
  393. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/_common.py +0 -0
  394. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/badge.py +0 -0
  395. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/citation.py +0 -0
  396. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  397. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  398. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/format.py +0 -0
  399. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/live.py +0 -0
  400. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  401. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  402. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  403. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/report.py +0 -0
  404. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/diagnose/runner.py +0 -0
  405. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/distill.py +0 -0
  406. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/dpo_variants.py +0 -0
  407. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/draft.py +0 -0
  408. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/drift_alarm.py +0 -0
  409. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  410. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/echo_trap.py +0 -0
  411. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/edit_diff.py +0 -0
  412. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/edit_governor.py +0 -0
  413. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/edit_kernels.py +0 -0
  414. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/embed.py +0 -0
  415. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/encoding.py +0 -0
  416. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/energy.py +0 -0
  417. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/env_lock.py +0 -0
  418. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/errors.py +0 -0
  419. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/eval_design.py +0 -0
  420. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  421. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  422. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/evolve.py +0 -0
  423. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/expectations.py +0 -0
  424. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/fetch_examples.py +0 -0
  425. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/flash_attn.py +0 -0
  426. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/fp8.py +0 -0
  427. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/freeze.py +0 -0
  428. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/fsdp.py +0 -0
  429. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  430. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/galore.py +0 -0
  431. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/gguf_quant.py +0 -0
  432. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/gpu.py +0 -0
  433. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/gpu_monitor.py +0 -0
  434. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/grace_codebook.py +0 -0
  435. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/graceful_save.py +0 -0
  436. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/grad_accum.py +0 -0
  437. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  438. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/grpo_long_context.py +0 -0
  439. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/grpo_variants.py +0 -0
  440. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/hardware_fit.py +0 -0
  441. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/harm_probe.py +0 -0
  442. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/hf.py +0 -0
  443. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/hf_space.py +0 -0
  444. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/hubs.py +0 -0
  445. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ingest_sources.py +0 -0
  446. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/integrations.py +0 -0
  447. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/interference.py +0 -0
  448. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/interference_live.py +0 -0
  449. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/irt.py +0 -0
  450. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/iterative_dpo.py +0 -0
  451. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  452. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/kernel_picker.py +0 -0
  453. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/knowledge_edit.py +0 -0
  454. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/kv_cache.py +0 -0
  455. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/launcher.py +0 -0
  456. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/license_advisor.py +0 -0
  457. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/license_matrix.py +0 -0
  458. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/liger.py +0 -0
  459. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/lisa.py +0 -0
  460. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/live_eval.py +0 -0
  461. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/llama_proxy.py +0 -0
  462. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/llama_server_timings.py +0 -0
  463. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/local_rl.py +0 -0
  464. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  465. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loftq_init.py +0 -0
  466. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/log_level.py +0 -0
  467. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/long_context.py +0 -0
  468. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/longlora.py +0 -0
  469. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loop_budget.py +0 -0
  470. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loop_daemon.py +0 -0
  471. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loop_iteration.py +0 -0
  472. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loop_stages.py +0 -0
  473. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/loop_state.py +0 -0
  474. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/lr_finder.py +0 -0
  475. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/lr_groups.py +0 -0
  476. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/magpie.py +0 -0
  477. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/metrics.py +0 -0
  478. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mii.py +0 -0
  479. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/minillm.py +0 -0
  480. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mix_proxy.py +0 -0
  481. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mixed_precision.py +0 -0
  482. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mlx.py +0 -0
  483. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mod.py +0 -0
  484. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/moe.py +0 -0
  485. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/moe_quant.py +0 -0
  486. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/mole_routing.py +0 -0
  487. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/multipack.py +0 -0
  488. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/multipack_sampler.py +0 -0
  489. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/multipack_trainer.py +0 -0
  490. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/namespace_pin.py +0 -0
  491. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/neat_packing.py +0 -0
  492. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ngram_spec.py +0 -0
  493. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/nlg_metrics.py +0 -0
  494. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ollama.py +0 -0
  495. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/onboarding.py +0 -0
  496. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  497. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/paths.py +0 -0
  498. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/peft_builder.py +0 -0
  499. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/peft_patches.py +0 -0
  500. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/peft_wiring.py +0 -0
  501. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/persona_hub.py +0 -0
  502. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/pipeline.py +0 -0
  503. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/preference_combine.py +0 -0
  504. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/prm.py +0 -0
  505. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/prm_reward.py +0 -0
  506. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/probe_kernel.py +0 -0
  507. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/probe_pack.py +0 -0
  508. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/profiler.py +0 -0
  509. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/profiling.py +0 -0
  510. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  511. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/prompt_compile.py +0 -0
  512. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/prompt_distill.py +0 -0
  513. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/prune_prompt.py +0 -0
  514. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/qat.py +0 -0
  515. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/qr_url.py +0 -0
  516. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/quality.py +0 -0
  517. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/quant_menu.py +0 -0
  518. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ra_dit.py +0 -0
  519. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ra_dit_run.py +0 -0
  520. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/raft.py +0 -0
  521. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/reasoning_effort.py +0 -0
  522. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/reasoning_parser.py +0 -0
  523. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/recipe_dag.py +0 -0
  524. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/recipe_run.py +0 -0
  525. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/registry.py +0 -0
  526. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/rehearsal.py +0 -0
  527. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/relora.py +0 -0
  528. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/replay.py +0 -0
  529. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/repro_receipt.py +0 -0
  530. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/reward_hack_control.py +0 -0
  531. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/reward_hacking.py +0 -0
  532. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ring_attention.py +0 -0
  533. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  534. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  535. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/run_cost.py +0 -0
  536. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/sae_diff.py +0 -0
  537. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/save_formats.py +0 -0
  538. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/semdedup.py +0 -0
  539. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/server_tools.py +0 -0
  540. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/sglang.py +0 -0
  541. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/shortcuts.py +0 -0
  542. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/shrink.py +0 -0
  543. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/signing.py +0 -0
  544. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/sleeper_probe.py +0 -0
  545. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/soup_lock.py +0 -0
  546. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/spec_pairing.py +0 -0
  547. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/spectrum_scan.py +0 -0
  548. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/spike_recovery.py +0 -0
  549. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/sse_train_stream.py +0 -0
  550. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/steering.py +0 -0
  551. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/strict_safetensors.py +0 -0
  552. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/structured_output.py +0 -0
  553. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/sweep_config.py +0 -0
  554. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tail_latency.py +0 -0
  555. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/terraform_plan.py +0 -0
  556. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tool_outputs.py +0 -0
  557. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/topics.py +0 -0
  558. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/topology.py +0 -0
  559. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tracing.py +0 -0
  560. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/trackers.py +0 -0
  561. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/train_event_buffer.py +0 -0
  562. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/trainer_plugins.py +0 -0
  563. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/trust_remote.py +0 -0
  564. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/truth_probe.py +0 -0
  565. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tts.py +0 -0
  566. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tts_codec.py +0 -0
  567. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/tunability.py +0 -0
  568. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/ui_env.py +0 -0
  569. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/uld.py +0 -0
  570. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  571. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/unlearning.py +0 -0
  572. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/unlearning_eval.py +0 -0
  573. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/unsloth.py +0 -0
  574. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/v028_features.py +0 -0
  575. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/vector_bank.py +0 -0
  576. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/vllm.py +0 -0
  577. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/vscode_setup.py +0 -0
  578. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/warmup.py +0 -0
  579. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/webhooks.py +0 -0
  580. {soup_cli-0.71.37 → soup_cli-0.71.39}/src/soup_cli/utils/why.py +0 -0
  581. {soup_cli-0.71.37 → soup_cli-0.71.39}/templates/chat.yaml +0 -0
  582. {soup_cli-0.71.37 → soup_cli-0.71.39}/templates/code.yaml +0 -0
  583. {soup_cli-0.71.37 → soup_cli-0.71.39}/templates/medical.yaml +0 -0
  584. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/__init__.py +0 -0
  585. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/conftest.py +0 -0
  586. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/qa/v053_qa.md +0 -0
  587. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/qa/v07114_qa.md +0 -0
  588. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/qa/v0716_qa.md +0 -0
  589. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_adapters.py +0 -0
  590. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_advanced_peft.py +0 -0
  591. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_assistant_mask.py +0 -0
  592. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_audio.py +0 -0
  593. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_auto_tuning.py +0 -0
  594. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_autopilot.py +0 -0
  595. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_awq_gptq_export.py +0 -0
  596. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_batch_probe.py +0 -0
  597. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_bco.py +0 -0
  598. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_bench.py +0 -0
  599. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_brain_rot_multilingual.py +0 -0
  600. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_bugfixes.py +0 -0
  601. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_build_dag.py +0 -0
  602. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_callback.py +0 -0
  603. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_cans.py +0 -0
  604. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_chat.py +0 -0
  605. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_chat_template.py +0 -0
  606. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_cli.py +0 -0
  607. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_cli_subprocess.py +0 -0
  608. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_code_review_critical.py +0 -0
  609. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_code_review_deferred.py +0 -0
  610. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_code_review_high.py +0 -0
  611. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_code_review_medium_low.py +0 -0
  612. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_code_review_recurring.py +0 -0
  613. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_config.py +0 -0
  614. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_cost.py +0 -0
  615. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_crash_reporter.py +0 -0
  616. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_curriculum.py +0 -0
  617. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_data.py +0 -0
  618. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_data_augment.py +0 -0
  619. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_data_sample.py +0 -0
  620. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_data_split.py +0 -0
  621. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_data_tools.py +0 -0
  622. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_dataset_hub.py +0 -0
  623. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_dataset_registry.py +0 -0
  624. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_deepspeed.py +0 -0
  625. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_deploy_ollama.py +0 -0
  626. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_diff.py +0 -0
  627. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_display.py +0 -0
  628. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_doctor.py +0 -0
  629. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_dpo_example.py +0 -0
  630. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_dpo_variants.py +0 -0
  631. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_embedding.py +0 -0
  632. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_errors.py +0 -0
  633. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_eval.py +0 -0
  634. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_eval_gate.py +0 -0
  635. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_eval_platform.py +0 -0
  636. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_export.py +0 -0
  637. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_formats.py +0 -0
  638. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_fp8_recipe.py +0 -0
  639. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_freeze_training.py +0 -0
  640. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_generate.py +0 -0
  641. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_gpu.py +0 -0
  642. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_grpo.py +0 -0
  643. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_hf_integration.py +0 -0
  644. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_infer.py +0 -0
  645. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_inference_advanced.py +0 -0
  646. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_init.py +0 -0
  647. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ipo.py +0 -0
  648. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_jinja_analyzer.py +0 -0
  649. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_kto.py +0 -0
  650. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_loader.py +0 -0
  651. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_log_level.py +0 -0
  652. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_loss_watchdog.py +0 -0
  653. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_merge.py +0 -0
  654. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_migrate.py +0 -0
  655. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_mlx_backend.py +0 -0
  656. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_moe.py +0 -0
  657. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_multi_adapter.py +0 -0
  658. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_multi_gpu.py +0 -0
  659. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_multipack_config.py +0 -0
  660. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_multipack_invariants.py +0 -0
  661. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_multipack_sampler.py +0 -0
  662. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_neat_packing.py +0 -0
  663. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_neftune_rslora.py +0 -0
  664. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_onnx_tensorrt_export.py +0 -0
  665. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_orpo.py +0 -0
  666. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_packing.py +0 -0
  667. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_a_wave2.py +0 -0
  668. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_b.py +0 -0
  669. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_c.py +0 -0
  670. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_d.py +0 -0
  671. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_e.py +0 -0
  672. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_part_f_hardening.py +0 -0
  673. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_peft_methods.py +0 -0
  674. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_peft_patches.py +0 -0
  675. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_performance.py +0 -0
  676. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_pissa_init.py +0 -0
  677. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ppo.py +0 -0
  678. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_preference_dispatcher.py +0 -0
  679. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_preference_multi.py +0 -0
  680. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_preference_multi_runtime.py +0 -0
  681. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_pretrain.py +0 -0
  682. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_profile.py +0 -0
  683. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_profiling.py +0 -0
  684. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_progress.py +0 -0
  685. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_push.py +0 -0
  686. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_qat.py +0 -0
  687. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_quality_filter.py +0 -0
  688. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_quant_check.py +0 -0
  689. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_quant_menu.py +0 -0
  690. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_quickstart.py +0 -0
  691. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_rank_pattern.py +0 -0
  692. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_recipes.py +0 -0
  693. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_recipes_v031.py +0 -0
  694. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_refusal_multilingual.py +0 -0
  695. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_registry.py +0 -0
  696. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_relora.py +0 -0
  697. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_replay.py +0 -0
  698. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_resume.py +0 -0
  699. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_review_fixes_v07133.py +0 -0
  700. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_rlvr.py +0 -0
  701. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_run_cost.py +0 -0
  702. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_runs.py +0 -0
  703. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_serve.py +0 -0
  704. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_server_generate.py +0 -0
  705. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_sglang_serve.py +0 -0
  706. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_simpo.py +0 -0
  707. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_smoke_train.py +0 -0
  708. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_speculative_decoding.py +0 -0
  709. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_sweep.py +0 -0
  710. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_synth_data_pro.py +0 -0
  711. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_templates_yaml.py +0 -0
  712. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_tensorboard.py +0 -0
  713. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_tool_calling.py +0 -0
  714. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_trace_to_pref.py +0 -0
  715. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_tracker.py +0 -0
  716. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_trainer_coverage_v035.py +0 -0
  717. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_trainer_init.py +0 -0
  718. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_training_speed.py +0 -0
  719. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_trust_remote_code.py +0 -0
  720. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_tui.py +0 -0
  721. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ui.py +0 -0
  722. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ui_chat.py +0 -0
  723. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ui_config_builder.py +0 -0
  724. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ui_live_monitor.py +0 -0
  725. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_ui_metrics.py +0 -0
  726. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_unsloth.py +0 -0
  727. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0401_part_c.py +0 -0
  728. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0401_part_d.py +0 -0
  729. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0401_part_e.py +0 -0
  730. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0402_part_a.py +0 -0
  731. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0402_part_b.py +0 -0
  732. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0403_part_a.py +0 -0
  733. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0403_part_b.py +0 -0
  734. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0403_part_c.py +0 -0
  735. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0404_part_a.py +0 -0
  736. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0404_part_b.py +0 -0
  737. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0405_part_a.py +0 -0
  738. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0406_part_a.py +0 -0
  739. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0410_part_a.py +0 -0
  740. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0410_part_b.py +0 -0
  741. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0410_part_c.py +0 -0
  742. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0420.py +0 -0
  743. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0430_part_a.py +0 -0
  744. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0430_part_b.py +0 -0
  745. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0430_part_c.py +0 -0
  746. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0430_part_d.py +0 -0
  747. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0440_part_a.py +0 -0
  748. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0440_part_b.py +0 -0
  749. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0440_part_c.py +0 -0
  750. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0440_part_d.py +0 -0
  751. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0440_review_followups.py +0 -0
  752. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0450.py +0 -0
  753. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0460_part_a.py +0 -0
  754. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0460_part_b.py +0 -0
  755. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0470_part_a.py +0 -0
  756. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0470_part_b.py +0 -0
  757. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0480_part_a.py +0 -0
  758. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0480_part_b.py +0 -0
  759. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0490.py +0 -0
  760. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0500_part_a.py +0 -0
  761. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0500_part_b.py +0 -0
  762. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0500_part_c.py +0 -0
  763. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0500_part_d.py +0 -0
  764. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0500_part_e.py +0 -0
  765. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0510.py +0 -0
  766. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0520.py +0 -0
  767. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0530.py +0 -0
  768. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v05310.py +0 -0
  769. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v05311.py +0 -0
  770. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0531_109.py +0 -0
  771. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0531_139.py +0 -0
  772. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0531_142.py +0 -0
  773. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0531_82.py +0 -0
  774. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0532.py +0 -0
  775. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0533.py +0 -0
  776. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0534.py +0 -0
  777. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0535.py +0 -0
  778. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0536.py +0 -0
  779. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0537.py +0 -0
  780. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0538.py +0 -0
  781. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0539.py +0 -0
  782. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0540.py +0 -0
  783. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0550.py +0 -0
  784. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0550_followups.py +0 -0
  785. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0560.py +0 -0
  786. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0570_part_a.py +0 -0
  787. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0570_part_b.py +0 -0
  788. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0570_part_c.py +0 -0
  789. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0570_part_d.py +0 -0
  790. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0580.py +0 -0
  791. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0590.py +0 -0
  792. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_a.py +0 -0
  793. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_b.py +0 -0
  794. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_c.py +0 -0
  795. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_d.py +0 -0
  796. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_e.py +0 -0
  797. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0600_part_f.py +0 -0
  798. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0610_part_a.py +0 -0
  799. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0610_part_b.py +0 -0
  800. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0610_part_c.py +0 -0
  801. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0610_part_d.py +0 -0
  802. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0610_part_e.py +0 -0
  803. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_followups.py +0 -0
  804. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_part_a.py +0 -0
  805. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_part_b.py +0 -0
  806. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_part_c.py +0 -0
  807. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_part_d.py +0 -0
  808. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0620_part_e.py +0 -0
  809. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_followups.py +0 -0
  810. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_part_a.py +0 -0
  811. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_part_b.py +0 -0
  812. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_part_c.py +0 -0
  813. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_part_d.py +0 -0
  814. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0630_part_e.py +0 -0
  815. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0631_206.py +0 -0
  816. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_followups.py +0 -0
  817. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_a.py +0 -0
  818. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_b.py +0 -0
  819. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_c.py +0 -0
  820. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_d.py +0 -0
  821. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_e.py +0 -0
  822. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0640_part_f.py +0 -0
  823. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_followups.py +0 -0
  824. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_part_a.py +0 -0
  825. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_part_b.py +0 -0
  826. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_part_c.py +0 -0
  827. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_part_d.py +0 -0
  828. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0650_part_e.py +0 -0
  829. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_cli.py +0 -0
  830. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_followups.py +0 -0
  831. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_part_a.py +0 -0
  832. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_part_b.py +0 -0
  833. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_part_c.py +0 -0
  834. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_part_d.py +0 -0
  835. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0660_part_e.py +0 -0
  836. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_followups.py +0 -0
  837. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_a.py +0 -0
  838. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_b.py +0 -0
  839. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_c.py +0 -0
  840. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_d.py +0 -0
  841. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_e.py +0 -0
  842. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0670_part_f.py +0 -0
  843. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_followups.py +0 -0
  844. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_part_a.py +0 -0
  845. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_part_b.py +0 -0
  846. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_part_c.py +0 -0
  847. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_part_d.py +0 -0
  848. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0680_part_e.py +0 -0
  849. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0690_part_a.py +0 -0
  850. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0690_part_b.py +0 -0
  851. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0690_part_c.py +0 -0
  852. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0690_part_d.py +0 -0
  853. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0690_part_e.py +0 -0
  854. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_a.py +0 -0
  855. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_b.py +0 -0
  856. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_c.py +0 -0
  857. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_d.py +0 -0
  858. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_e.py +0 -0
  859. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0700_part_f.py +0 -0
  860. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07110.py +0 -0
  861. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07111.py +0 -0
  862. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07112.py +0 -0
  863. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07113.py +0 -0
  864. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07114.py +0 -0
  865. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07115.py +0 -0
  866. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07116.py +0 -0
  867. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07117.py +0 -0
  868. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07118.py +0 -0
  869. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07119.py +0 -0
  870. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0712.py +0 -0
  871. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07120.py +0 -0
  872. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07121.py +0 -0
  873. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07122.py +0 -0
  874. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07123.py +0 -0
  875. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07124.py +0 -0
  876. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07126.py +0 -0
  877. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07127.py +0 -0
  878. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07128.py +0 -0
  879. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07129.py +0 -0
  880. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0713.py +0 -0
  881. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07130.py +0 -0
  882. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07131.py +0 -0
  883. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07132.py +0 -0
  884. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07133.py +0 -0
  885. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07134.py +0 -0
  886. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07135.py +0 -0
  887. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07136.py +0 -0
  888. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v07137.py +0 -0
  889. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0714.py +0 -0
  890. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0715.py +0 -0
  891. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0716.py +0 -0
  892. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0717.py +0 -0
  893. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0718.py +0 -0
  894. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_v0719.py +0 -0
  895. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_validator.py +0 -0
  896. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_vision.py +0 -0
  897. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_vllm_serve.py +0 -0
  898. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_warmup.py +0 -0
  899. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_why.py +0 -0
  900. {soup_cli-0.71.37 → soup_cli-0.71.39}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,95 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.39] - 2026-07-19
16
+
17
+ **"CI for weights, not prompts": close the evidence loop.** `soup ship`'s verdict is
18
+ now something Soup can emit, commit, review, and bind to the exact model that
19
+ produced it — turning the `soup ci init` gate from "edit two numbers in a JSON file"
20
+ into a reproducible, provenance-bound check that renders on every PR.
21
+
22
+ ### Added
23
+
24
+ - **`soup ship --emit-evidence <path>`** — re-serialises the verdict into the
25
+ `--evidence` INPUT schema, so a run's output is replayable as input: feeding it
26
+ back through `--evidence` (same `--forgetting-threshold`) reproduces an identical
27
+ verdict. Output is finally input.
28
+ - **`ShipConfig` under `eval.ship` in `soup.yaml` + `soup ship --config soup.yaml`** —
29
+ commit the gate policy (`task_eval` / `task_mode` / `general_suite` /
30
+ `forgetting_threshold` / `judge_model` / `baseline`) so the verdict is reviewable in
31
+ a PR diff and reproducible. An explicit CLI flag always wins (CLI > config > default).
32
+ - **`soup ship --push owner/repo#N`** — post the verdict as a GitHub PR comment
33
+ (reuses the `soup adapters pr --push` `gh api` plumbing). Best-effort: a missing
34
+ token / `gh` failure warns but never flips the SHIP / DON'T-SHIP exit code.
35
+ - **Evidence provenance + staleness gate.** With `--emit-evidence`, `--config` STAMPS
36
+ a `provenance` block (`config_sha` — a semantic, order-insensitive recipe hash — plus
37
+ `base_model` and a best-effort `data_sha`) onto the evidence. With `--evidence`
38
+ alone, `--config` GATES: it refuses (exit 3) evidence whose `config_sha` drifted
39
+ from the committed config, so a PR that changed `soup.yaml` but forgot to recompute
40
+ its evidence is caught. The gate policy (`eval.ship`) is EXCLUDED from the hash, so
41
+ tuning `forgetting_threshold` never falsely invalidates evidence about an unchanged
42
+ model.
43
+ - **`soup ci init --config <soup.yaml>`** — binds the generated gate's `soup ship`
44
+ step to the committed config (provenance/staleness enforcement in CI).
45
+
46
+ ### Changed
47
+
48
+ - **Exit-code note:** `soup ship --config` usage / staleness errors are exit `3`
49
+ (usage), preserving `0 = SHIP`, `2 = DON'T SHIP`, `1 = runtime` from v0.71.38.
50
+
51
+ ### Security
52
+
53
+ - `provenance.config_sha` read from untrusted evidence is shape-validated as a hex
54
+ digest before being echoed (a raw value could smuggle terminal ESC bytes past
55
+ `rich.markup.escape`).
56
+ - `provenance.data_sha` hashes the training file through an `O_NOFOLLOW` fd with a
57
+ symlink-rejecting containment check and an 8 GiB cap (was an unguarded `hash_file`).
58
+ - `soup ci init`'s path validation now rejects `#` and the YAML 1.1 line breaks
59
+ (NEL / LS / PS), closing a plain-scalar comment-truncation of the generated `run:`
60
+ step (also hardens the pre-existing `--data` / `--suite` / `--evidence` args).
61
+
62
+ ## [0.71.38] - 2026-07-17
63
+
64
+ **`soup ship`'s regression leg now has teeth.** Leg 2 (the catastrophic-forgetting
65
+ / regression gate that carries the whole SHIP / DON'T-SHIP claim) was 15
66
+ hand-written trivia prompts scored by case-insensitive **substring** containment
67
+ — it scored `"B"` for "**B**erlin", `"ok"` for "lo**ok**", `"3"` for "1**3**", and
68
+ had **zero** items for tool-calling, safety, or JSON validity. This release makes
69
+ the gate real: a fixed, extraction-based scorer + bundled, offline, zero-dep eval
70
+ suites that catch a regression the old gate waved through.
71
+
72
+ ### Changed
73
+
74
+ - **Fixed answer scorer (breaking — verdicts can change).** `soup ship`'s leg-2
75
+ MCQ / instruction / arithmetic answers are now scored by answer-**extraction**
76
+ + a boundary-aware match, replacing the raw substring test. A spurious
77
+ substring inside another word ("Berlin", "look", "13") no longer scores a
78
+ correct answer, so an existing run's verdict may flip — intentionally, because
79
+ the old gate was reporting false negatives.
80
+ - **Bundled, offline general suite.** The default `--general-suite` is now seven
81
+ hand-authored suites shipped in the wheel: `mini_mmlu` / `mini_common_sense` /
82
+ `mini_instruction` (expanded), a new `mini_arithmetic`, and three behavioural
83
+ suites the old gate had no coverage for — `mini_tool_call` (function-calling),
84
+ `mini_format_json` (JSON validity), and `mini_safety` (refusal-rate). Each is
85
+ scored to a per-model absolute score by the pure scorers Soup already ships
86
+ (`eval/custom`, `utils/diagnose`); no lm-eval, no network, no download. Every
87
+ suite is large enough that a single-item flip (1/N < 0.05) trips the default
88
+ threshold instead of being rounded away.
89
+ - **`soup ship` exit codes: usage errors moved 2 → 3.** Exit `2` now means only
90
+ DON'T-SHIP; a typo'd flag or bad `--general-suite` exits `3` (mirroring
91
+ `soup plan` / `soup env check`), so CI can tell a config error from a caught
92
+ regression. Offline `--evidence` read/parse errors stay `1`. **Breaking** for
93
+ anyone parsing exit `2` as "usage error".
94
+
95
+ ### Fixed
96
+
97
+ - `soup ship` help + docstrings no longer describe `--task-mode pairwise` as
98
+ "reserved for a later release" (it shipped in v0.71.31); the dead
99
+ `SUPPORTED_TASK_MODES` gate is removed.
100
+ - `soup diagnose`'s package docstring said "Six" probes (there are seven —
101
+ citation) and pointed live loading at an unshipped version; it now re-exports
102
+ all seven `score_*` probe functions so callers need not reach into submodules.
103
+
15
104
  ## [0.71.37] - 2026-07-17
16
105
 
17
106
  **Every `pip install soup-cli[extra]` command now works on Windows `cmd.exe`**, and
@@ -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 (315 files, 16288 tests)
123
+ tests/ - Test suite (317 files, 16387 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.37
3
+ Version: 0.71.39
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,38 +193,43 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.36Data Moat II.** A semantic layer over your training data, plus two tools for what a fine-tune forgets and what it leaks.
197
-
198
- - **`soup data dedup --semantic`** dedup by meaning, not by shared tokens. Catches
199
- *reworded* duplicates MinHash's shingling scores as distinct. Zero new dependencies.
200
- - **`soup data topics <data>`** — cluster your data and get a coverage table
201
- (`82% code · 6% math · 1% safety`) with a warning for thin topics, so you can see what
202
- you are actually training on.
203
- - **`soup data canary insert|check`** insert unique secrets, then prove whether a model
204
- memorized them: each secret's loss is ranked against never-inserted controls. Exit 2 on a
205
- leak, so CI can gate. On SmolLM2-135M a memorized set lands at percentile 0.0 against a
206
- clean model's 4%–93% spread.
207
- - **`soup train --replay old.jsonl`** continual-learning rehearsal: interleave your old
208
- data so the new task doesn't erase it.
209
- - **Honest result:** semantic dedup is **not** a paraphrase detector. Measured, paraphrase
210
- cosines (0.49–0.76) *overlap* with genuinely-distinct rows (0.54–0.76) — "Add two numbers"
211
- vs "Multiply two numbers" scores **higher** than a real paraphrase — so no threshold
212
- separates them. The default is deliberately conservative; see the CHANGELOG.
213
- - **Two blocking bugs fixed:** the hardware-fit gate **refused to train any model you merged
214
- yourself** (a local checkpoint's name has no size marker, so it guessed 7B and predicted
215
- 16 GB), and every `pip install "soup-cli[extra]"` hint printed **without the extra** —
216
- 17 sites where the suggested command succeeds and leaves the feature still broken.
196
+ **v0.71.39CI for weights, not prompts.** `soup ship`'s verdict is now something Soup can emit, commit, review, and bind to the exact model that produced it — so a fine-tuning gate renders on every PR instead of asking you to hand-edit a JSON file.
197
+
198
+ - **Output is finally input.** `soup ship --emit-evidence ev.json` writes the scores in the
199
+ `--evidence` schema, so a run replays offline into an identical verdict — the round-trip the
200
+ old `--output` couldn't do.
201
+ - **Commit the gate policy.** Put `eval.ship` in your `soup.yaml` (`forgetting_threshold`,
202
+ `general_suite`, `task_mode`, …) and `soup ship --config soup.yaml` reads it — the gate is now
203
+ reviewable in a PR diff. Explicit flags still win.
204
+ - **Provenance-bound evidence.** `--config --emit-evidence` STAMPS a `config_sha` onto the
205
+ evidence; `--config --evidence` GATES on it a PR that changed the recipe but forgot to
206
+ recompute its evidence is refused (exit 3). Tuning the threshold never falsely invalidates it.
207
+ - **The verdict on your PR.** `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card as
208
+ a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
217
209
 
218
210
  ```bash
219
- soup data topics train.jsonl # what am I actually training on?
220
- soup data dedup train.jsonl --semantic -o clean.jsonl
211
+ # producer (train job): stamp the scores with the config that produced them
212
+ soup ship --evidence scores.json --config soup.yaml --emit-evidence ship_evidence.json
213
+
214
+ # gate (PR CI): refuse evidence that doesn't match the committed config
215
+ soup ship --evidence ship_evidence.json --config soup.yaml --push owner/repo#42
216
+ soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
217
+ ```
218
+
219
+ <details>
220
+ <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
221
221
 
222
- soup data canary insert train.jsonl -o canaried.jsonl --manifest secrets.json
223
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
222
+ `soup ship`'s regression leg became real: a fixed, extraction-based scorer over seven bundled,
223
+ offline suites (MCQ · arithmetic · tool-calling · JSON validity · safety/refusal). A tune that
224
+ wins your task but quietly breaks tool-calling now gets a **DON'T SHIP**. Zero new deps.
224
225
 
225
- soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
226
+ ```bash
227
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
228
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
226
229
  ```
227
230
 
231
+ </details>
232
+
228
233
  <details>
229
234
  <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
230
235
 
@@ -49,38 +49,43 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.36Data Moat II.** A semantic layer over your training data, plus two tools for what a fine-tune forgets and what it leaks.
53
-
54
- - **`soup data dedup --semantic`** dedup by meaning, not by shared tokens. Catches
55
- *reworded* duplicates MinHash's shingling scores as distinct. Zero new dependencies.
56
- - **`soup data topics <data>`** — cluster your data and get a coverage table
57
- (`82% code · 6% math · 1% safety`) with a warning for thin topics, so you can see what
58
- you are actually training on.
59
- - **`soup data canary insert|check`** insert unique secrets, then prove whether a model
60
- memorized them: each secret's loss is ranked against never-inserted controls. Exit 2 on a
61
- leak, so CI can gate. On SmolLM2-135M a memorized set lands at percentile 0.0 against a
62
- clean model's 4%–93% spread.
63
- - **`soup train --replay old.jsonl`** continual-learning rehearsal: interleave your old
64
- data so the new task doesn't erase it.
65
- - **Honest result:** semantic dedup is **not** a paraphrase detector. Measured, paraphrase
66
- cosines (0.49–0.76) *overlap* with genuinely-distinct rows (0.54–0.76) — "Add two numbers"
67
- vs "Multiply two numbers" scores **higher** than a real paraphrase — so no threshold
68
- separates them. The default is deliberately conservative; see the CHANGELOG.
69
- - **Two blocking bugs fixed:** the hardware-fit gate **refused to train any model you merged
70
- yourself** (a local checkpoint's name has no size marker, so it guessed 7B and predicted
71
- 16 GB), and every `pip install "soup-cli[extra]"` hint printed **without the extra** —
72
- 17 sites where the suggested command succeeds and leaves the feature still broken.
52
+ **v0.71.39CI for weights, not prompts.** `soup ship`'s verdict is now something Soup can emit, commit, review, and bind to the exact model that produced it — so a fine-tuning gate renders on every PR instead of asking you to hand-edit a JSON file.
53
+
54
+ - **Output is finally input.** `soup ship --emit-evidence ev.json` writes the scores in the
55
+ `--evidence` schema, so a run replays offline into an identical verdict — the round-trip the
56
+ old `--output` couldn't do.
57
+ - **Commit the gate policy.** Put `eval.ship` in your `soup.yaml` (`forgetting_threshold`,
58
+ `general_suite`, `task_mode`, …) and `soup ship --config soup.yaml` reads it — the gate is now
59
+ reviewable in a PR diff. Explicit flags still win.
60
+ - **Provenance-bound evidence.** `--config --emit-evidence` STAMPS a `config_sha` onto the
61
+ evidence; `--config --evidence` GATES on it a PR that changed the recipe but forgot to
62
+ recompute its evidence is refused (exit 3). Tuning the threshold never falsely invalidates it.
63
+ - **The verdict on your PR.** `soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card as
64
+ a GitHub comment; `soup ci init --config soup.yaml` wires the whole thing into CI.
73
65
 
74
66
  ```bash
75
- soup data topics train.jsonl # what am I actually training on?
76
- soup data dedup train.jsonl --semantic -o clean.jsonl
67
+ # producer (train job): stamp the scores with the config that produced them
68
+ soup ship --evidence scores.json --config soup.yaml --emit-evidence ship_evidence.json
77
69
 
78
- soup data canary insert train.jsonl -o canaried.jsonl --manifest secrets.json
79
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
70
+ # gate (PR CI): refuse evidence that doesn't match the committed config
71
+ soup ship --evidence ship_evidence.json --config soup.yaml --push owner/repo#42
72
+ soup ci init --config soup.yaml # writes .github/workflows/soup-gate.yml
73
+ ```
74
+
75
+ <details>
76
+ <summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>
77
+
78
+ `soup ship`'s regression leg became real: a fixed, extraction-based scorer over seven bundled,
79
+ offline suites (MCQ · arithmetic · tool-calling · JSON validity · safety/refusal). A tune that
80
+ wins your task but quietly breaks tool-calling now gets a **DON'T SHIP**. Zero new deps.
80
81
 
81
- soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
82
+ ```bash
83
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
84
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
82
85
  ```
83
86
 
87
+ </details>
88
+
84
89
  <details>
85
90
  <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
86
91
 
@@ -160,14 +160,18 @@ soup runs show <run_id> Run details + loss graph + cost
160
160
  soup runs compare <run_1> <run_2> Compare two runs
161
161
  soup runs replay <run_id> Replay summary + loss curve from history (also plots a benchmark-score curve when the metric lives in eval_results)
162
162
  soup why [run_id] Explain training anomalies (heuristic)
163
- soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP verdict: task win AND no forgetting (exit 0=SHIP / 2=DON'T / 1=error) (v0.71.25)
163
+ soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP verdict: task win AND no regression on the bundled suite (exit 0=SHIP / 2=DON'T / 3=usage / 1=runtime) (v0.71.25; leg-2 real + usage-off-2 v0.71.38)
164
164
  soup ship --evidence ev.json [--output v.json] Decide offline from pre-computed scores (no model load)
165
165
  soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via LLM-as-a-judge
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
- soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 + recorded base scores
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
+ 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)
168
172
  soup card <registry-id> -o MODELCARD.md HF model card from a registry entry: training config, evals, hashes, lineage, artifacts (v0.71.35)
169
173
  soup push --model ./out --repo you/m --card <registry-id> Upload that registry-driven card as the README (HF only) (v0.71.35)
170
- 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)
171
175
  soup mcp serve MCP server over stdio (drive Soup from Claude Code / Cursor / Cline; requires [mcp] extra) (v0.71.28)
172
176
  soup mcp serve --allow-mutating Also expose plan-only train_start / export tools (never execute) (v0.71.28)
173
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)
@@ -355,11 +355,58 @@ soup ship --evidence evidence.json --output verdict.json
355
355
  }
356
356
  ```
357
357
 
358
- Leg-2 defaults to the built-in mini benchmarks (`mini_mmlu` / `mini_common_sense` /
359
- `mini_instruction`) offline, CPU, instant. `--general-suite <names>` with non-mini names
360
- routes through the lm-eval harness. Pairwise judge win-rate (`--task-mode pairwise`) is planned
361
- for a later release. The engine lives in `soup_cli.utils.ship_verdict` (`decide_ship` is a pure
362
- function the whole truth table is CPU-testable).
358
+ Leg-2 defaults to the **bundled offline suite** (v0.71.38) seven hand-authored suites shipped
359
+ in the wheel and scored by the pure scorers Soup already ships (no lm-eval, no network,
360
+ CPU-instant):
361
+
362
+ | Suite | What it checks | Scorer |
363
+ |-------|----------------|--------|
364
+ | `mini_mmlu` / `mini_common_sense` / `mini_instruction` / `mini_arithmetic` | general knowledge / reasoning / instruction-following / numeracy | answer-extraction + exact/boundary match |
365
+ | `mini_tool_call` | function-calling still works (right tool named) | `tool_call_name_match` |
366
+ | `mini_format_json` | JSON validity (a structured object, not a bare scalar) | container-only JSON check |
367
+ | `mini_safety` | refusal-rate on harmful prompts (under-refusal = regression) | refusal heuristic |
368
+
369
+ Each suite is >20 items so a single-item flip (1/N < 0.05) trips the default threshold instead
370
+ of being rounded away. The scorer is answer-**extraction** — a spurious substring inside a word
371
+ (`"B"` in "**B**erlin") no longer scores, which is a **breaking** change from the v0.25.0
372
+ substring scorer (an existing run's verdict can flip; recompute any committed `--baseline`).
373
+ `--general-suite <names>` with any non-bundled name routes through the lm-eval harness. Pairwise
374
+ judge win-rate (`--task-mode pairwise`) shipped in v0.71.31.
375
+
376
+ Exit codes (v0.71.38): **0 = SHIP · 2 = DON'T SHIP · 3 = usage/flag error · 1 = runtime error**
377
+ — usage errors moved off `2` so CI can tell a config typo from a caught regression. The engine
378
+ lives in `soup_cli.utils.ship_verdict` (`decide_ship` is a pure function — the whole truth table
379
+ is CPU-testable); the bundled suites live in `soup_cli.eval.gate_suites`.
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)).
363
410
 
364
411
 
365
412
  ## NLG Evaluation Metrics (BLEU + ROUGE)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.37"
7
+ version = "0.71.39"
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"
@@ -127,6 +127,7 @@ artifacts = [
127
127
  "src/soup_cli/data/_fixtures/*.jsonl",
128
128
  "src/soup_cli/data/_fixtures/unlearning/*.jsonl",
129
129
  "src/soup_cli/data/_fixtures/behavior/*.jsonl",
130
+ "src/soup_cli/data/_fixtures/gate/*.jsonl",
130
131
  ]
131
132
 
132
133
  [tool.ruff]
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.37"
3
+ __version__ = "0.71.39"
@@ -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))}[/]")