soup-cli 0.71.7__tar.gz → 0.71.9__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 (796) hide show
  1. {soup_cli-0.71.7 → soup_cli-0.71.9}/CHANGELOG.md +93 -0
  2. {soup_cli-0.71.7 → soup_cli-0.71.9}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.7 → soup_cli-0.71.9}/PKG-INFO +15 -17
  4. {soup_cli-0.71.7 → soup_cli-0.71.9}/README.md +14 -16
  5. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/adapters-and-governance.md +14 -9
  6. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/commands.md +10 -4
  7. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/evaluation.md +15 -2
  8. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/training.md +8 -3
  9. {soup_cli-0.71.7 → soup_cli-0.71.9}/pyproject.toml +1 -1
  10. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/__init__.py +1 -1
  11. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cli.py +3 -2
  12. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/edit.py +121 -22
  13. soup_cli-0.71.9/src/soup_cli/commands/probe.py +738 -0
  14. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/train.py +144 -0
  15. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/registry/store.py +3 -0
  16. soup_cli-0.71.9/src/soup_cli/trainer/unlearn.py +443 -0
  17. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/edit_diff.py +87 -18
  18. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/edit_governor.py +258 -1
  19. soup_cli-0.71.9/src/soup_cli/utils/edit_kernels.py +399 -0
  20. soup_cli-0.71.9/src/soup_cli/utils/grace_codebook.py +462 -0
  21. soup_cli-0.71.9/src/soup_cli/utils/harm_probe.py +149 -0
  22. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/hubs.py +93 -0
  23. soup_cli-0.71.9/src/soup_cli/utils/interference_live.py +163 -0
  24. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/knowledge_edit.py +115 -13
  25. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/live_eval.py +148 -0
  26. soup_cli-0.71.9/src/soup_cli/utils/probe_kernel.py +520 -0
  27. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/probe_pack.py +28 -8
  28. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/sae_diff.py +108 -27
  29. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/sleeper_probe.py +92 -27
  30. soup_cli-0.71.9/src/soup_cli/utils/truth_probe.py +152 -0
  31. soup_cli-0.71.9/src/soup_cli/utils/unlearn_kernels.py +115 -0
  32. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/unlearning.py +16 -12
  33. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0610_part_a.py +26 -9
  34. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0610_part_c.py +57 -11
  35. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_followups.py +31 -14
  36. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_part_e.py +21 -7
  37. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0717.py +2 -1
  38. soup_cli-0.71.9/tests/test_v0718.py +1545 -0
  39. soup_cli-0.71.9/tests/test_v0719.py +946 -0
  40. soup_cli-0.71.7/src/soup_cli/commands/probe.py +0 -382
  41. soup_cli-0.71.7/src/soup_cli/trainer/unlearn.py +0 -90
  42. soup_cli-0.71.7/src/soup_cli/utils/grace_codebook.py +0 -102
  43. {soup_cli-0.71.7 → soup_cli-0.71.9}/.dockerignore +0 -0
  44. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/FUNDING.yml +0 -0
  45. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  46. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  47. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  48. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/pull_request_template.md +0 -0
  49. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/workflows/ci.yml +0 -0
  50. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/workflows/docker.yml +0 -0
  51. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/workflows/publish.yml +0 -0
  52. {soup_cli-0.71.7 → soup_cli-0.71.9}/.github/workflows/recipe-validation.yml +0 -0
  53. {soup_cli-0.71.7 → soup_cli-0.71.9}/.gitignore +0 -0
  54. {soup_cli-0.71.7 → soup_cli-0.71.9}/.mailmap +0 -0
  55. {soup_cli-0.71.7 → soup_cli-0.71.9}/.pre-commit-config.yaml +0 -0
  56. {soup_cli-0.71.7 → soup_cli-0.71.9}/AGENTS.md +0 -0
  57. {soup_cli-0.71.7 → soup_cli-0.71.9}/CODEOWNERS +0 -0
  58. {soup_cli-0.71.7 → soup_cli-0.71.9}/CODE_OF_CONDUCT.md +0 -0
  59. {soup_cli-0.71.7 → soup_cli-0.71.9}/CONTRIBUTORS.md +0 -0
  60. {soup_cli-0.71.7 → soup_cli-0.71.9}/Dockerfile +0 -0
  61. {soup_cli-0.71.7 → soup_cli-0.71.9}/LICENSE +0 -0
  62. {soup_cli-0.71.7 → soup_cli-0.71.9}/NOTICE +0 -0
  63. {soup_cli-0.71.7 → soup_cli-0.71.9}/SECURITY.md +0 -0
  64. {soup_cli-0.71.7 → soup_cli-0.71.9}/docker-compose.yml +0 -0
  65. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/README.md +0 -0
  66. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/backends-and-ops.md +0 -0
  67. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/data.md +0 -0
  68. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/models.md +0 -0
  69. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/peft-and-efficiency.md +0 -0
  70. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/performance-and-quantization.md +0 -0
  71. {soup_cli-0.71.7 → soup_cli-0.71.9}/docs/serving-and-export.md +0 -0
  72. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/README.md +0 -0
  73. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/dpo_chat.yaml +0 -0
  74. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/dpo_example.yaml +0 -0
  75. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/grpo_reasoning.yaml +0 -0
  76. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/rlhf_step1_sft.yaml +0 -0
  77. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/rlhf_step2_reward.yaml +0 -0
  78. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  79. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/sft_basic.yaml +0 -0
  80. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/configs/vision_llama.yaml +0 -0
  81. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/data/alpaca_tiny.jsonl +0 -0
  82. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/data/chat_preferences.jsonl +0 -0
  83. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/data/dpo_sample.jsonl +0 -0
  84. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/data/reasoning_math.jsonl +0 -0
  85. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/synthetic_workflow.md +0 -0
  86. {soup_cli-0.71.7 → soup_cli-0.71.9}/examples/synthetic_workflow.yaml +0 -0
  87. {soup_cli-0.71.7 → soup_cli-0.71.9}/soup.png +0 -0
  88. {soup_cli-0.71.7 → soup_cli-0.71.9}/soup_logo_svg.svg +0 -0
  89. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/__main__.py +0 -0
  90. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/autopilot/__init__.py +0 -0
  91. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/autopilot/analyzer.py +0 -0
  92. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/autopilot/decisions.py +0 -0
  93. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/autopilot/generate_config.py +0 -0
  94. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/__init__.py +0 -0
  95. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/pack.py +0 -0
  96. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/publish.py +0 -0
  97. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/run.py +0 -0
  98. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/schema.py +0 -0
  99. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/unpack.py +0 -0
  100. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/cans/verify.py +0 -0
  101. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/__init__.py +0 -0
  102. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/_eval_v0550.py +0 -0
  103. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/_eval_v0610.py +0 -0
  104. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/_eval_v0650.py +0 -0
  105. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/_webhook_cli.py +0 -0
  106. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/ab.py +0 -0
  107. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/active_sample.py +0 -0
  108. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/adapters.py +0 -0
  109. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/advise.py +0 -0
  110. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/agent.py +0 -0
  111. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/airgap.py +0 -0
  112. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/apple_adapter.py +0 -0
  113. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/attest.py +0 -0
  114. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/audit_log.py +0 -0
  115. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/autopilot.py +0 -0
  116. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/bench.py +0 -0
  117. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/bom.py +0 -0
  118. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/build.py +0 -0
  119. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/can.py +0 -0
  120. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/chat.py +0 -0
  121. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/compile_cmd.py +0 -0
  122. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/compile_tools.py +0 -0
  123. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/completions.py +0 -0
  124. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/cost.py +0 -0
  125. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/data.py +0 -0
  126. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/data_forge.py +0 -0
  127. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/data_mix.py +0 -0
  128. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/data_score.py +0 -0
  129. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  130. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/deploy.py +0 -0
  131. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/diagnose.py +0 -0
  132. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/diff.py +0 -0
  133. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/distill_prompt.py +0 -0
  134. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/doctor.py +0 -0
  135. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/drift_alarm.py +0 -0
  136. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/env.py +0 -0
  137. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/eval.py +0 -0
  138. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/expect.py +0 -0
  139. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/export.py +0 -0
  140. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/fetch.py +0 -0
  141. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/generate.py +0 -0
  142. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/history.py +0 -0
  143. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/infer.py +0 -0
  144. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/ingest.py +0 -0
  145. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/init.py +0 -0
  146. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/iterative_dpo.py +0 -0
  147. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/license_advisor.py +0 -0
  148. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/llama.py +0 -0
  149. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/local_rl.py +0 -0
  150. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/lock.py +0 -0
  151. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/loop.py +0 -0
  152. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/merge.py +0 -0
  153. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  154. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/migrate.py +0 -0
  155. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/monitor.py +0 -0
  156. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/plan.py +0 -0
  157. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/plugins.py +0 -0
  158. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/profile.py +0 -0
  159. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/prune_prompt.py +0 -0
  160. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/push.py +0 -0
  161. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/quantize.py +0 -0
  162. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/quickstart.py +0 -0
  163. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/recipes.py +0 -0
  164. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/registry.py +0 -0
  165. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/runs.py +0 -0
  166. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/serve.py +0 -0
  167. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/steer.py +0 -0
  168. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/sweep.py +0 -0
  169. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/tokenizer.py +0 -0
  170. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/tui.py +0 -0
  171. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/tunability.py +0 -0
  172. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/ui.py +0 -0
  173. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/commands/why.py +0 -0
  174. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/config/__init__.py +0 -0
  175. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/config/loader.py +0 -0
  176. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/config/schema.py +0 -0
  177. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/__init__.py +0 -0
  178. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  179. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  180. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  181. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  182. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  183. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  184. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  185. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  186. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  187. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  188. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  189. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  190. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/augment.py +0 -0
  191. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/chat_templates.py +0 -0
  192. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/collators.py +0 -0
  193. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/formats.py +0 -0
  194. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/loader.py +0 -0
  195. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/loss_mask.py +0 -0
  196. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/providers/__init__.py +0 -0
  197. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/providers/_utils.py +0 -0
  198. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/providers/anthropic.py +0 -0
  199. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/providers/ollama.py +0 -0
  200. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/providers/vllm.py +0 -0
  201. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/sft_format.py +0 -0
  202. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/__init__.py +0 -0
  203. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/code.py +0 -0
  204. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/conversation.py +0 -0
  205. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/preference.py +0 -0
  206. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/qa.py +0 -0
  207. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/reasoning.py +0 -0
  208. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/tool_calling.py +0 -0
  209. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/templates/verifiable.py +0 -0
  210. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/traces/__init__.py +0 -0
  211. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/traces/pair_builder.py +0 -0
  212. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/traces/parsers.py +0 -0
  213. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/traces/quality.py +0 -0
  214. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/data/validator.py +0 -0
  215. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/__init__.py +0 -0
  216. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/arena.py +0 -0
  217. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  218. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/calibrate.py +0 -0
  219. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  220. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/custom.py +0 -0
  221. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/forgetting.py +0 -0
  222. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/gate.py +0 -0
  223. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/human.py +0 -0
  224. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/judge.py +0 -0
  225. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/leaderboard.py +0 -0
  226. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/eval/quant_check.py +0 -0
  227. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/experiment/__init__.py +0 -0
  228. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/experiment/tracker.py +0 -0
  229. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/migrate/__init__.py +0 -0
  230. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/migrate/axolotl.py +0 -0
  231. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/migrate/common.py +0 -0
  232. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/migrate/llamafactory.py +0 -0
  233. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/migrate/unsloth.py +0 -0
  234. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/__init__.py +0 -0
  235. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/callback.py +0 -0
  236. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  237. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/display.py +0 -0
  238. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  239. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/hf_push.py +0 -0
  240. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  241. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/monitoring/trace_logger.py +0 -0
  242. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/plugins/__init__.py +0 -0
  243. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/py.typed +0 -0
  244. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/recipes/__init__.py +0 -0
  245. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/recipes/catalog.py +0 -0
  246. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/registry/__init__.py +0 -0
  247. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/registry/attach.py +0 -0
  248. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/registry/diff.py +0 -0
  249. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/registry/hashing.py +0 -0
  250. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/__init__.py +0 -0
  251. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/audio.yaml +0 -0
  252. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/bco.yaml +0 -0
  253. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/chat.yaml +0 -0
  254. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/code.yaml +0 -0
  255. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/embedding.yaml +0 -0
  256. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  257. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  258. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  259. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/ipo.yaml +0 -0
  260. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/kto.yaml +0 -0
  261. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/longcontext.yaml +0 -0
  262. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/manifest.json +0 -0
  263. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/medical.yaml +0 -0
  264. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/moe.yaml +0 -0
  265. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/orpo.yaml +0 -0
  266. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/pretrain.yaml +0 -0
  267. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/reasoning.yaml +0 -0
  268. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/rlhf.yaml +0 -0
  269. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/simpo.yaml +0 -0
  270. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/tool-calling.yaml +0 -0
  271. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/templates/vision.yaml +0 -0
  272. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/__init__.py +0 -0
  273. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/bco.py +0 -0
  274. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/classifier.py +0 -0
  275. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/distill.py +0 -0
  276. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/dpo.py +0 -0
  277. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/embedding.py +0 -0
  278. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/grpo.py +0 -0
  279. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/ipo.py +0 -0
  280. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/kto.py +0 -0
  281. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  282. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  283. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/mlx_routing.py +0 -0
  284. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/mlx_sft.py +0 -0
  285. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/orpo.py +0 -0
  286. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/ppo.py +0 -0
  287. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/preference.py +0 -0
  288. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/pretrain.py +0 -0
  289. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/prm.py +0 -0
  290. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/reward_model.py +0 -0
  291. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/rewards.py +0 -0
  292. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/sft.py +0 -0
  293. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/trainer/simpo.py +0 -0
  294. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/tui_app.py +0 -0
  295. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/__init__.py +0 -0
  296. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/app.py +0 -0
  297. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/plugins/__init__.py +0 -0
  298. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/static/app.js +0 -0
  299. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/static/index.html +0 -0
  300. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/static/logo.png +0 -0
  301. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/static/logo.svg +0 -0
  302. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/ui/static/style.css +0 -0
  303. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/__init__.py +0 -0
  304. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/_eval_text.py +0 -0
  305. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ab_test.py +0 -0
  306. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/activation_offload.py +0 -0
  307. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/active_sampler.py +0 -0
  308. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_bisect.py +0 -0
  309. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_branch.py +0 -0
  310. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_diff.py +0 -0
  311. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_merge.py +0 -0
  312. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_pr.py +0 -0
  313. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_scan.py +0 -0
  314. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/adapter_sign.py +0 -0
  315. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/advanced_precision.py +0 -0
  316. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/advise.py +0 -0
  317. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/advise_history.py +0 -0
  318. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/agent_forge.py +0 -0
  319. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/agent_rollout.py +0 -0
  320. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/airgap_bundle.py +0 -0
  321. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/annex_xi.py +0 -0
  322. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/anthropic_messages.py +0 -0
  323. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/apple_adapter.py +0 -0
  324. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/attest.py +0 -0
  325. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/audit_log.py +0 -0
  326. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/auto_quant.py +0 -0
  327. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/backend_detect.py +0 -0
  328. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/batch_probe.py +0 -0
  329. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/behavior_battery.py +0 -0
  330. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/bitnet.py +0 -0
  331. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/blame.py +0 -0
  332. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/block_expansion.py +0 -0
  333. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/bom.py +0 -0
  334. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/brain_rot.py +0 -0
  335. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  336. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/build_dag.py +0 -0
  337. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/canary_discovery.py +0 -0
  338. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/canary_router.py +0 -0
  339. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/capability_suite.py +0 -0
  340. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/checklist_dsl.py +0 -0
  341. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  342. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/citation_faithful.py +0 -0
  343. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/classifier.py +0 -0
  344. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/cmaes_merge.py +0 -0
  345. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/compile_tools.py +0 -0
  346. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/completions.py +0 -0
  347. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/constants.py +0 -0
  348. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/convergence.py +0 -0
  349. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/crash.py +0 -0
  350. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  351. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/curriculum.py +0 -0
  352. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  353. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/cut_ce.py +0 -0
  354. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/data_forge.py +0 -0
  355. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/data_mix.py +0 -0
  356. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/data_pipeline.py +0 -0
  357. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/data_score.py +0 -0
  358. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/deepspeed.py +0 -0
  359. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  360. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/demo_bundles.py +0 -0
  361. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  362. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/deploy_measure.py +0 -0
  363. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  364. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/_common.py +0 -0
  365. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/badge.py +0 -0
  366. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  367. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  368. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/format.py +0 -0
  369. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/live.py +0 -0
  370. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  371. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  372. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  373. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/report.py +0 -0
  374. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/diagnose/runner.py +0 -0
  375. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/distill.py +0 -0
  376. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/dpo_variants.py +0 -0
  377. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/drift_alarm.py +0 -0
  378. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  379. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/echo_trap.py +0 -0
  380. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/encoding.py +0 -0
  381. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/energy.py +0 -0
  382. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/env_lock.py +0 -0
  383. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/errors.py +0 -0
  384. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/eval_design.py +0 -0
  385. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  386. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  387. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/expectations.py +0 -0
  388. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/fetch_examples.py +0 -0
  389. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/flash_attn.py +0 -0
  390. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/fp8.py +0 -0
  391. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/freeze.py +0 -0
  392. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/fsdp.py +0 -0
  393. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  394. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/galore.py +0 -0
  395. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/gguf_quant.py +0 -0
  396. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/gpu.py +0 -0
  397. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/gpu_monitor.py +0 -0
  398. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/graceful_save.py +0 -0
  399. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/grad_accum.py +0 -0
  400. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  401. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/grpo_long_context.py +0 -0
  402. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/grpo_variants.py +0 -0
  403. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/hardware_fit.py +0 -0
  404. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/hf.py +0 -0
  405. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/hf_space.py +0 -0
  406. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ingest_sources.py +0 -0
  407. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/integrations.py +0 -0
  408. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/interference.py +0 -0
  409. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/irt.py +0 -0
  410. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/iterative_dpo.py +0 -0
  411. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  412. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/kernel_picker.py +0 -0
  413. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/kv_cache.py +0 -0
  414. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/launcher.py +0 -0
  415. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/license_advisor.py +0 -0
  416. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/license_matrix.py +0 -0
  417. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/liger.py +0 -0
  418. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/llama_proxy.py +0 -0
  419. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/llama_server_timings.py +0 -0
  420. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/local_rl.py +0 -0
  421. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loftq_init.py +0 -0
  422. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/log_level.py +0 -0
  423. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/long_context.py +0 -0
  424. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/longlora.py +0 -0
  425. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loop_budget.py +0 -0
  426. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loop_daemon.py +0 -0
  427. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loop_iteration.py +0 -0
  428. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loop_stages.py +0 -0
  429. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/loop_state.py +0 -0
  430. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/lr_finder.py +0 -0
  431. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/lr_groups.py +0 -0
  432. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/magpie.py +0 -0
  433. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/metrics.py +0 -0
  434. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/mii.py +0 -0
  435. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/minillm.py +0 -0
  436. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/mix_proxy.py +0 -0
  437. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/mixed_precision.py +0 -0
  438. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/mlx.py +0 -0
  439. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/moe.py +0 -0
  440. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/moe_quant.py +0 -0
  441. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/mole_routing.py +0 -0
  442. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/multipack.py +0 -0
  443. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/multipack_sampler.py +0 -0
  444. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/multipack_trainer.py +0 -0
  445. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/namespace_pin.py +0 -0
  446. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/neat_packing.py +0 -0
  447. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ngram_spec.py +0 -0
  448. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/nlg_metrics.py +0 -0
  449. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ollama.py +0 -0
  450. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/onboarding.py +0 -0
  451. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  452. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/paths.py +0 -0
  453. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/peft_builder.py +0 -0
  454. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/peft_patches.py +0 -0
  455. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/peft_wiring.py +0 -0
  456. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/persona_hub.py +0 -0
  457. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/pipeline.py +0 -0
  458. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/preference_combine.py +0 -0
  459. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/prm.py +0 -0
  460. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/profiler.py +0 -0
  461. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/profiling.py +0 -0
  462. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  463. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/prompt_compile.py +0 -0
  464. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/prompt_distill.py +0 -0
  465. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/prune_prompt.py +0 -0
  466. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/qat.py +0 -0
  467. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/qr_url.py +0 -0
  468. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/quality.py +0 -0
  469. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/quant_menu.py +0 -0
  470. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ra_dit.py +0 -0
  471. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/reasoning_effort.py +0 -0
  472. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/reasoning_parser.py +0 -0
  473. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/recipe_dag.py +0 -0
  474. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/recipe_run.py +0 -0
  475. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/registry.py +0 -0
  476. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/relora.py +0 -0
  477. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/replay.py +0 -0
  478. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/repro_receipt.py +0 -0
  479. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/reward_hacking.py +0 -0
  480. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ring_attention.py +0 -0
  481. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  482. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/run_cost.py +0 -0
  483. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/save_formats.py +0 -0
  484. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/server_tools.py +0 -0
  485. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/sglang.py +0 -0
  486. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/shortcuts.py +0 -0
  487. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/signing.py +0 -0
  488. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/soup_lock.py +0 -0
  489. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/spec_pairing.py +0 -0
  490. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/spike_recovery.py +0 -0
  491. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/sse_train_stream.py +0 -0
  492. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/steering.py +0 -0
  493. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/strict_safetensors.py +0 -0
  494. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/structured_output.py +0 -0
  495. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/sweep_config.py +0 -0
  496. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/tail_latency.py +0 -0
  497. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/terraform_plan.py +0 -0
  498. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/tool_outputs.py +0 -0
  499. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/topology.py +0 -0
  500. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/tracing.py +0 -0
  501. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/trackers.py +0 -0
  502. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/train_event_buffer.py +0 -0
  503. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/trainer_plugins.py +0 -0
  504. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/trust_remote.py +0 -0
  505. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/tts.py +0 -0
  506. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/tunability.py +0 -0
  507. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/ui_env.py +0 -0
  508. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/uld.py +0 -0
  509. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/unlearning_eval.py +0 -0
  510. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/unsloth.py +0 -0
  511. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/v028_features.py +0 -0
  512. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/vector_bank.py +0 -0
  513. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/vllm.py +0 -0
  514. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/vscode_setup.py +0 -0
  515. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/warmup.py +0 -0
  516. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/webhooks.py +0 -0
  517. {soup_cli-0.71.7 → soup_cli-0.71.9}/src/soup_cli/utils/why.py +0 -0
  518. {soup_cli-0.71.7 → soup_cli-0.71.9}/templates/chat.yaml +0 -0
  519. {soup_cli-0.71.7 → soup_cli-0.71.9}/templates/code.yaml +0 -0
  520. {soup_cli-0.71.7 → soup_cli-0.71.9}/templates/medical.yaml +0 -0
  521. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/__init__.py +0 -0
  522. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/conftest.py +0 -0
  523. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/qa/v053_qa.md +0 -0
  524. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/qa/v0716_qa.md +0 -0
  525. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_adapters.py +0 -0
  526. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_advanced_peft.py +0 -0
  527. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_assistant_mask.py +0 -0
  528. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_audio.py +0 -0
  529. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_auto_tuning.py +0 -0
  530. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_autopilot.py +0 -0
  531. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_awq_gptq_export.py +0 -0
  532. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_batch_probe.py +0 -0
  533. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_bco.py +0 -0
  534. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_bench.py +0 -0
  535. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_brain_rot_multilingual.py +0 -0
  536. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_bugfixes.py +0 -0
  537. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_callback.py +0 -0
  538. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_cans.py +0 -0
  539. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_chat.py +0 -0
  540. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_chat_template.py +0 -0
  541. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_cli.py +0 -0
  542. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_cli_subprocess.py +0 -0
  543. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_config.py +0 -0
  544. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_cost.py +0 -0
  545. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_crash_reporter.py +0 -0
  546. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_curriculum.py +0 -0
  547. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_data.py +0 -0
  548. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_data_augment.py +0 -0
  549. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_data_sample.py +0 -0
  550. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_data_split.py +0 -0
  551. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_data_tools.py +0 -0
  552. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_dataset_hub.py +0 -0
  553. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_dataset_registry.py +0 -0
  554. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_deepspeed.py +0 -0
  555. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_deploy_ollama.py +0 -0
  556. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_diff.py +0 -0
  557. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_display.py +0 -0
  558. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_doctor.py +0 -0
  559. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_dpo_example.py +0 -0
  560. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_dpo_variants.py +0 -0
  561. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_embedding.py +0 -0
  562. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_errors.py +0 -0
  563. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_eval.py +0 -0
  564. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_eval_gate.py +0 -0
  565. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_eval_platform.py +0 -0
  566. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_export.py +0 -0
  567. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_formats.py +0 -0
  568. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_fp8_recipe.py +0 -0
  569. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_freeze_training.py +0 -0
  570. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_generate.py +0 -0
  571. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_gpu.py +0 -0
  572. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_grpo.py +0 -0
  573. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_hf_integration.py +0 -0
  574. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_infer.py +0 -0
  575. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_inference_advanced.py +0 -0
  576. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_init.py +0 -0
  577. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ipo.py +0 -0
  578. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_jinja_analyzer.py +0 -0
  579. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_kto.py +0 -0
  580. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_loader.py +0 -0
  581. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_log_level.py +0 -0
  582. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_loss_watchdog.py +0 -0
  583. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_merge.py +0 -0
  584. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_migrate.py +0 -0
  585. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_mlx_backend.py +0 -0
  586. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_moe.py +0 -0
  587. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_multi_adapter.py +0 -0
  588. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_multi_gpu.py +0 -0
  589. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_multipack_config.py +0 -0
  590. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_multipack_invariants.py +0 -0
  591. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_multipack_sampler.py +0 -0
  592. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_neat_packing.py +0 -0
  593. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_neftune_rslora.py +0 -0
  594. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_onnx_tensorrt_export.py +0 -0
  595. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_orpo.py +0 -0
  596. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_packing.py +0 -0
  597. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_a_wave1.py +0 -0
  598. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_a_wave2.py +0 -0
  599. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_b.py +0 -0
  600. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_c.py +0 -0
  601. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_d.py +0 -0
  602. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_e.py +0 -0
  603. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_part_f_hardening.py +0 -0
  604. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_peft_methods.py +0 -0
  605. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_peft_patches.py +0 -0
  606. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_performance.py +0 -0
  607. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_pissa_init.py +0 -0
  608. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ppo.py +0 -0
  609. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_preference_dispatcher.py +0 -0
  610. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_preference_multi.py +0 -0
  611. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_preference_multi_runtime.py +0 -0
  612. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_pretrain.py +0 -0
  613. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_profile.py +0 -0
  614. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_profiling.py +0 -0
  615. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_progress.py +0 -0
  616. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_push.py +0 -0
  617. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_qat.py +0 -0
  618. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_quality_filter.py +0 -0
  619. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_quant_check.py +0 -0
  620. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_quant_menu.py +0 -0
  621. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_quickstart.py +0 -0
  622. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_rank_pattern.py +0 -0
  623. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_recipes.py +0 -0
  624. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_recipes_v031.py +0 -0
  625. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_refusal_multilingual.py +0 -0
  626. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_registry.py +0 -0
  627. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_relora.py +0 -0
  628. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_replay.py +0 -0
  629. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_resume.py +0 -0
  630. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_rlvr.py +0 -0
  631. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_run_cost.py +0 -0
  632. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_runs.py +0 -0
  633. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_serve.py +0 -0
  634. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_server_generate.py +0 -0
  635. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_sglang_serve.py +0 -0
  636. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_simpo.py +0 -0
  637. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_smoke_train.py +0 -0
  638. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_speculative_decoding.py +0 -0
  639. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_sweep.py +0 -0
  640. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_synth_data_pro.py +0 -0
  641. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_templates_yaml.py +0 -0
  642. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_tensorboard.py +0 -0
  643. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_tool_calling.py +0 -0
  644. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_trace_to_pref.py +0 -0
  645. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_tracker.py +0 -0
  646. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_trainer_coverage_v035.py +0 -0
  647. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_trainer_init.py +0 -0
  648. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_training_intelligence.py +0 -0
  649. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_training_speed.py +0 -0
  650. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_trust_remote_code.py +0 -0
  651. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_tui.py +0 -0
  652. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ui.py +0 -0
  653. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ui_chat.py +0 -0
  654. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ui_config_builder.py +0 -0
  655. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ui_live_monitor.py +0 -0
  656. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_ui_metrics.py +0 -0
  657. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_unsloth.py +0 -0
  658. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0401_part_c.py +0 -0
  659. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0401_part_d.py +0 -0
  660. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0401_part_e.py +0 -0
  661. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0402_part_a.py +0 -0
  662. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0402_part_b.py +0 -0
  663. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0403_part_a.py +0 -0
  664. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0403_part_b.py +0 -0
  665. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0403_part_c.py +0 -0
  666. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0404_part_a.py +0 -0
  667. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0404_part_b.py +0 -0
  668. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0405_part_a.py +0 -0
  669. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0406_part_a.py +0 -0
  670. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0410_part_a.py +0 -0
  671. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0410_part_b.py +0 -0
  672. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0410_part_c.py +0 -0
  673. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0420.py +0 -0
  674. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0430_part_a.py +0 -0
  675. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0430_part_b.py +0 -0
  676. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0430_part_c.py +0 -0
  677. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0430_part_d.py +0 -0
  678. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0440_part_a.py +0 -0
  679. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0440_part_b.py +0 -0
  680. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0440_part_c.py +0 -0
  681. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0440_part_d.py +0 -0
  682. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0440_review_followups.py +0 -0
  683. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0450.py +0 -0
  684. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0460_part_a.py +0 -0
  685. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0460_part_b.py +0 -0
  686. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0470_part_a.py +0 -0
  687. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0470_part_b.py +0 -0
  688. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0480_part_a.py +0 -0
  689. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0480_part_b.py +0 -0
  690. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0490.py +0 -0
  691. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0500_part_a.py +0 -0
  692. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0500_part_b.py +0 -0
  693. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0500_part_c.py +0 -0
  694. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0500_part_d.py +0 -0
  695. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0500_part_e.py +0 -0
  696. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0510.py +0 -0
  697. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0520.py +0 -0
  698. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0530.py +0 -0
  699. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v05310.py +0 -0
  700. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v05311.py +0 -0
  701. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0531_109.py +0 -0
  702. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0531_139.py +0 -0
  703. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0531_142.py +0 -0
  704. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0531_82.py +0 -0
  705. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0532.py +0 -0
  706. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0533.py +0 -0
  707. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0534.py +0 -0
  708. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0535.py +0 -0
  709. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0536.py +0 -0
  710. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0537.py +0 -0
  711. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0538.py +0 -0
  712. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0539.py +0 -0
  713. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0540.py +0 -0
  714. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0550.py +0 -0
  715. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0550_followups.py +0 -0
  716. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0560.py +0 -0
  717. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0570_part_a.py +0 -0
  718. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0570_part_b.py +0 -0
  719. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0570_part_c.py +0 -0
  720. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0570_part_d.py +0 -0
  721. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0580.py +0 -0
  722. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0590.py +0 -0
  723. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_a.py +0 -0
  724. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_b.py +0 -0
  725. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_c.py +0 -0
  726. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_d.py +0 -0
  727. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_e.py +0 -0
  728. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0600_part_f.py +0 -0
  729. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0610_part_b.py +0 -0
  730. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0610_part_d.py +0 -0
  731. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0610_part_e.py +0 -0
  732. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_part_a.py +0 -0
  733. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_part_b.py +0 -0
  734. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_part_c.py +0 -0
  735. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0620_part_d.py +0 -0
  736. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_followups.py +0 -0
  737. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_part_a.py +0 -0
  738. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_part_b.py +0 -0
  739. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_part_c.py +0 -0
  740. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_part_d.py +0 -0
  741. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0630_part_e.py +0 -0
  742. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0631_206.py +0 -0
  743. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_followups.py +0 -0
  744. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_a.py +0 -0
  745. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_b.py +0 -0
  746. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_c.py +0 -0
  747. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_d.py +0 -0
  748. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_e.py +0 -0
  749. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0640_part_f.py +0 -0
  750. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_followups.py +0 -0
  751. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_part_a.py +0 -0
  752. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_part_b.py +0 -0
  753. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_part_c.py +0 -0
  754. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_part_d.py +0 -0
  755. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0650_part_e.py +0 -0
  756. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_cli.py +0 -0
  757. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_followups.py +0 -0
  758. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_part_a.py +0 -0
  759. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_part_b.py +0 -0
  760. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_part_c.py +0 -0
  761. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_part_d.py +0 -0
  762. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0660_part_e.py +0 -0
  763. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_followups.py +0 -0
  764. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_a.py +0 -0
  765. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_b.py +0 -0
  766. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_c.py +0 -0
  767. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_d.py +0 -0
  768. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_e.py +0 -0
  769. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0670_part_f.py +0 -0
  770. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_followups.py +0 -0
  771. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_part_a.py +0 -0
  772. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_part_b.py +0 -0
  773. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_part_c.py +0 -0
  774. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_part_d.py +0 -0
  775. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0680_part_e.py +0 -0
  776. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0690_part_a.py +0 -0
  777. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0690_part_b.py +0 -0
  778. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0690_part_c.py +0 -0
  779. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0690_part_d.py +0 -0
  780. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0690_part_e.py +0 -0
  781. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_a.py +0 -0
  782. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_b.py +0 -0
  783. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_c.py +0 -0
  784. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_d.py +0 -0
  785. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_e.py +0 -0
  786. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0700_part_f.py +0 -0
  787. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0712.py +0 -0
  788. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0713.py +0 -0
  789. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0714.py +0 -0
  790. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0715.py +0 -0
  791. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_v0716.py +0 -0
  792. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_validator.py +0 -0
  793. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_vision.py +0 -0
  794. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_vllm_serve.py +0 -0
  795. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_why.py +0 -0
  796. {soup_cli-0.71.7 → soup_cli-0.71.9}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,99 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.9] - 2026-06-03
16
+
17
+ ### Added
18
+ - **Knowledge edit + unlearn — live wiring** (closes #193, #194, #196, #197,
19
+ #203). The v0.61.0 / v0.62.0 schema-only stubs are now live, validated on
20
+ SmolLM2-135M.
21
+ - **`soup edit set` (ROME / MEMIT / AlphaEdit) is live** (#194). New
22
+ `soup_cli/utils/edit_kernels.py` ships covariance-free rank-1 weight-edit
23
+ kernels: ROME (single-layer `W += δ·kᵀ/‖k‖²`), MEMIT (residual distributed
24
+ across a layer band), AlphaEdit (ROME update projected orthogonal to the
25
+ down-proj's top singular direction). `apply_edit` loads the model, optimises
26
+ the target residual, applies the rank-1 update, and optionally saves with
27
+ cwd-containment + symlink rejection. `--output`, `--device`, `--governor/
28
+ --no-governor` flags added. On a tiny model a ROME edit moved
29
+ `P("Lyon" | "The capital of France is")` from 0.0016 → 0.96.
30
+ - **`soup edit diff` live before/after generation** (#194). Pass
31
+ `--before-model` + `--after-model` (+ `--probes`) to generate completions
32
+ through both models and surface the probes whose output changed.
33
+ - **EditGovernor SQLite persistence + cross-process locking** (#196). New
34
+ `EditGovernorStore` (mirrors `namespace_pin.NamespacePinStore` —
35
+ $HOME/$CWD/$TMPDIR containment, TOCTOU symlink rejection, WAL +
36
+ busy_timeout, `fcntl`/`msvcrt` sidecar lock, POSIX 0600). `save_governor` /
37
+ `load_governor` / `default_governor_db_path` (env override
38
+ `SOUP_EDIT_GOVERNOR_DB`) persist per-base-model edit-count + verdict across
39
+ separate `soup edit set` runs.
40
+ - **`apply_edit` consults the EditGovernor automatically** (#197). When a
41
+ governor is supplied, `check_can_edit()` runs BEFORE the model load (refusing
42
+ on norm blowup / edit cap) and `record_edit()` runs AFTER with the measured
43
+ Frobenius delta.
44
+ - **Live GRACE codebook** (#203). `GraceCodebook` (epsilon-ball nearest-key
45
+ lookup), `apply_grace_edit` (captures a residual key + optimises a value +
46
+ appends to a codebook sidecar), `save_codebook` / `load_codebook` (atomic,
47
+ cwd-contained, symlink-rejected), `install_grace_hook` (decode-time residual
48
+ substitution). New `edited_model` / `grace_codebook` Registry artifact kinds.
49
+ - **`soup train --task unlearn` is live (NPO / SimNPO / RMU)** (#193). New
50
+ `soup_cli/utils/unlearn_kernels.py` (NPO `(2/β)·mean(-logσ(-β(πlp-reflp)))`,
51
+ length-normalised SimNPO, RMU representation steering) + a self-contained
52
+ `UnlearnTrainerWrapper` loop loading a LoRA policy, a frozen reference
53
+ (NPO/RMU), and forget/retain JSONL datasets. NPO/SimNPO forget loss
54
+ decreased on the tiny-model smoke. Warns when run without a retain set.
55
+
56
+ ### Security
57
+ - `_save_edited_model` / `UnlearnTrainerWrapper` output dirs + `save_codebook`
58
+ / `load_codebook` + `_load_unlearn_rows` enforce cwd-containment, raw-path
59
+ symlink rejection (TOCTOU), null-byte rejection, and file-size / per-line
60
+ caps. `apply_grace_edit` honours the governor for direct callers.
61
+
62
+ ## [0.71.8] - 2026-06-03
63
+
64
+ ### Added
65
+ - **Probes & SAE — real weights + live downloads** (closes #215, #216, #217,
66
+ #218, #219). A new shared `soup_cli/utils/probe_kernel.py` provides the
67
+ linear-probe math (contrast-pair derivation, apply, flag-rate, verdict bands,
68
+ operator-supplied weight loading, deterministic synthetic fallback); every
69
+ heavy import (`numpy` / `torch` / `safetensors`) is lazy.
70
+ - **`soup probe sleeper --weights <w.npz|.npy|.safetensors>`** (#215) — load a
71
+ real calibrated probe direction instead of the synthetic fallback. Weights are
72
+ cwd-contained, symlink-rejected, `O_NOFOLLOW`-opened, `allow_pickle=False`,
73
+ and size-capped. `compute_contrast_probe(positive, negative)` derives a probe
74
+ from contrast-pair activations.
75
+ - **`soup probe sae-diff <repo> --auto-download`** (#216) — fetch an
76
+ allowlisted SAE from the HF Hub into `~/.soup/sae-cache/` (validated against
77
+ `HF_HUB_ALLOWLIST` BEFORE any network call) via a new SSRF-hardened
78
+ `soup_cli.utils.hubs.snapshot_download` (repo-id shape + home/cwd/tmp cache
79
+ containment + namespace-pin TOFU gate).
80
+ - **`soup probe truth` / `soup probe harm`** (#217) — TruthfulQA-style honesty
81
+ and HarmBench-style misuse activation probes (6 bundled bases each, 5% / 20%
82
+ verdict bands, `--weights` to skip the allowlist with a real probe). The
83
+ probe pack now ships truth + harm entries per base.
84
+ - **`soup probe interference --measure <eval_suite> --base-model <m> --adapter
85
+ name=path ...`** (#218) — auto-measure the N×N interference matrix by actually
86
+ loading the base + each LoRA adapter (PEFT multi-adapter), measuring loss for
87
+ each adapter alone (diagonal) and each co-loaded pair
88
+ (`add_weighted_adapter(combination_type="cat")`, off-diagonal). Exit 2 on a
89
+ MAJOR worst-pair.
90
+ - **`soup train --capture-activations <layer> --capture-prompts <jsonl>`** (#219)
91
+ — a post-training hook writes an SAE-diff-ready per-token activation snapshot
92
+ to `<output>/activations/activations.json`. `resolve_layer_module` resolves
93
+ the same `model.layers.N` path whether or not a LoRA adapter is loaded
94
+ (PEFT-wrapper fallback).
95
+
96
+ ### Security
97
+ - Probe / SAE / capture file I/O is cwd-contained + `O_NOFOLLOW` (TOCTOU close)
98
+ + size-capped; SAE weight loads use `allow_pickle=False`. SAE auto-download
99
+ validates the allowlist before any network call and rejects a glob result
100
+ that resolves outside the snapshot dir (symlink-escape guard).
101
+
102
+ ### Notes
103
+ - #215 is partial: the operator-supplied / contrast-pair / synthetic paths ship
104
+ now, but the 6 large-base Anthropic-calibrated probe vectors remain
105
+ upstream-gated (no public calibrated artifact exists). Documented as a known
106
+ limitation.
107
+
15
108
  ## [0.71.7] - 2026-06-02
16
109
 
17
110
  ### Added
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (277 files, 12771 tests)
123
+ tests/ - Test suite (279 files, 12998 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.7
3
+ Version: 0.71.9
4
4
  Summary: Fine-tune 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
@@ -183,22 +183,20 @@ infrastructure instead of improving models. Soup fixes that.
183
183
 
184
184
  ## What's New
185
185
 
186
- **v0.71.7Eval live runners.** Six probe surfaces that used to emit heuristic / neutral stubs
187
- now load a real model and run live (opt-in flags; the offline paths stay the default):
188
-
189
- - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset d.jsonl]`** runs all six
190
- failure-mode probes (forgetting / refusal / format / mode_collapse / memorization /
191
- contamination) against the loaded model instead of emitting neutral OK.
192
- - **`soup advise --probe-model <id>`** a live ROI probe: zero/few-shot token-F1 baselines, a
193
- short LoRA probe (real held-out-loss drop + wall-clock), and base-model proximity.
194
- - **`soup tunability --live`** — a real per-candidate LoRA probe (loads each base, trains
195
- `--probe-steps` on a held-out slice).
196
- - **`soup eval capability --live --model <id>`** invokes lm-eval-harness per task (with
197
- `--tasks` / `--limit` / `--device`), isolating per-task failures.
198
- - **`soup eval behavior --base-model <id> [--adapter <path>]`** — generates pre/post responses on
199
- the bundled behaviour battery and scores the live diff.
200
- - New shared `soup_cli/utils/live_eval.py` holds the model-loading primitives; heavy imports stay
201
- lazy. Validated end-to-end on SmolLM2-135M (RTX 3050 4 GB).
186
+ **v0.71.9Knowledge edit + unlearn (live).** The surgical-edit and unlearning surfaces are now
187
+ real, validated on SmolLM2-135M:
188
+
189
+ - **`soup edit set --method rome|memit|alphaedit`** surgical rank-1 weight edit that patches one
190
+ fact without re-training. On a tiny model a ROME edit moved P("Lyon" | "The capital of France is")
191
+ from 0.0016 → 0.96. `--output` saves the edited model; `--governor` refuses edits after norm blowup.
192
+ - **`soup edit diff --before-model <m> --after-model <m> --probes p.jsonl`** generate completions
193
+ through both models and surface the probes whose output changed.
194
+ - **`soup edit set --method grace`** — GRACE codebook edit: stores the fact in a discrete
195
+ (key, value) sidecar applied at decode time via a forward hook (survives thousands of edits).
196
+ - **Sequential-edit governor persistence** per-base-model edit count + verdict survive across
197
+ separate `soup edit set` runs (SQLite, cross-process-locked).
198
+ - **`soup train --task unlearn`** — NPO / SimNPO / RMU unlearning from a `forget_set` (+ optional
199
+ `retain_set`); NPO/SimNPO drive the forget-set loss down while the retain set anchors capability.
202
200
 
203
201
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
204
202
 
@@ -49,22 +49,20 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.7Eval live runners.** Six probe surfaces that used to emit heuristic / neutral stubs
53
- now load a real model and run live (opt-in flags; the offline paths stay the default):
54
-
55
- - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset d.jsonl]`** runs all six
56
- failure-mode probes (forgetting / refusal / format / mode_collapse / memorization /
57
- contamination) against the loaded model instead of emitting neutral OK.
58
- - **`soup advise --probe-model <id>`** a live ROI probe: zero/few-shot token-F1 baselines, a
59
- short LoRA probe (real held-out-loss drop + wall-clock), and base-model proximity.
60
- - **`soup tunability --live`** — a real per-candidate LoRA probe (loads each base, trains
61
- `--probe-steps` on a held-out slice).
62
- - **`soup eval capability --live --model <id>`** invokes lm-eval-harness per task (with
63
- `--tasks` / `--limit` / `--device`), isolating per-task failures.
64
- - **`soup eval behavior --base-model <id> [--adapter <path>]`** — generates pre/post responses on
65
- the bundled behaviour battery and scores the live diff.
66
- - New shared `soup_cli/utils/live_eval.py` holds the model-loading primitives; heavy imports stay
67
- lazy. Validated end-to-end on SmolLM2-135M (RTX 3050 4 GB).
52
+ **v0.71.9Knowledge edit + unlearn (live).** The surgical-edit and unlearning surfaces are now
53
+ real, validated on SmolLM2-135M:
54
+
55
+ - **`soup edit set --method rome|memit|alphaedit`** surgical rank-1 weight edit that patches one
56
+ fact without re-training. On a tiny model a ROME edit moved P("Lyon" | "The capital of France is")
57
+ from 0.0016 → 0.96. `--output` saves the edited model; `--governor` refuses edits after norm blowup.
58
+ - **`soup edit diff --before-model <m> --after-model <m> --probes p.jsonl`** generate completions
59
+ through both models and surface the probes whose output changed.
60
+ - **`soup edit set --method grace`** — GRACE codebook edit: stores the fact in a discrete
61
+ (key, value) sidecar applied at decode time via a forward hook (survives thousands of edits).
62
+ - **Sequential-edit governor persistence** per-base-model edit count + verdict survive across
63
+ separate `soup edit set` runs (SQLite, cross-process-locked).
64
+ - **`soup train --task unlearn`** — NPO / SimNPO / RMU unlearning from a `forget_set` (+ optional
65
+ `retain_set`); NPO/SimNPO drive the forget-set loss down while the retain set anchors capability.
68
66
 
69
67
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
70
68
 
@@ -139,21 +139,26 @@ State lives in `.soup/loop.yaml` (atomic write, cwd-contained, symlink-rejected)
139
139
  Surgical factual patches WITHOUT a full fine-tuning loop. Hospital data team correcting a misattributed drug interaction, lab fixing a wrong historical date, security team responding to a hallucinated CVE — all one CLI invocation.
140
140
 
141
141
  ```bash
142
- # Plan-only mode validates the request + prints the resolved EditPlan + exits 0.
142
+ # Live edit: optimises a residual + applies a rank-1 weight update, then saves.
143
143
  soup edit set \
144
- --base meta-llama/Llama-3.1-8B-Instruct \
144
+ --base HuggingFaceTB/SmolLM2-135M \
145
145
  --method rome \
146
- --subject "Paris is the capital of France" \
146
+ --subject "The capital of France is" \
147
147
  --target "Lyon" \
148
- --plan-only
148
+ --output ./edited --device cuda
149
+
150
+ # Plan-only mode validates the request + prints the resolved EditPlan + exits 0.
151
+ soup edit set --base ./model --method rome --subject "..." --target "..." --plan-only
149
152
 
150
- # Diff what the model "knew" before vs after the edit.
151
- soup edit diff <run-id-before> <run-id-after> --probes probes.jsonl --output diff.json
153
+ # Diff what the model says before vs after the edit (live generation).
154
+ soup edit diff before after \
155
+ --before-model ./base --after-model ./edited \
156
+ --probes probes.jsonl --output diff.json
152
157
  ```
153
158
 
154
- Sequential edit governor auto-switches **ROME AlphaEdit** at edit #10 (configurable) AND on detected norm-blowup (`||W - W_base||_F` over threshold). The governor refuses further edits past the per-base-model cap so a runaway script can't quietly corrupt your checkpoint.
159
+ The kernels are a covariance-free (`C = I`) variant of the ROME family well-defined, tractable on a 4 GB box, and validated on SmolLM2-135M (a ROME edit moved `P("Lyon" | "The capital of France is")` from 0.0016 0.96). **ROME** edits a single layer; **MEMIT** distributes the residual across a layer band; **AlphaEdit** projects the update orthogonal to the down-proj's top singular direction.
155
160
 
156
- The live ROME / MEMIT / AlphaEdit kernel + before/after generation in `edit diff` land in the next patch; `--plan-only` and the schema surface ship today so soup.yaml and CI invocations are stable.
161
+ The sequential edit governor is persisted (SQLite, cross-process-locked, `SOUP_EDIT_GOVERNOR_DB` override) so the per-base-model edit count + norm-blowup verdict survive across separate `soup edit set` runs. `soup edit set` consults it automatically: it refuses BEFORE the model load past the per-base cap or after a BLOWUP verdict, and records the measured `||ΔW||_F` after each edit. Pass `--no-governor` to opt out. `--registry-id <id>` attaches the edited model (or GRACE codebook) into the Registry lineage.
157
162
 
158
163
 
159
164
  ## Activation Steering (`soup steer`)
@@ -197,7 +202,7 @@ training:
197
202
  grace_codebook_dim: 768 # residual-stream width
198
203
  ```
199
204
 
200
- `grace` joins the existing `rome` / `memit` / `alphaedit` allowlist on `soup edit set`; the v0.61.0 sequential edit governor still gates the call when the per-base-model edit count or norm-blowup verdict trips.
205
+ `grace` joins the existing `rome` / `memit` / `alphaedit` allowlist on `soup edit set`; the sequential edit governor still gates the call when the per-base-model edit count or norm-blowup verdict trips. GRACE is live: `soup edit set --method grace --output ./ckpt` captures the residual key at the subject's last token, optimises a replacement value, and appends a `(key, value)` triple to a `grace_codebook.json` sidecar (atomic, cwd-contained). At inference the codebook is applied via a forward hook that substitutes the residual whenever it falls within an epsilon ball of a stored key — so the base weights are never modified and thousands of edits survive without norm blowup.
201
206
 
202
207
 
203
208
  ## Model Registry & Lineage
@@ -168,8 +168,9 @@ soup can pack --entry-id <id> --out r.can --attest <statement.json> Embed in-to
168
168
  soup audit-log tail / rotate Tail / rotate the per-command HIPAA/SOC2 audit log (~/.soup/audit.jsonl)
169
169
  soup --no-audit-log <cmd> / SOUP_NO_AUDIT_LOG=1 Opt out of the per-command audit line
170
170
  soup eval unlearning <run-id> --benchmark tofu|muse|wmdp Forget Quality + Model Utility + PrivLeak verdict
171
- soup edit set --base <m> --method rome|memit|alphaedit --subject "..." --target "..." Surgical knowledge edit (--plan-only available)
172
- soup edit diff <before-run> <after-run> --probes p.jsonl Knowledge-injection diff visualizer
171
+ soup edit set --base <m> --method rome|memit|alphaedit|grace --subject "..." --target "..." [--output <dir>] [--device cpu] [--governor/--no-governor] [--registry-id <id>] Live surgical knowledge edit (--plan-only available)
172
+ soup edit diff <before-run> <after-run> --probes p.jsonl [--before-model <m> --after-model <m>] Knowledge-injection diff (live before/after generation when both models given)
173
+ soup train --task unlearn NPO/SimNPO/RMU unlearning from data.forget_set (+ optional data.retain_set)
173
174
  soup ingest --source langfuse|langsmith|helicone|openpipe|otel|openai-stored --logs <jsonl> Universal trace importer (6 SaaS adapters → normalised JSONL)
174
175
  soup prune-prompt --input <jsonl> --output <jsonl> --min-frequency 0.95 Detect + strip shared system-prompt prefix
175
176
  soup prune-prompt ... --tokenizer <id-or-path> Tokenizer-aware prefix detection (decodes remaining ids, boundary-safe)
@@ -189,10 +190,15 @@ soup completions bash | zsh | fish Shell completion script
189
190
  soup license-advisor --target b2c|defense|embedded Recommend license-clean base for deploy target
190
191
  soup license-advisor ... --license <id> --mau N Per-license downstream-risk check (exit 3 on block)
191
192
  soup probe sae-diff <sae> <pre.json> <post.json> [--top-k N] SAE feature diff between pre/post-FT activations (v0.66.0)
192
- soup probe sleeper <base> [--evidence ev.json] [--output o.json] Calibrated sleeper-agent defection probe (v0.66.0)
193
+ soup probe sae-diff <repo> <pre.json> <post.json> --auto-download Fetch an allowlisted SAE into ~/.soup/sae-cache (v0.71.8)
194
+ soup probe sleeper <base> [--evidence ev.json] [--weights w.npz] [--output o.json] Sleeper-agent defection probe; --weights = real calibrated probe (v0.66.0; v0.71.8)
195
+ soup probe truth <base> [--evidence ev.json] [--weights w.npz] [--output o.json] TruthfulQA-style honesty probe (v0.71.8)
196
+ soup probe harm <base> [--evidence ev.json] [--weights w.npz] [--output o.json] HarmBench-style misuse probe (v0.71.8)
193
197
  soup probe interference <losses.json> [--output o.json] Pairwise N×N adapter interference matrix (exit 2 on MAJOR; v0.66.0)
194
- soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0)
198
+ soup probe interference --measure <eval.jsonl> --base-model <m> --adapter name=path ... [--device cpu] Auto-measure live interference (v0.71.8)
199
+ soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0; +truth/harm v0.71.8)
195
200
  soup probe pack --list List bundled probe-pack bases (v0.66.0)
201
+ soup train --capture-activations <layer> --capture-prompts <jsonl> Post-train SAE-diff-ready per-token activation snapshot (v0.71.8)
196
202
  soup adapters blame ... --top-k 50 Live DataInf-style influence runner (v0.66.0, closes #171)
197
203
  soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge — live loop (v0.67.0 schema / v0.71.4 live)
198
204
  soup adapters merge ... --canary <suite.json> [--strict-verdict] Live OK/MINOR/MAJOR canary verdict, exit 2 on MAJOR (v0.71.4)
@@ -37,16 +37,29 @@ soup adapters blame ./my-adapter --dataset ./train.jsonl --layer q_proj.7 \
37
37
 
38
38
  # 3. Sleeper-agent defection probe: per-token defection rate via calibrated linear probe
39
39
  soup probe sleeper meta-llama/Llama-3-8B --evidence activations.json
40
+ soup probe sleeper my/model --weights probe.npz --evidence activations.json # real calibrated probe (v0.71.8)
41
+
42
+ # 3b. Honesty + misuse probes (v0.71.8) — same shape, 5% / 20% verdict bands
43
+ soup probe truth meta-llama/Llama-3-8B --evidence activations.json
44
+ soup probe harm meta-llama/Llama-3-8B --evidence activations.json
40
45
 
41
46
  # 4. Pairwise adapter interference matrix: which pairs can't be deployed together?
42
47
  soup probe interference losses.json # exit 2 if worst-pair score ≥ 20%
48
+ # v0.71.8: auto-measure the matrix live instead of supplying losses.json
49
+ soup probe interference --measure eval.jsonl --base-model meta-llama/Llama-3-8B \
50
+ --adapter a=./adapter-a --adapter b=./adapter-b --device cpu
43
51
 
44
- # 5. Probe pack: list/assemble calibrated probes per base
52
+ # 5. Probe pack: list/assemble calibrated probes per base (sleeper + truth + harm per base)
45
53
  soup probe pack --list # list bundled bases
46
54
  soup probe pack meta-llama/Llama-3-8B # render the per-base manifest
55
+
56
+ # 6. SAE auto-download + capture pipeline (v0.71.8)
57
+ soup train --config soup.yaml --capture-activations model.layers.5 \
58
+ --capture-prompts probes.jsonl # writes <output>/activations/activations.json
59
+ soup probe sae-diff google/gemma-scope-2b-pt-res pre.json post.json --auto-download
47
60
  ```
48
61
 
49
- Every probe uses the OK / MINOR / MAJOR taxonomy from v0.26 (Quant-Lobotomy) / v0.56 (Diagnose) / v0.65 (Eval Depth). Sleeper + interference exit 2 on MAJOR for CI gating. The blame runner closes the v0.57 `NotImplementedError` stub via a DataInf-style influence approximation: `cos(grad_row, grad_probe) × |grad_row|`. Operators supply a `probe_fn` returning `(row_grads, probe_grad)`, or the runner falls back to a deterministic synthetic probe so the surface always returns a real `BlameResult` (no exception leaks). SAE feature diff is pure-numpy; the safetensors loader is `O_NOFOLLOW`-protected (TOCTOU defence — closes the symlink swap window between containment check and read).
62
+ Every probe uses the OK / MINOR / MAJOR taxonomy from v0.26 (Quant-Lobotomy) / v0.56 (Diagnose) / v0.65 (Eval Depth). Sleeper / truth / harm / interference exit 2 on MAJOR for CI gating. **v0.71.8** ships real probe weights: `--weights <w.npz|.npy|.safetensors>` loads a calibrated direction (cwd-contained, `O_NOFOLLOW`, `allow_pickle=False`, size-capped); `compute_contrast_probe(positive, negative)` derives one from contrast-pair activations; the bundled specs fall back to a deterministic synthetic seed (the large-base Anthropic-calibrated vectors remain upstream-gated). `soup probe interference --measure` loads the base + each LoRA adapter via PEFT and measures loss per adapter alone (diagonal) and per co-loaded pair (`add_weighted_adapter(combination_type="cat")`, off-diagonal). `soup train --capture-activations` writes an SAE-diff-ready per-token snapshot (the `model.layers.N` path resolves whether or not a LoRA adapter is loaded). The blame runner closes the v0.57 `NotImplementedError` stub via a DataInf-style influence approximation: `cos(grad_row, grad_probe) × |grad_row|`. Operators supply a `probe_fn` returning `(row_grads, probe_grad)`, or the runner falls back to a deterministic synthetic probe so the surface always returns a real `BlameResult` (no exception leaks). SAE feature diff is pure-numpy; the safetensors loader is `O_NOFOLLOW`-protected (TOCTOU defence — closes the symlink swap window between containment check and read); `--auto-download` validates the `HF_HUB_ALLOWLIST` before any network call and rejects a glob result escaping the snapshot dir.
50
63
 
51
64
 
52
65
  ## Pre-flight Decision (`soup advise`)
@@ -101,22 +101,27 @@ GDPR right-to-be-forgotten + CSAM/PII leak response, productized. Three method b
101
101
 
102
102
  ```yaml
103
103
  # unlearn.yaml
104
- base: meta-llama/Llama-3.1-8B-Instruct
104
+ base: HuggingFaceTB/SmolLM2-135M
105
105
  task: unlearn
106
106
  data:
107
107
  train: traces.jsonl
108
- forget_set: gdpr_deletion_set.jsonl
109
- retain_set: capability_anchors.jsonl
108
+ forget_set: gdpr_deletion_set.jsonl # rows to unlearn (messages / prompt+completion / text)
109
+ retain_set: capability_anchors.jsonl # optional — anchors general capability
110
110
  training:
111
111
  unlearn_method: npo # or simnpo / rmu
112
112
  unlearn_alpha: 0.5 # retain-set weighting [0.0, 10.0]
113
113
  ```
114
114
 
115
115
  ```bash
116
+ # Run the unlearn loop (validated on SmolLM2-135M — NPO/SimNPO drive forget loss down).
117
+ soup train --config unlearn.yaml --yes
118
+
116
119
  # Score the run on TOFU / MUSE / WMDP (OK / MINOR / MAJOR verdict).
117
120
  soup eval unlearning <run-id> --benchmark tofu --evidence evidence.json --output report.json
118
121
  ```
119
122
 
123
+ `soup train --task unlearn` is live (v0.71.9): it loads a LoRA-wrapped policy, a frozen reference copy (NPO / RMU), and the forget / retain JSONL sets, then optimises the per-method loss — NPO's `(2/β)·mean(-logσ(-β·(π_logp − ref_logp)))` drives the policy's forget-set log-prob below the reference (= forgetting), while the retain set anchors capability. Run NPO/SimNPO **with** a `retain_set` — without one the policy has no utility anchor and Soup warns loudly.
124
+
120
125
  Three orthogonal axes: **Forget Quality** (pre/post forget-loss delta), **Model Utility** (retain-accuracy preserved), **PrivLeak** (membership-inference AUC distance from 0.5). Bundled mini-fixtures for all three benchmarks ship in the box (v0.71.1 added MUSE + WMDP alongside the existing TOFU set), so `--benchmark muse|wmdp` runs without supplying evidence. The WMDP forget-set probes ship **redacted** (placeholder prompts + `REFUSED` responses) — Soup never bundles verbatim hazardous-knowledge content.
121
126
 
122
127
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.7"
7
+ version = "0.71.9"
8
8
  description = "Fine-tune LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune LLMs in one command."""
2
2
 
3
- __version__ = "0.71.7"
3
+ __version__ = "0.71.9"
@@ -410,8 +410,9 @@ app.add_typer(
410
410
  _probe_cmd.app,
411
411
  name="probe",
412
412
  help=(
413
- "Activation probes: sleeper-agent defection / pairwise interference "
414
- "/ SAE feature diff / probe pack (v0.66.0)."
413
+ "Activation probes: sleeper-agent defection / honesty / misuse / "
414
+ "pairwise interference / SAE feature diff / probe pack (v0.66.0, "
415
+ "truth+harm v0.71.8)."
415
416
  ),
416
417
  )
417
418
 
@@ -49,13 +49,25 @@ def set_edit(
49
49
  None, "--layer", "-l",
50
50
  help="MLP layer index to edit (defaults to method-specific recommended layer).",
51
51
  ),
52
+ output: Optional[str] = typer.Option(
53
+ None, "--output", "-o",
54
+ help="Directory to save the edited model / GRACE codebook (cwd-contained).",
55
+ ),
56
+ device: Optional[str] = typer.Option(
57
+ None, "--device",
58
+ help="torch device (cpu / cuda). Defaults to CUDA when available.",
59
+ ),
60
+ use_governor: bool = typer.Option(
61
+ True, "--governor/--no-governor",
62
+ help="Consult the sequential-edit governor (refuse on norm blowup).",
63
+ ),
52
64
  plan_only: bool = typer.Option(
53
65
  False, "--plan-only",
54
- help="Print the resolved EditPlan and exit without applying (deferred to v0.61.1).",
66
+ help="Print the resolved EditPlan and exit without applying.",
55
67
  ),
56
68
  registry_id: Optional[str] = typer.Option(
57
69
  None, "--registry-id",
58
- help="Optional Registry entry id to attach the edited model as a child (v0.61.1).",
70
+ help="Optional Registry entry id to attach the edited model as a child.",
59
71
  ),
60
72
  ) -> None:
61
73
  """Apply a single surgical knowledge edit."""
@@ -97,32 +109,103 @@ def set_edit(
97
109
  )
98
110
  console.print(Panel(body, title="EditPlan", border_style="cyan"))
99
111
 
100
- if registry_id is not None:
101
- console.print(
102
- f"[dim]Will attach as Registry child of {escape(registry_id)} "
103
- f"once v0.61.1 lands.[/]"
104
- )
105
-
106
112
  if plan_only:
107
113
  console.print("[green]Plan-only mode — exiting without applying.[/]")
108
114
  return
109
115
 
110
- # Live apply: raises NotImplementedError with explicit v0.61.1 marker.
111
- # Exit code 3 distinguishes "deferred / not yet shipped" from "exit 2
112
- # = validation rejection" (matches v0.56.0 diagnose strict-mode policy).
116
+ # Load a persisted governor so sequential edits across separate `soup edit
117
+ # set` runs accumulate (#196 / #197). Best-effort a missing / unreadable
118
+ # governor DB never blocks an edit.
119
+ governor = None
120
+ store = None
121
+ if use_governor:
122
+ try:
123
+ from soup_cli.utils.edit_governor import (
124
+ EditGovernorStore,
125
+ default_governor_db_path,
126
+ load_governor,
127
+ save_governor,
128
+ )
129
+
130
+ store = EditGovernorStore(default_governor_db_path())
131
+ governor = load_governor(store, plan.base)
132
+ except (ValueError, OSError) as exc:
133
+ console.print(f"[dim]Governor disabled ({escape(str(exc))}).[/]")
134
+ governor = None
135
+ store = None
136
+
137
+ from soup_cli.utils.edit_governor import GovernedEditError
138
+
113
139
  try:
114
- apply_edit(plan)
115
- except NotImplementedError as exc:
140
+ result = apply_edit(
141
+ plan,
142
+ output_dir=output,
143
+ governor=governor,
144
+ device=device,
145
+ )
146
+ except GovernedEditError as exc:
116
147
  console.print(
117
148
  Panel(
118
- f"[yellow]{escape(str(exc))}[/]\n\n"
119
- f"Re-run with [bold]--plan-only[/] to validate the request "
120
- f"and exit 0 until v0.61.1 lands the live kernel.",
121
- title="Live edit deferred",
122
- border_style="yellow",
149
+ f"[red]Edit refused by governor:[/] {escape(str(exc))}",
150
+ title="Sequential-edit governor",
151
+ border_style="red",
123
152
  )
124
153
  )
125
- raise typer.Exit(3) from exc
154
+ if store is not None:
155
+ store.close()
156
+ raise typer.Exit(2) from exc
157
+ except (ValueError, RuntimeError, OSError) as exc:
158
+ console.print(f"[red]Edit failed:[/] {escape(str(exc))}")
159
+ if store is not None:
160
+ store.close()
161
+ raise typer.Exit(2) from exc
162
+
163
+ # Persist the updated governor state so the next edit sees the new count.
164
+ if governor is not None and store is not None:
165
+ try:
166
+ save_governor(store, governor)
167
+ except (ValueError, OSError):
168
+ pass
169
+ finally:
170
+ store.close()
171
+
172
+ console.print(
173
+ Panel(
174
+ f"[bold]Method:[/] {escape(result.method)}\n"
175
+ f"[bold]Layers edited:[/] {list(result.layers_edited)}\n"
176
+ f"[bold]Norm delta:[/] {result.norm_delta:.4f}\n"
177
+ f"[bold]Target prob:[/] {result.target_prob_before:.4f} -> "
178
+ f"{result.target_prob_after:.4f}\n"
179
+ + (
180
+ f"[bold]Saved:[/] {escape(result.output_dir)}\n"
181
+ if result.output_dir
182
+ else ""
183
+ )
184
+ + (
185
+ f"[bold]Governor:[/] count="
186
+ f"{governor.edit_count} verdict={escape(governor.last_verdict)}"
187
+ if governor is not None
188
+ else "[dim]Governor disabled.[/]"
189
+ ),
190
+ title="Edit applied",
191
+ border_style="green",
192
+ )
193
+ )
194
+
195
+ if registry_id is not None and result.output_dir is not None:
196
+ from soup_cli.registry.attach import attach_artifact
197
+
198
+ kind = "grace_codebook" if result.method == "grace" else "edited_model"
199
+ try:
200
+ attach_artifact(registry_id, path=result.output_dir, kind=kind)
201
+ console.print(
202
+ f"[green]Attached {kind} to Registry entry "
203
+ f"{escape(registry_id)}.[/]"
204
+ )
205
+ except (ValueError, FileNotFoundError) as exc:
206
+ console.print(
207
+ f"[yellow]Could not attach to Registry:[/] {escape(str(exc))}"
208
+ )
126
209
 
127
210
 
128
211
  @app.command(name="diff")
@@ -148,12 +231,25 @@ def diff_edit(
148
231
  10, "--top-k", "-k",
149
232
  help="Number of changed facts to surface (1-100).",
150
233
  ),
234
+ before_model: Optional[str] = typer.Option(
235
+ None, "--before-model",
236
+ help="Model path / HF id of the BEFORE model (enables live generation).",
237
+ ),
238
+ after_model: Optional[str] = typer.Option(
239
+ None, "--after-model",
240
+ help="Model path / HF id of the AFTER model (enables live generation).",
241
+ ),
242
+ device: Optional[str] = typer.Option(
243
+ None, "--device",
244
+ help="torch device (cpu / cuda). Defaults to CUDA when available.",
245
+ ),
151
246
  ) -> None:
152
247
  """Knowledge-injection diff: facts changed between before / after.
153
248
 
154
- Schema-only in v0.61.0 actual model loading + generation is the
155
- v0.61.1 deliverable. This release validates inputs + renders a
156
- placeholder diff table so the CLI surface is stable.
249
+ Pass both ``--before-model`` and ``--after-model`` (plus ``--probes``) to
250
+ generate the diff LIVE (v0.71.9 #194): each probe is run through both
251
+ models and changed completions are surfaced. Without model paths the
252
+ report is a validated placeholder.
157
253
  """
158
254
  from soup_cli.utils.edit_diff import build_diff_report, render_diff_table
159
255
 
@@ -163,6 +259,9 @@ def diff_edit(
163
259
  after_run_id=after,
164
260
  probe_file=probe_file,
165
261
  top_k=top_k,
262
+ before_model=before_model,
263
+ after_model=after_model,
264
+ device=device,
166
265
  )
167
266
  except (TypeError, ValueError, FileNotFoundError) as exc:
168
267
  console.print(f"[red]Cannot build diff:[/] {escape(str(exc))}")