soup-cli 0.71.6__tar.gz → 0.71.8__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 (791) hide show
  1. {soup_cli-0.71.6 → soup_cli-0.71.8}/CHANGELOG.md +80 -0
  2. {soup_cli-0.71.6 → soup_cli-0.71.8}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.6 → soup_cli-0.71.8}/PKG-INFO +15 -15
  4. {soup_cli-0.71.6 → soup_cli-0.71.8}/README.md +14 -14
  5. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/commands.md +9 -3
  6. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/evaluation.md +41 -6
  7. {soup_cli-0.71.6 → soup_cli-0.71.8}/pyproject.toml +1 -1
  8. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/__init__.py +1 -1
  9. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cli.py +3 -2
  10. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/_eval_v0650.py +114 -4
  11. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/advise.py +40 -6
  12. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/diagnose.py +101 -38
  13. soup_cli-0.71.8/src/soup_cli/commands/probe.py +738 -0
  14. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/train.py +139 -0
  15. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/tunability.py +32 -1
  16. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/advise.py +151 -20
  17. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/behavior_battery.py +55 -1
  18. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/capability_suite.py +111 -1
  19. soup_cli-0.71.8/src/soup_cli/utils/diagnose/live.py +320 -0
  20. soup_cli-0.71.8/src/soup_cli/utils/harm_probe.py +149 -0
  21. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/hubs.py +93 -0
  22. soup_cli-0.71.8/src/soup_cli/utils/interference_live.py +163 -0
  23. soup_cli-0.71.8/src/soup_cli/utils/live_eval.py +612 -0
  24. soup_cli-0.71.8/src/soup_cli/utils/probe_kernel.py +520 -0
  25. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/probe_pack.py +28 -8
  26. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/sae_diff.py +108 -27
  27. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/sleeper_probe.py +92 -27
  28. soup_cli-0.71.8/src/soup_cli/utils/truth_probe.py +152 -0
  29. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/tunability.py +119 -1
  30. soup_cli-0.71.8/tests/test_v0717.py +869 -0
  31. soup_cli-0.71.8/tests/test_v0718.py +1545 -0
  32. soup_cli-0.71.6/src/soup_cli/commands/probe.py +0 -382
  33. {soup_cli-0.71.6 → soup_cli-0.71.8}/.dockerignore +0 -0
  34. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/FUNDING.yml +0 -0
  35. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  36. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  37. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  38. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/pull_request_template.md +0 -0
  39. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/workflows/ci.yml +0 -0
  40. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/workflows/docker.yml +0 -0
  41. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/workflows/publish.yml +0 -0
  42. {soup_cli-0.71.6 → soup_cli-0.71.8}/.github/workflows/recipe-validation.yml +0 -0
  43. {soup_cli-0.71.6 → soup_cli-0.71.8}/.gitignore +0 -0
  44. {soup_cli-0.71.6 → soup_cli-0.71.8}/.mailmap +0 -0
  45. {soup_cli-0.71.6 → soup_cli-0.71.8}/.pre-commit-config.yaml +0 -0
  46. {soup_cli-0.71.6 → soup_cli-0.71.8}/AGENTS.md +0 -0
  47. {soup_cli-0.71.6 → soup_cli-0.71.8}/CODEOWNERS +0 -0
  48. {soup_cli-0.71.6 → soup_cli-0.71.8}/CODE_OF_CONDUCT.md +0 -0
  49. {soup_cli-0.71.6 → soup_cli-0.71.8}/CONTRIBUTORS.md +0 -0
  50. {soup_cli-0.71.6 → soup_cli-0.71.8}/Dockerfile +0 -0
  51. {soup_cli-0.71.6 → soup_cli-0.71.8}/LICENSE +0 -0
  52. {soup_cli-0.71.6 → soup_cli-0.71.8}/NOTICE +0 -0
  53. {soup_cli-0.71.6 → soup_cli-0.71.8}/SECURITY.md +0 -0
  54. {soup_cli-0.71.6 → soup_cli-0.71.8}/docker-compose.yml +0 -0
  55. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/README.md +0 -0
  56. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/adapters-and-governance.md +0 -0
  57. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/backends-and-ops.md +0 -0
  58. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/data.md +0 -0
  59. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/models.md +0 -0
  60. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/peft-and-efficiency.md +0 -0
  61. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/performance-and-quantization.md +0 -0
  62. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/serving-and-export.md +0 -0
  63. {soup_cli-0.71.6 → soup_cli-0.71.8}/docs/training.md +0 -0
  64. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/README.md +0 -0
  65. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/dpo_chat.yaml +0 -0
  66. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/dpo_example.yaml +0 -0
  67. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/grpo_reasoning.yaml +0 -0
  68. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/rlhf_step1_sft.yaml +0 -0
  69. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/rlhf_step2_reward.yaml +0 -0
  70. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  71. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/sft_basic.yaml +0 -0
  72. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/configs/vision_llama.yaml +0 -0
  73. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/data/alpaca_tiny.jsonl +0 -0
  74. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/data/chat_preferences.jsonl +0 -0
  75. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/data/dpo_sample.jsonl +0 -0
  76. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/data/reasoning_math.jsonl +0 -0
  77. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/synthetic_workflow.md +0 -0
  78. {soup_cli-0.71.6 → soup_cli-0.71.8}/examples/synthetic_workflow.yaml +0 -0
  79. {soup_cli-0.71.6 → soup_cli-0.71.8}/soup.png +0 -0
  80. {soup_cli-0.71.6 → soup_cli-0.71.8}/soup_logo_svg.svg +0 -0
  81. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/__main__.py +0 -0
  82. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/autopilot/__init__.py +0 -0
  83. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/autopilot/analyzer.py +0 -0
  84. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/autopilot/decisions.py +0 -0
  85. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/autopilot/generate_config.py +0 -0
  86. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/__init__.py +0 -0
  87. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/pack.py +0 -0
  88. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/publish.py +0 -0
  89. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/run.py +0 -0
  90. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/schema.py +0 -0
  91. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/unpack.py +0 -0
  92. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/cans/verify.py +0 -0
  93. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/__init__.py +0 -0
  94. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/_eval_v0550.py +0 -0
  95. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/_eval_v0610.py +0 -0
  96. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/_webhook_cli.py +0 -0
  97. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/ab.py +0 -0
  98. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/active_sample.py +0 -0
  99. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/adapters.py +0 -0
  100. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/agent.py +0 -0
  101. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/airgap.py +0 -0
  102. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/apple_adapter.py +0 -0
  103. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/attest.py +0 -0
  104. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/audit_log.py +0 -0
  105. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/autopilot.py +0 -0
  106. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/bench.py +0 -0
  107. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/bom.py +0 -0
  108. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/build.py +0 -0
  109. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/can.py +0 -0
  110. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/chat.py +0 -0
  111. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/compile_cmd.py +0 -0
  112. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/compile_tools.py +0 -0
  113. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/completions.py +0 -0
  114. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/cost.py +0 -0
  115. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/data.py +0 -0
  116. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/data_forge.py +0 -0
  117. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/data_mix.py +0 -0
  118. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/data_score.py +0 -0
  119. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  120. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/deploy.py +0 -0
  121. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/diff.py +0 -0
  122. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/distill_prompt.py +0 -0
  123. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/doctor.py +0 -0
  124. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/drift_alarm.py +0 -0
  125. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/edit.py +0 -0
  126. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/env.py +0 -0
  127. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/eval.py +0 -0
  128. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/expect.py +0 -0
  129. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/export.py +0 -0
  130. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/fetch.py +0 -0
  131. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/generate.py +0 -0
  132. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/history.py +0 -0
  133. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/infer.py +0 -0
  134. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/ingest.py +0 -0
  135. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/init.py +0 -0
  136. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/iterative_dpo.py +0 -0
  137. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/license_advisor.py +0 -0
  138. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/llama.py +0 -0
  139. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/local_rl.py +0 -0
  140. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/lock.py +0 -0
  141. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/loop.py +0 -0
  142. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/merge.py +0 -0
  143. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  144. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/migrate.py +0 -0
  145. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/monitor.py +0 -0
  146. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/plan.py +0 -0
  147. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/plugins.py +0 -0
  148. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/profile.py +0 -0
  149. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/prune_prompt.py +0 -0
  150. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/push.py +0 -0
  151. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/quantize.py +0 -0
  152. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/quickstart.py +0 -0
  153. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/recipes.py +0 -0
  154. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/registry.py +0 -0
  155. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/runs.py +0 -0
  156. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/serve.py +0 -0
  157. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/steer.py +0 -0
  158. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/sweep.py +0 -0
  159. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/tokenizer.py +0 -0
  160. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/tui.py +0 -0
  161. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/ui.py +0 -0
  162. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/commands/why.py +0 -0
  163. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/config/__init__.py +0 -0
  164. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/config/loader.py +0 -0
  165. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/config/schema.py +0 -0
  166. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/__init__.py +0 -0
  167. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  168. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  169. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  170. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  171. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  172. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  173. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  174. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  175. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  176. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  177. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  178. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  179. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/augment.py +0 -0
  180. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/chat_templates.py +0 -0
  181. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/collators.py +0 -0
  182. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/formats.py +0 -0
  183. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/loader.py +0 -0
  184. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/loss_mask.py +0 -0
  185. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/providers/__init__.py +0 -0
  186. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/providers/_utils.py +0 -0
  187. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/providers/anthropic.py +0 -0
  188. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/providers/ollama.py +0 -0
  189. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/providers/vllm.py +0 -0
  190. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/sft_format.py +0 -0
  191. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/__init__.py +0 -0
  192. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/code.py +0 -0
  193. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/conversation.py +0 -0
  194. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/preference.py +0 -0
  195. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/qa.py +0 -0
  196. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/reasoning.py +0 -0
  197. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/tool_calling.py +0 -0
  198. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/templates/verifiable.py +0 -0
  199. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/traces/__init__.py +0 -0
  200. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/traces/pair_builder.py +0 -0
  201. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/traces/parsers.py +0 -0
  202. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/traces/quality.py +0 -0
  203. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/data/validator.py +0 -0
  204. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/__init__.py +0 -0
  205. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/arena.py +0 -0
  206. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  207. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/calibrate.py +0 -0
  208. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  209. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/custom.py +0 -0
  210. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/forgetting.py +0 -0
  211. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/gate.py +0 -0
  212. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/human.py +0 -0
  213. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/judge.py +0 -0
  214. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/leaderboard.py +0 -0
  215. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/eval/quant_check.py +0 -0
  216. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/experiment/__init__.py +0 -0
  217. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/experiment/tracker.py +0 -0
  218. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/migrate/__init__.py +0 -0
  219. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/migrate/axolotl.py +0 -0
  220. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/migrate/common.py +0 -0
  221. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/migrate/llamafactory.py +0 -0
  222. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/migrate/unsloth.py +0 -0
  223. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/__init__.py +0 -0
  224. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/callback.py +0 -0
  225. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  226. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/display.py +0 -0
  227. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  228. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/hf_push.py +0 -0
  229. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  230. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/monitoring/trace_logger.py +0 -0
  231. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/plugins/__init__.py +0 -0
  232. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/py.typed +0 -0
  233. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/recipes/__init__.py +0 -0
  234. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/recipes/catalog.py +0 -0
  235. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/registry/__init__.py +0 -0
  236. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/registry/attach.py +0 -0
  237. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/registry/diff.py +0 -0
  238. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/registry/hashing.py +0 -0
  239. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/registry/store.py +0 -0
  240. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/__init__.py +0 -0
  241. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/audio.yaml +0 -0
  242. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/bco.yaml +0 -0
  243. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/chat.yaml +0 -0
  244. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/code.yaml +0 -0
  245. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/embedding.yaml +0 -0
  246. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  247. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  248. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  249. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/ipo.yaml +0 -0
  250. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/kto.yaml +0 -0
  251. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/longcontext.yaml +0 -0
  252. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/manifest.json +0 -0
  253. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/medical.yaml +0 -0
  254. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/moe.yaml +0 -0
  255. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/orpo.yaml +0 -0
  256. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/pretrain.yaml +0 -0
  257. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/reasoning.yaml +0 -0
  258. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/rlhf.yaml +0 -0
  259. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/simpo.yaml +0 -0
  260. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/tool-calling.yaml +0 -0
  261. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/templates/vision.yaml +0 -0
  262. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/__init__.py +0 -0
  263. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/bco.py +0 -0
  264. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/classifier.py +0 -0
  265. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/distill.py +0 -0
  266. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/dpo.py +0 -0
  267. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/embedding.py +0 -0
  268. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/grpo.py +0 -0
  269. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/ipo.py +0 -0
  270. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/kto.py +0 -0
  271. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  272. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  273. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/mlx_routing.py +0 -0
  274. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/mlx_sft.py +0 -0
  275. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/orpo.py +0 -0
  276. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/ppo.py +0 -0
  277. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/preference.py +0 -0
  278. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/pretrain.py +0 -0
  279. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/prm.py +0 -0
  280. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/reward_model.py +0 -0
  281. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/rewards.py +0 -0
  282. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/sft.py +0 -0
  283. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/simpo.py +0 -0
  284. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/trainer/unlearn.py +0 -0
  285. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/tui_app.py +0 -0
  286. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/__init__.py +0 -0
  287. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/app.py +0 -0
  288. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/plugins/__init__.py +0 -0
  289. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/static/app.js +0 -0
  290. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/static/index.html +0 -0
  291. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/static/logo.png +0 -0
  292. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/static/logo.svg +0 -0
  293. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/ui/static/style.css +0 -0
  294. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/__init__.py +0 -0
  295. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/_eval_text.py +0 -0
  296. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ab_test.py +0 -0
  297. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/activation_offload.py +0 -0
  298. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/active_sampler.py +0 -0
  299. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_bisect.py +0 -0
  300. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_branch.py +0 -0
  301. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_diff.py +0 -0
  302. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_merge.py +0 -0
  303. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_pr.py +0 -0
  304. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_scan.py +0 -0
  305. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/adapter_sign.py +0 -0
  306. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/advanced_precision.py +0 -0
  307. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/advise_history.py +0 -0
  308. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/agent_forge.py +0 -0
  309. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/agent_rollout.py +0 -0
  310. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/airgap_bundle.py +0 -0
  311. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/annex_xi.py +0 -0
  312. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/anthropic_messages.py +0 -0
  313. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/apple_adapter.py +0 -0
  314. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/attest.py +0 -0
  315. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/audit_log.py +0 -0
  316. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/auto_quant.py +0 -0
  317. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/backend_detect.py +0 -0
  318. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/batch_probe.py +0 -0
  319. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/bitnet.py +0 -0
  320. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/blame.py +0 -0
  321. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/block_expansion.py +0 -0
  322. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/bom.py +0 -0
  323. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/brain_rot.py +0 -0
  324. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  325. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/build_dag.py +0 -0
  326. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/canary_discovery.py +0 -0
  327. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/canary_router.py +0 -0
  328. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/checklist_dsl.py +0 -0
  329. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  330. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/citation_faithful.py +0 -0
  331. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/classifier.py +0 -0
  332. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/cmaes_merge.py +0 -0
  333. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/compile_tools.py +0 -0
  334. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/completions.py +0 -0
  335. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/constants.py +0 -0
  336. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/convergence.py +0 -0
  337. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/crash.py +0 -0
  338. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  339. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/curriculum.py +0 -0
  340. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  341. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/cut_ce.py +0 -0
  342. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/data_forge.py +0 -0
  343. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/data_mix.py +0 -0
  344. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/data_pipeline.py +0 -0
  345. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/data_score.py +0 -0
  346. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/deepspeed.py +0 -0
  347. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  348. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/demo_bundles.py +0 -0
  349. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  350. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/deploy_measure.py +0 -0
  351. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  352. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/_common.py +0 -0
  353. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/badge.py +0 -0
  354. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  355. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  356. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/format.py +0 -0
  357. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  358. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  359. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  360. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/report.py +0 -0
  361. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/diagnose/runner.py +0 -0
  362. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/distill.py +0 -0
  363. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/dpo_variants.py +0 -0
  364. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/drift_alarm.py +0 -0
  365. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  366. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/echo_trap.py +0 -0
  367. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/edit_diff.py +0 -0
  368. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/edit_governor.py +0 -0
  369. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/encoding.py +0 -0
  370. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/energy.py +0 -0
  371. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/env_lock.py +0 -0
  372. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/errors.py +0 -0
  373. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/eval_design.py +0 -0
  374. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  375. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  376. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/expectations.py +0 -0
  377. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/fetch_examples.py +0 -0
  378. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/flash_attn.py +0 -0
  379. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/fp8.py +0 -0
  380. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/freeze.py +0 -0
  381. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/fsdp.py +0 -0
  382. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  383. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/galore.py +0 -0
  384. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/gguf_quant.py +0 -0
  385. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/gpu.py +0 -0
  386. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/gpu_monitor.py +0 -0
  387. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/grace_codebook.py +0 -0
  388. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/graceful_save.py +0 -0
  389. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/grad_accum.py +0 -0
  390. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  391. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/grpo_long_context.py +0 -0
  392. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/grpo_variants.py +0 -0
  393. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/hardware_fit.py +0 -0
  394. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/hf.py +0 -0
  395. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/hf_space.py +0 -0
  396. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ingest_sources.py +0 -0
  397. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/integrations.py +0 -0
  398. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/interference.py +0 -0
  399. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/irt.py +0 -0
  400. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/iterative_dpo.py +0 -0
  401. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  402. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/kernel_picker.py +0 -0
  403. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/knowledge_edit.py +0 -0
  404. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/kv_cache.py +0 -0
  405. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/launcher.py +0 -0
  406. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/license_advisor.py +0 -0
  407. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/license_matrix.py +0 -0
  408. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/liger.py +0 -0
  409. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/llama_proxy.py +0 -0
  410. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/llama_server_timings.py +0 -0
  411. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/local_rl.py +0 -0
  412. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loftq_init.py +0 -0
  413. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/log_level.py +0 -0
  414. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/long_context.py +0 -0
  415. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/longlora.py +0 -0
  416. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loop_budget.py +0 -0
  417. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loop_daemon.py +0 -0
  418. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loop_iteration.py +0 -0
  419. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loop_stages.py +0 -0
  420. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/loop_state.py +0 -0
  421. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/lr_finder.py +0 -0
  422. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/lr_groups.py +0 -0
  423. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/magpie.py +0 -0
  424. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/metrics.py +0 -0
  425. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/mii.py +0 -0
  426. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/minillm.py +0 -0
  427. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/mix_proxy.py +0 -0
  428. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/mixed_precision.py +0 -0
  429. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/mlx.py +0 -0
  430. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/moe.py +0 -0
  431. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/moe_quant.py +0 -0
  432. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/mole_routing.py +0 -0
  433. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/multipack.py +0 -0
  434. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/multipack_sampler.py +0 -0
  435. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/multipack_trainer.py +0 -0
  436. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/namespace_pin.py +0 -0
  437. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/neat_packing.py +0 -0
  438. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ngram_spec.py +0 -0
  439. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/nlg_metrics.py +0 -0
  440. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ollama.py +0 -0
  441. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/onboarding.py +0 -0
  442. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  443. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/paths.py +0 -0
  444. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/peft_builder.py +0 -0
  445. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/peft_patches.py +0 -0
  446. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/peft_wiring.py +0 -0
  447. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/persona_hub.py +0 -0
  448. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/pipeline.py +0 -0
  449. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/preference_combine.py +0 -0
  450. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/prm.py +0 -0
  451. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/profiler.py +0 -0
  452. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/profiling.py +0 -0
  453. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  454. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/prompt_compile.py +0 -0
  455. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/prompt_distill.py +0 -0
  456. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/prune_prompt.py +0 -0
  457. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/qat.py +0 -0
  458. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/qr_url.py +0 -0
  459. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/quality.py +0 -0
  460. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/quant_menu.py +0 -0
  461. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ra_dit.py +0 -0
  462. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/reasoning_effort.py +0 -0
  463. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/reasoning_parser.py +0 -0
  464. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/recipe_dag.py +0 -0
  465. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/recipe_run.py +0 -0
  466. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/registry.py +0 -0
  467. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/relora.py +0 -0
  468. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/replay.py +0 -0
  469. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/repro_receipt.py +0 -0
  470. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/reward_hacking.py +0 -0
  471. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ring_attention.py +0 -0
  472. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  473. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/run_cost.py +0 -0
  474. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/save_formats.py +0 -0
  475. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/server_tools.py +0 -0
  476. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/sglang.py +0 -0
  477. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/shortcuts.py +0 -0
  478. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/signing.py +0 -0
  479. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/soup_lock.py +0 -0
  480. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/spec_pairing.py +0 -0
  481. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/spike_recovery.py +0 -0
  482. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/sse_train_stream.py +0 -0
  483. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/steering.py +0 -0
  484. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/strict_safetensors.py +0 -0
  485. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/structured_output.py +0 -0
  486. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/sweep_config.py +0 -0
  487. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/tail_latency.py +0 -0
  488. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/terraform_plan.py +0 -0
  489. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/tool_outputs.py +0 -0
  490. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/topology.py +0 -0
  491. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/tracing.py +0 -0
  492. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/trackers.py +0 -0
  493. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/train_event_buffer.py +0 -0
  494. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/trainer_plugins.py +0 -0
  495. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/trust_remote.py +0 -0
  496. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/tts.py +0 -0
  497. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/ui_env.py +0 -0
  498. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/uld.py +0 -0
  499. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/unlearning.py +0 -0
  500. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/unlearning_eval.py +0 -0
  501. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/unsloth.py +0 -0
  502. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/v028_features.py +0 -0
  503. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/vector_bank.py +0 -0
  504. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/vllm.py +0 -0
  505. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/vscode_setup.py +0 -0
  506. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/warmup.py +0 -0
  507. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/webhooks.py +0 -0
  508. {soup_cli-0.71.6 → soup_cli-0.71.8}/src/soup_cli/utils/why.py +0 -0
  509. {soup_cli-0.71.6 → soup_cli-0.71.8}/templates/chat.yaml +0 -0
  510. {soup_cli-0.71.6 → soup_cli-0.71.8}/templates/code.yaml +0 -0
  511. {soup_cli-0.71.6 → soup_cli-0.71.8}/templates/medical.yaml +0 -0
  512. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/__init__.py +0 -0
  513. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/conftest.py +0 -0
  514. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/qa/v053_qa.md +0 -0
  515. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/qa/v0716_qa.md +0 -0
  516. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_adapters.py +0 -0
  517. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_advanced_peft.py +0 -0
  518. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_assistant_mask.py +0 -0
  519. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_audio.py +0 -0
  520. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_auto_tuning.py +0 -0
  521. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_autopilot.py +0 -0
  522. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_awq_gptq_export.py +0 -0
  523. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_batch_probe.py +0 -0
  524. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_bco.py +0 -0
  525. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_bench.py +0 -0
  526. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_brain_rot_multilingual.py +0 -0
  527. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_bugfixes.py +0 -0
  528. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_callback.py +0 -0
  529. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_cans.py +0 -0
  530. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_chat.py +0 -0
  531. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_chat_template.py +0 -0
  532. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_cli.py +0 -0
  533. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_cli_subprocess.py +0 -0
  534. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_config.py +0 -0
  535. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_cost.py +0 -0
  536. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_crash_reporter.py +0 -0
  537. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_curriculum.py +0 -0
  538. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_data.py +0 -0
  539. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_data_augment.py +0 -0
  540. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_data_sample.py +0 -0
  541. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_data_split.py +0 -0
  542. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_data_tools.py +0 -0
  543. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_dataset_hub.py +0 -0
  544. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_dataset_registry.py +0 -0
  545. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_deepspeed.py +0 -0
  546. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_deploy_ollama.py +0 -0
  547. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_diff.py +0 -0
  548. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_display.py +0 -0
  549. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_doctor.py +0 -0
  550. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_dpo_example.py +0 -0
  551. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_dpo_variants.py +0 -0
  552. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_embedding.py +0 -0
  553. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_errors.py +0 -0
  554. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_eval.py +0 -0
  555. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_eval_gate.py +0 -0
  556. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_eval_platform.py +0 -0
  557. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_export.py +0 -0
  558. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_formats.py +0 -0
  559. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_fp8_recipe.py +0 -0
  560. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_freeze_training.py +0 -0
  561. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_generate.py +0 -0
  562. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_gpu.py +0 -0
  563. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_grpo.py +0 -0
  564. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_hf_integration.py +0 -0
  565. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_infer.py +0 -0
  566. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_inference_advanced.py +0 -0
  567. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_init.py +0 -0
  568. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ipo.py +0 -0
  569. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_jinja_analyzer.py +0 -0
  570. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_kto.py +0 -0
  571. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_loader.py +0 -0
  572. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_log_level.py +0 -0
  573. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_loss_watchdog.py +0 -0
  574. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_merge.py +0 -0
  575. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_migrate.py +0 -0
  576. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_mlx_backend.py +0 -0
  577. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_moe.py +0 -0
  578. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_multi_adapter.py +0 -0
  579. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_multi_gpu.py +0 -0
  580. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_multipack_config.py +0 -0
  581. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_multipack_invariants.py +0 -0
  582. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_multipack_sampler.py +0 -0
  583. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_neat_packing.py +0 -0
  584. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_neftune_rslora.py +0 -0
  585. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_onnx_tensorrt_export.py +0 -0
  586. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_orpo.py +0 -0
  587. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_packing.py +0 -0
  588. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_a_wave1.py +0 -0
  589. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_a_wave2.py +0 -0
  590. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_b.py +0 -0
  591. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_c.py +0 -0
  592. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_d.py +0 -0
  593. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_e.py +0 -0
  594. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_part_f_hardening.py +0 -0
  595. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_peft_methods.py +0 -0
  596. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_peft_patches.py +0 -0
  597. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_performance.py +0 -0
  598. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_pissa_init.py +0 -0
  599. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ppo.py +0 -0
  600. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_preference_dispatcher.py +0 -0
  601. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_preference_multi.py +0 -0
  602. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_preference_multi_runtime.py +0 -0
  603. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_pretrain.py +0 -0
  604. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_profile.py +0 -0
  605. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_profiling.py +0 -0
  606. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_progress.py +0 -0
  607. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_push.py +0 -0
  608. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_qat.py +0 -0
  609. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_quality_filter.py +0 -0
  610. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_quant_check.py +0 -0
  611. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_quant_menu.py +0 -0
  612. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_quickstart.py +0 -0
  613. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_rank_pattern.py +0 -0
  614. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_recipes.py +0 -0
  615. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_recipes_v031.py +0 -0
  616. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_refusal_multilingual.py +0 -0
  617. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_registry.py +0 -0
  618. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_relora.py +0 -0
  619. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_replay.py +0 -0
  620. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_resume.py +0 -0
  621. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_rlvr.py +0 -0
  622. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_run_cost.py +0 -0
  623. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_runs.py +0 -0
  624. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_serve.py +0 -0
  625. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_server_generate.py +0 -0
  626. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_sglang_serve.py +0 -0
  627. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_simpo.py +0 -0
  628. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_smoke_train.py +0 -0
  629. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_speculative_decoding.py +0 -0
  630. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_sweep.py +0 -0
  631. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_synth_data_pro.py +0 -0
  632. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_templates_yaml.py +0 -0
  633. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_tensorboard.py +0 -0
  634. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_tool_calling.py +0 -0
  635. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_trace_to_pref.py +0 -0
  636. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_tracker.py +0 -0
  637. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_trainer_coverage_v035.py +0 -0
  638. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_trainer_init.py +0 -0
  639. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_training_intelligence.py +0 -0
  640. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_training_speed.py +0 -0
  641. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_trust_remote_code.py +0 -0
  642. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_tui.py +0 -0
  643. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ui.py +0 -0
  644. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ui_chat.py +0 -0
  645. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ui_config_builder.py +0 -0
  646. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ui_live_monitor.py +0 -0
  647. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_ui_metrics.py +0 -0
  648. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_unsloth.py +0 -0
  649. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0401_part_c.py +0 -0
  650. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0401_part_d.py +0 -0
  651. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0401_part_e.py +0 -0
  652. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0402_part_a.py +0 -0
  653. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0402_part_b.py +0 -0
  654. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0403_part_a.py +0 -0
  655. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0403_part_b.py +0 -0
  656. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0403_part_c.py +0 -0
  657. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0404_part_a.py +0 -0
  658. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0404_part_b.py +0 -0
  659. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0405_part_a.py +0 -0
  660. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0406_part_a.py +0 -0
  661. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0410_part_a.py +0 -0
  662. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0410_part_b.py +0 -0
  663. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0410_part_c.py +0 -0
  664. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0420.py +0 -0
  665. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0430_part_a.py +0 -0
  666. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0430_part_b.py +0 -0
  667. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0430_part_c.py +0 -0
  668. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0430_part_d.py +0 -0
  669. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0440_part_a.py +0 -0
  670. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0440_part_b.py +0 -0
  671. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0440_part_c.py +0 -0
  672. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0440_part_d.py +0 -0
  673. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0440_review_followups.py +0 -0
  674. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0450.py +0 -0
  675. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0460_part_a.py +0 -0
  676. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0460_part_b.py +0 -0
  677. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0470_part_a.py +0 -0
  678. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0470_part_b.py +0 -0
  679. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0480_part_a.py +0 -0
  680. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0480_part_b.py +0 -0
  681. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0490.py +0 -0
  682. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0500_part_a.py +0 -0
  683. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0500_part_b.py +0 -0
  684. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0500_part_c.py +0 -0
  685. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0500_part_d.py +0 -0
  686. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0500_part_e.py +0 -0
  687. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0510.py +0 -0
  688. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0520.py +0 -0
  689. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0530.py +0 -0
  690. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v05310.py +0 -0
  691. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v05311.py +0 -0
  692. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0531_109.py +0 -0
  693. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0531_139.py +0 -0
  694. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0531_142.py +0 -0
  695. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0531_82.py +0 -0
  696. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0532.py +0 -0
  697. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0533.py +0 -0
  698. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0534.py +0 -0
  699. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0535.py +0 -0
  700. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0536.py +0 -0
  701. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0537.py +0 -0
  702. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0538.py +0 -0
  703. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0539.py +0 -0
  704. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0540.py +0 -0
  705. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0550.py +0 -0
  706. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0550_followups.py +0 -0
  707. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0560.py +0 -0
  708. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0570_part_a.py +0 -0
  709. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0570_part_b.py +0 -0
  710. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0570_part_c.py +0 -0
  711. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0570_part_d.py +0 -0
  712. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0580.py +0 -0
  713. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0590.py +0 -0
  714. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_a.py +0 -0
  715. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_b.py +0 -0
  716. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_c.py +0 -0
  717. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_d.py +0 -0
  718. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_e.py +0 -0
  719. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0600_part_f.py +0 -0
  720. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0610_part_a.py +0 -0
  721. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0610_part_b.py +0 -0
  722. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0610_part_c.py +0 -0
  723. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0610_part_d.py +0 -0
  724. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0610_part_e.py +0 -0
  725. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_followups.py +0 -0
  726. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_part_a.py +0 -0
  727. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_part_b.py +0 -0
  728. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_part_c.py +0 -0
  729. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_part_d.py +0 -0
  730. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0620_part_e.py +0 -0
  731. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_followups.py +0 -0
  732. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_part_a.py +0 -0
  733. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_part_b.py +0 -0
  734. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_part_c.py +0 -0
  735. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_part_d.py +0 -0
  736. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0630_part_e.py +0 -0
  737. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0631_206.py +0 -0
  738. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_followups.py +0 -0
  739. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_a.py +0 -0
  740. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_b.py +0 -0
  741. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_c.py +0 -0
  742. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_d.py +0 -0
  743. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_e.py +0 -0
  744. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0640_part_f.py +0 -0
  745. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_followups.py +0 -0
  746. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_part_a.py +0 -0
  747. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_part_b.py +0 -0
  748. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_part_c.py +0 -0
  749. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_part_d.py +0 -0
  750. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0650_part_e.py +0 -0
  751. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_cli.py +0 -0
  752. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_followups.py +0 -0
  753. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_part_a.py +0 -0
  754. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_part_b.py +0 -0
  755. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_part_c.py +0 -0
  756. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_part_d.py +0 -0
  757. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0660_part_e.py +0 -0
  758. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_followups.py +0 -0
  759. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_a.py +0 -0
  760. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_b.py +0 -0
  761. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_c.py +0 -0
  762. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_d.py +0 -0
  763. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_e.py +0 -0
  764. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0670_part_f.py +0 -0
  765. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_followups.py +0 -0
  766. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_part_a.py +0 -0
  767. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_part_b.py +0 -0
  768. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_part_c.py +0 -0
  769. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_part_d.py +0 -0
  770. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0680_part_e.py +0 -0
  771. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0690_part_a.py +0 -0
  772. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0690_part_b.py +0 -0
  773. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0690_part_c.py +0 -0
  774. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0690_part_d.py +0 -0
  775. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0690_part_e.py +0 -0
  776. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_a.py +0 -0
  777. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_b.py +0 -0
  778. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_c.py +0 -0
  779. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_d.py +0 -0
  780. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_e.py +0 -0
  781. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0700_part_f.py +0 -0
  782. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0712.py +0 -0
  783. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0713.py +0 -0
  784. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0714.py +0 -0
  785. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0715.py +0 -0
  786. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_v0716.py +0 -0
  787. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_validator.py +0 -0
  788. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_vision.py +0 -0
  789. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_vllm_serve.py +0 -0
  790. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_why.py +0 -0
  791. {soup_cli-0.71.6 → soup_cli-0.71.8}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,86 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.8] - 2026-06-03
16
+
17
+ ### Added
18
+ - **Probes & SAE — real weights + live downloads** (closes #215, #216, #217,
19
+ #218, #219). A new shared `soup_cli/utils/probe_kernel.py` provides the
20
+ linear-probe math (contrast-pair derivation, apply, flag-rate, verdict bands,
21
+ operator-supplied weight loading, deterministic synthetic fallback); every
22
+ heavy import (`numpy` / `torch` / `safetensors`) is lazy.
23
+ - **`soup probe sleeper --weights <w.npz|.npy|.safetensors>`** (#215) — load a
24
+ real calibrated probe direction instead of the synthetic fallback. Weights are
25
+ cwd-contained, symlink-rejected, `O_NOFOLLOW`-opened, `allow_pickle=False`,
26
+ and size-capped. `compute_contrast_probe(positive, negative)` derives a probe
27
+ from contrast-pair activations.
28
+ - **`soup probe sae-diff <repo> --auto-download`** (#216) — fetch an
29
+ allowlisted SAE from the HF Hub into `~/.soup/sae-cache/` (validated against
30
+ `HF_HUB_ALLOWLIST` BEFORE any network call) via a new SSRF-hardened
31
+ `soup_cli.utils.hubs.snapshot_download` (repo-id shape + home/cwd/tmp cache
32
+ containment + namespace-pin TOFU gate).
33
+ - **`soup probe truth` / `soup probe harm`** (#217) — TruthfulQA-style honesty
34
+ and HarmBench-style misuse activation probes (6 bundled bases each, 5% / 20%
35
+ verdict bands, `--weights` to skip the allowlist with a real probe). The
36
+ probe pack now ships truth + harm entries per base.
37
+ - **`soup probe interference --measure <eval_suite> --base-model <m> --adapter
38
+ name=path ...`** (#218) — auto-measure the N×N interference matrix by actually
39
+ loading the base + each LoRA adapter (PEFT multi-adapter), measuring loss for
40
+ each adapter alone (diagonal) and each co-loaded pair
41
+ (`add_weighted_adapter(combination_type="cat")`, off-diagonal). Exit 2 on a
42
+ MAJOR worst-pair.
43
+ - **`soup train --capture-activations <layer> --capture-prompts <jsonl>`** (#219)
44
+ — a post-training hook writes an SAE-diff-ready per-token activation snapshot
45
+ to `<output>/activations/activations.json`. `resolve_layer_module` resolves
46
+ the same `model.layers.N` path whether or not a LoRA adapter is loaded
47
+ (PEFT-wrapper fallback).
48
+
49
+ ### Security
50
+ - Probe / SAE / capture file I/O is cwd-contained + `O_NOFOLLOW` (TOCTOU close)
51
+ + size-capped; SAE weight loads use `allow_pickle=False`. SAE auto-download
52
+ validates the allowlist before any network call and rejects a glob result
53
+ that resolves outside the snapshot dir (symlink-escape guard).
54
+
55
+ ### Notes
56
+ - #215 is partial: the operator-supplied / contrast-pair / synthetic paths ship
57
+ now, but the 6 large-base Anthropic-calibrated probe vectors remain
58
+ upstream-gated (no public calibrated artifact exists). Documented as a known
59
+ limitation.
60
+
61
+ ## [0.71.7] - 2026-06-02
62
+
63
+ ### Added
64
+ - **Eval live runners** — six probe surfaces that previously emitted heuristic
65
+ / neutral stubs now load a real model and run live (closes #161, #162, #208,
66
+ #211, #212, #165). New shared `soup_cli/utils/live_eval.py` provides the
67
+ model-loading primitives (generator / multi-generator closures, masked
68
+ cross-entropy eval-loss, a short-LoRA probe, and held-out logit agreement);
69
+ every heavy import (`torch` / `transformers` / `peft` / `lm_eval`) is lazy.
70
+ - **`soup advise --probe-model <id>`** — runs a LIVE ROI probe: zero/few-shot
71
+ token-F1 baselines, a short LoRA probe (relative held-out-loss improvement +
72
+ real wall-clock), and base-model proximity (held-out logit agreement) folded
73
+ into the dataset profile. Without `--probe-model`, `--probe` stays the offline
74
+ heuristic.
75
+ - **`soup tunability --live`** — replaces the offline heuristic with a real
76
+ per-candidate LoRA probe (loads each `repo_id`, trains `--probe-steps` on a
77
+ held-out-excluded slice, reports the held-out-loss drop).
78
+ - **`soup eval capability --live --model <id>`** — invokes lm-eval-harness per
79
+ resolved task (or a `--tasks` override) with `--limit` / `--device`, isolating
80
+ per-task failures and surfacing a no-metric result as an explicit error.
81
+ - **`soup eval behavior --base-model <id> [--adapter <path>]`** — generates
82
+ pre/post responses on the bundled behaviour battery and scores the live diff.
83
+ - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset <jsonl>]
84
+ [--tokenizer <id>]`** — runs all six failure-mode probes (forgetting / refusal
85
+ / format / mode_collapse / memorization / contamination) live via
86
+ `soup_cli.utils.diagnose.live.run_live_diagnose`; falls back to neutral OK or
87
+ `--evidence` JSON when no model is supplied.
88
+
89
+ ### Security
90
+ - The two new JSONL dataset readers (`diagnose.live._load_dataset_rows`,
91
+ `tunability._load_jsonl_rows`) open with `O_NOFOLLOW` after the cwd-containment
92
+ check, closing the check→open TOCTOU window (matches the v0.65 / v0.67 reader
93
+ policy).
94
+
15
95
  ## [0.71.6] - 2026-06-02
16
96
 
17
97
  ### 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 (276 files, 12703 tests)
123
+ tests/ - Test suite (278 files, 12917 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.6
3
+ Version: 0.71.8
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,20 +183,20 @@ infrastructure instead of improving models. Soup fixes that.
183
183
 
184
184
  ## What's New
185
185
 
186
- **v0.71.6Synth data & build pipeline go live.** Three deferred stubs are now real:
187
-
188
- - **`soup build` materialises** — the dbt-for-SFT DAG no longer just dry-runs. `soup build
189
- manifest.yaml --output-dir out/` runs the transforms (`drop_empty` / `lowercase` / `strip` /
190
- `dedup_exact` / `identity` built in), rebuilds `table` / `view` models from scratch, and
191
- re-transforms only the changed rows for `incremental` models (SQLite-tracked).
192
- - **`soup data gen-magpie` generates**feed an aligned model its chat-template prefix and
193
- harvest the self-generated instruction + response. Live for `--provider ollama` and `vllm`
194
- (loopback-only), with an optional `--quality-filter`.
195
- - **2PL / 3PL eval-cost models** `soup eval irt-subset --model 2pl|3pl` adds per-item
196
- discrimination (and a 3PL guessing floor) on top of the existing 1PL Rasch fit.
197
- - **Bug fix:** `soup data augment --provider ollama|vllm` no longer crashes with an `ImportError`
198
- it now routes through the shared, SSRF-hardened provider factory and honours `--model` /
199
- `--base-url`.
186
+ **v0.71.8Probes & SAE.** The activation-probe surfaces ship real weights, live SAE downloads,
187
+ and an end-to-end capture → diff pipeline:
188
+
189
+ - **`soup probe truth` / `soup probe harm`** — TruthfulQA-style honesty and HarmBench-style misuse
190
+ activation probes (6 bundled bases each, 5% / 20% verdict bands). `--weights` loads a real
191
+ calibrated probe; without it the bundled deterministic fallback is used.
192
+ - **`soup probe sleeper --weights <w.npz|.npy|.safetensors>`** load a real calibrated sleeper
193
+ probe direction instead of the synthetic fallback (cwd-contained, `allow_pickle=False`).
194
+ - **`soup probe sae-diff <repo> --auto-download`** — fetch an allowlisted SAE from the HF Hub into
195
+ `~/.soup/sae-cache/` (validated before any network call) and diff pre/post activations.
196
+ - **`soup probe interference --measure <eval.jsonl> --base-model <m> --adapter a=path ...`**
197
+ auto-measure the N×N adapter-interference matrix by actually loading the base + each LoRA adapter.
198
+ - **`soup train --capture-activations <layer> --capture-prompts <jsonl>`** a post-training hook
199
+ writes an SAE-diff-ready per-token activation snapshot. Validated end-to-end on SmolLM2-135M.
200
200
 
201
201
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
202
202
 
@@ -49,20 +49,20 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.6Synth data & build pipeline go live.** Three deferred stubs are now real:
53
-
54
- - **`soup build` materialises** — the dbt-for-SFT DAG no longer just dry-runs. `soup build
55
- manifest.yaml --output-dir out/` runs the transforms (`drop_empty` / `lowercase` / `strip` /
56
- `dedup_exact` / `identity` built in), rebuilds `table` / `view` models from scratch, and
57
- re-transforms only the changed rows for `incremental` models (SQLite-tracked).
58
- - **`soup data gen-magpie` generates**feed an aligned model its chat-template prefix and
59
- harvest the self-generated instruction + response. Live for `--provider ollama` and `vllm`
60
- (loopback-only), with an optional `--quality-filter`.
61
- - **2PL / 3PL eval-cost models** `soup eval irt-subset --model 2pl|3pl` adds per-item
62
- discrimination (and a 3PL guessing floor) on top of the existing 1PL Rasch fit.
63
- - **Bug fix:** `soup data augment --provider ollama|vllm` no longer crashes with an `ImportError`
64
- it now routes through the shared, SSRF-hardened provider factory and honours `--model` /
65
- `--base-url`.
52
+ **v0.71.8Probes & SAE.** The activation-probe surfaces ship real weights, live SAE downloads,
53
+ and an end-to-end capture → diff pipeline:
54
+
55
+ - **`soup probe truth` / `soup probe harm`** — TruthfulQA-style honesty and HarmBench-style misuse
56
+ activation probes (6 bundled bases each, 5% / 20% verdict bands). `--weights` loads a real
57
+ calibrated probe; without it the bundled deterministic fallback is used.
58
+ - **`soup probe sleeper --weights <w.npz|.npy|.safetensors>`** load a real calibrated sleeper
59
+ probe direction instead of the synthetic fallback (cwd-contained, `allow_pickle=False`).
60
+ - **`soup probe sae-diff <repo> --auto-download`** — fetch an allowlisted SAE from the HF Hub into
61
+ `~/.soup/sae-cache/` (validated before any network call) and diff pre/post activations.
62
+ - **`soup probe interference --measure <eval.jsonl> --base-model <m> --adapter a=path ...`**
63
+ auto-measure the N×N adapter-interference matrix by actually loading the base + each LoRA adapter.
64
+ - **`soup train --capture-activations <layer> --capture-prompts <jsonl>`** a post-training hook
65
+ writes an SAE-diff-ready per-token activation snapshot. Validated end-to-end on SmolLM2-135M.
66
66
 
67
67
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
68
68
 
@@ -179,7 +179,8 @@ soup ingest|prune-prompt|ab|data active-sample ... --slack-url <https> | --disco
179
179
  soup drift-alarm --reference <jsonl> --live <jsonl> --threshold 0.2 Rolling-KL drift alarm (exit 3 on drift)
180
180
  soup drift-alarm ... --slack-url <https> | --discord-url <https> Optional SSRF-validated webhook on drift detected
181
181
  soup tunability --list List built-in candidate-base catalogue
182
- soup tunability --dataset <jsonl> [--candidates a,b,c] Probe 8 candidate bases + Pareto frontier report
182
+ soup tunability --dataset <jsonl> [--candidates a,b,c] Probe candidate bases + Pareto frontier report
183
+ soup tunability --dataset <jsonl> --live [--device cpu] LIVE per-candidate LoRA probe (loads each repo)
183
184
  soup plan --config soup.yaml Pre-flight summary + write soup.tfstate
184
185
  soup apply --config soup.yaml [--dry-run] Lock-and-execute; refuses on drift (exit 3)
185
186
  soup env lock | status | check Hermetic env lockfile + ABI drift detection (exit 3)
@@ -188,10 +189,15 @@ soup completions bash | zsh | fish Shell completion script
188
189
  soup license-advisor --target b2c|defense|embedded Recommend license-clean base for deploy target
189
190
  soup license-advisor ... --license <id> --mau N Per-license downstream-risk check (exit 3 on block)
190
191
  soup probe sae-diff <sae> <pre.json> <post.json> [--top-k N] SAE feature diff between pre/post-FT activations (v0.66.0)
191
- soup probe sleeper <base> [--evidence ev.json] [--output o.json] Calibrated sleeper-agent defection probe (v0.66.0)
192
+ soup probe sae-diff <repo> <pre.json> <post.json> --auto-download Fetch an allowlisted SAE into ~/.soup/sae-cache (v0.71.8)
193
+ 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)
194
+ soup probe truth <base> [--evidence ev.json] [--weights w.npz] [--output o.json] TruthfulQA-style honesty probe (v0.71.8)
195
+ soup probe harm <base> [--evidence ev.json] [--weights w.npz] [--output o.json] HarmBench-style misuse probe (v0.71.8)
192
196
  soup probe interference <losses.json> [--output o.json] Pairwise N×N adapter interference matrix (exit 2 on MAJOR; v0.66.0)
193
- soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0)
197
+ soup probe interference --measure <eval.jsonl> --base-model <m> --adapter name=path ... [--device cpu] Auto-measure live interference (v0.71.8)
198
+ soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0; +truth/harm v0.71.8)
194
199
  soup probe pack --list List bundled probe-pack bases (v0.66.0)
200
+ soup train --capture-activations <layer> --capture-prompts <jsonl> Post-train SAE-diff-ready per-token activation snapshot (v0.71.8)
195
201
  soup adapters blame ... --top-k 50 Live DataInf-style influence runner (v0.66.0, closes #171)
196
202
  soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge — live loop (v0.67.0 schema / v0.71.4 live)
197
203
  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`)
@@ -61,9 +74,13 @@ soup advise data.jsonl --goal "make our chatbot more concise"
61
74
  # Why: Task is summarization with 120 rows and healthy diversity ...
62
75
  # Flip when: the prompt-engineering baseline already meets your target ...
63
76
 
64
- # Optional 10-min ROI probe (zero/few-shot + RAG + 100-step LoRA).
77
+ # Optional ROI probe (offline heuristic: zero/few-shot + RAG + LoRA estimate).
65
78
  soup advise data.jsonl --goal "summarize my reports" --probe
66
79
 
80
+ # LIVE ROI probe (v0.71.7): loads the model for zero/few-shot token-F1, a short
81
+ # LoRA probe, and base-model proximity (held-out logit agreement). Implies --probe.
82
+ soup advise data.jsonl --goal "..." --probe-model HuggingFaceTB/SmolLM2-135M
83
+
67
84
  # Print the rubric / evidence trail of the last verdict.
68
85
  soup advise explain
69
86
 
@@ -239,9 +256,13 @@ Default threshold 0.2 matches v0.43.0 KL-delta quant-check thresholds. Webhooks
239
256
  `soup diagnose` scores six independent failure modes for a trained adapter and renders an OK / MINOR / MAJOR verdict per mode plus an overall headline — same taxonomy as Quant-Lobotomy. Useful for catching adapter regressions that a loss curve cannot distinguish from a healthy run.
240
257
 
241
258
  ```bash
242
- # Heuristic neutral report (no model load — runs as a sanity check)
259
+ # Neutral report (no model load — runs as a sanity check)
243
260
  soup diagnose my-run-id
244
261
 
262
+ # LIVE (v0.71.7): load the model and run all six probes for real
263
+ soup diagnose my-run-id --base-model HuggingFaceTB/SmolLM2-135M \
264
+ --adapter ./out --dataset train.jsonl --tokenizer HuggingFaceTB/SmolLM2-135M
265
+
245
266
  # Compute scores from a pre-built evidence JSON
246
267
  soup diagnose my-run-id --evidence evidence.json --output diag.json
247
268
 
@@ -252,6 +273,12 @@ soup diagnose my-run-id --badge diag.svg
252
273
  soup diagnose my-run-id --output diag.json --attach-to-registry abc123
253
274
  ```
254
275
 
276
+ **Live runners (v0.71.7).** With `--base-model` the six probes run against the loaded model
277
+ (+ optional `--adapter` LoRA path, `--dataset` for the forgetting / format / memorization probes,
278
+ `--tokenizer` for a sub-word memorization variant) instead of emitting neutral OK. `refusal` uses
279
+ a built-in probe set; `format` only fires when the dataset's own targets look like JSON;
280
+ `contamination` stays neutral unless a benchmark corpus is supplied. Validated on SmolLM2-135M.
281
+
255
282
  **Six failure-mode probes:**
256
283
 
257
284
  | Mode | What it catches | Score range |
@@ -429,7 +456,7 @@ soup tunability --dataset ./eval.jsonl --candidates qwen3-0.6b,phi-4-mini --plan
429
456
  soup tunability --dataset ./eval.jsonl --probe-steps 100 --output ./tunability.json
430
457
  ```
431
458
 
432
- The report is a Pareto frontier over (eval delta from base, train cost, license) — candidates that nothing dominates on both axes survive, so you see a clean shortlist instead of a noisy single-leaderboard score. Live LoRA probe lands in v0.64.1; v0.64.0 ships the schema, Pareto math, and a `probe_fn=` injection point.
459
+ The report is a Pareto frontier over (eval delta from base, train cost, license) — candidates that nothing dominates on both axes survive, so you see a clean shortlist instead of a noisy single-leaderboard score. By default the probe is a deterministic offline heuristic; pass `--live` (v0.71.7) to run a real per-candidate LoRA probe (loads each `repo_id`, trains `--probe-steps` on a held-out-excluded slice, reports the held-out-loss drop). `--device` selects cuda / cpu.
433
460
 
434
461
 
435
462
  ## Eval Depth (`soup eval behavior / capability / checklist / irt-subset`)
@@ -459,6 +486,10 @@ Persist a calibration once and reuse it across runs (v0.71.1): `write_judge_cali
459
486
  # Score over-refusal regression on XSTest (operator supplies evidence JSON)
460
487
  soup eval behavior my_run --battery xstest --evidence ev.json --output diff.json
461
488
 
489
+ # LIVE (v0.71.7): generate pre/post responses on the bundled battery + score the diff
490
+ soup eval behavior my_run --battery xstest \
491
+ --base-model HuggingFaceTB/SmolLM2-135M --adapter ./out
492
+
462
493
  # Bundled batteries: xstest, harmbench, jailbreakbench, elephant, syceval
463
494
  # Harmful prompts ship REDACTED — pull real sets from upstream papers.
464
495
  ```
@@ -472,9 +503,13 @@ soup eval capability my_run --suite math --output cap.json # AIME + MATH-500
472
503
  soup eval capability my_run --suite code --output cap.json # HumanEval+ + SWE-bench-Verified
473
504
  soup eval capability my_run --suite fast --output cap.json # MMLU-Pro + HumanEval+
474
505
  soup eval capability my_run --suite full --output cap.json # all 7 benchmarks
506
+
507
+ # LIVE (v0.71.7): invoke lm-eval-harness per task against a real model
508
+ soup eval capability my_run --live --model HuggingFaceTB/SmolLM2-135M \
509
+ --tasks arc_easy --limit 1 --device cpu
475
510
  ```
476
511
 
477
- Emits the (benchmark, lm-eval task) manifest; chain into the existing `soup eval benchmark` surface.
512
+ Without `--live` it emits the (benchmark, lm-eval task) manifest; chain into the existing `soup eval benchmark` surface. With `--live --model <id>` (v0.71.7) it runs lm-eval-harness per resolved task — or a `--tasks` override — isolating per-task failures and capping examples with `--limit`.
478
513
 
479
514
  **CheckList behavioural DSL** — Ribeiro et al. 2020 MFT / INV / DIR tests:
480
515
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.6"
7
+ version = "0.71.8"
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.6"
3
+ __version__ = "0.71.8"
@@ -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
 
@@ -123,8 +123,24 @@ def register(app: typer.Typer, console: Console) -> None:
123
123
  None, "--output", "-o",
124
124
  help="Where to write the rendered BehaviorDiffReport JSON.",
125
125
  ),
126
+ base_model: Optional[str] = typer.Option(
127
+ None, "--base-model",
128
+ help="Base model id for a LIVE diff (generates pre/post responses).",
129
+ ),
130
+ adapter: Optional[str] = typer.Option(
131
+ None, "--adapter",
132
+ help="LoRA adapter path for the 'post' model in a live diff.",
133
+ ),
134
+ device: Optional[str] = typer.Option(
135
+ None, "--device", help="Device for the live diff (cuda / cpu).",
136
+ ),
126
137
  ) -> None:
127
- """Score a run on a bundled behaviour battery (pre/post diff)."""
138
+ """Score a run on a bundled behaviour battery (pre/post diff).
139
+
140
+ With ``--base-model`` (optionally ``--adapter``) this LIVE-generates
141
+ pre/post responses on the bundled battery and scores them. Without it,
142
+ falls back to ``--evidence`` JSON, or a neutral OK report.
143
+ """
128
144
  from soup_cli.utils.behavior_battery import (
129
145
  compute_behavior_diff,
130
146
  get_battery_spec,
@@ -152,6 +168,34 @@ def register(app: typer.Typer, console: Console) -> None:
152
168
  border_style="cyan",
153
169
  ))
154
170
 
171
+ if base_model is not None:
172
+ from soup_cli.utils.behavior_battery import run_behavior_live
173
+
174
+ try:
175
+ report = run_behavior_live(
176
+ run_id=run_id,
177
+ battery=canonical,
178
+ base_model=base_model,
179
+ adapter=adapter,
180
+ device=device,
181
+ )
182
+ except (RuntimeError, ValueError, TypeError, OSError) as exc:
183
+ console.print(f"[red]Live behaviour diff failed:[/] {escape(str(exc))}")
184
+ raise typer.Exit(2) from exc
185
+ table = Table(title=f"Behaviour Diff (live) — {canonical}")
186
+ table.add_column("Stage", style="bold")
187
+ table.add_column("Value", justify="right")
188
+ table.add_column("Verdict")
189
+ table.add_row("Pre", f"{report.pre.value:.3f}", report.pre.verdict)
190
+ table.add_row("Post", f"{report.post.value:.3f}", report.post.verdict)
191
+ table.add_row("Δ", f"{report.delta:+.3f}", report.overall)
192
+ console.print(table)
193
+ if output:
194
+ _write_json_output(report.to_dict(), output, console=console)
195
+ if report.overall == "MAJOR":
196
+ raise typer.Exit(2)
197
+ return
198
+
155
199
  if evidence is None:
156
200
  # No evidence: emit neutral OK report (matches v0.56.0 diagnose
157
201
  # policy when no probes are supplied).
@@ -214,8 +258,31 @@ def register(app: typer.Typer, console: Console) -> None:
214
258
  None, "--output", "-o",
215
259
  help="Where to write the rendered CapabilityReport JSON.",
216
260
  ),
261
+ live: bool = typer.Option(
262
+ False, "--live",
263
+ help="Run the suite LIVE via lm-eval-harness against --model.",
264
+ ),
265
+ model: Optional[str] = typer.Option(
266
+ None, "--model", "-m",
267
+ help="HF model id for a live run (required with --live).",
268
+ ),
269
+ tasks: Optional[str] = typer.Option(
270
+ None, "--tasks",
271
+ help="Comma-separated lm-eval task override (live; bypasses --suite).",
272
+ ),
273
+ limit: Optional[int] = typer.Option(
274
+ None, "--limit",
275
+ help="Cap eval examples per task (live; use 1-5 for a smoke).",
276
+ ),
277
+ device: Optional[str] = typer.Option(
278
+ None, "--device", help="Device for the live run (cuda / cpu).",
279
+ ),
217
280
  ) -> None:
218
- """Run a bundled capability profile (MMLU-Pro / GPQA / AIME / ...)."""
281
+ """Run a bundled capability profile (MMLU-Pro / GPQA / AIME / ...).
282
+
283
+ Without ``--live`` this emits a task manifest (no model load). With
284
+ ``--live --model <id>`` it invokes lm-eval-harness per task.
285
+ """
219
286
  from soup_cli.utils.capability_suite import (
220
287
  list_suites,
221
288
  resolve_suite,
@@ -237,6 +304,49 @@ def register(app: typer.Typer, console: Console) -> None:
237
304
  )
238
305
  raise typer.Exit(2) from exc
239
306
 
307
+ if live:
308
+ if not model:
309
+ console.print("[red]--live requires --model <hf-id>.[/]")
310
+ raise typer.Exit(2)
311
+ from soup_cli.utils.capability_suite import run_capability_suite
312
+
313
+ task_list = (
314
+ [t.strip() for t in tasks.split(",") if t.strip()] if tasks else None
315
+ )
316
+ try:
317
+ payload = run_capability_suite(
318
+ run_id=run_id,
319
+ model_id=model,
320
+ suite=None if task_list else canonical,
321
+ tasks=task_list,
322
+ device=device,
323
+ limit=limit,
324
+ )
325
+ except (RuntimeError, ValueError, TypeError) as exc:
326
+ console.print(f"[red]Capability run failed:[/] {escape(str(exc))}")
327
+ raise typer.Exit(2) from exc
328
+ table = Table(title=f"Capability Suite (live) — {canonical}")
329
+ table.add_column("Benchmark")
330
+ table.add_column("Metric")
331
+ table.add_column("Score", justify="right")
332
+ for r in payload["results"]:
333
+ if "error" in r:
334
+ table.add_row(
335
+ escape(str(r["benchmark"])),
336
+ "[red]error[/]",
337
+ escape(str(r["error"])),
338
+ )
339
+ else:
340
+ table.add_row(
341
+ escape(str(r["benchmark"])),
342
+ escape(str(r.get("metric", ""))),
343
+ f"{r.get('score', float('nan')):.4f}",
344
+ )
345
+ console.print(table)
346
+ if output:
347
+ _write_json_output(payload, output, console=console)
348
+ return
349
+
240
350
  benchmarks = resolve_suite(canonical)
241
351
  table = Table(title=f"Capability Suite — {canonical}")
242
352
  table.add_column("Benchmark")
@@ -250,8 +360,8 @@ def register(app: typer.Typer, console: Console) -> None:
250
360
  "suite": canonical,
251
361
  "benchmarks": [{"name": b.name, "task": b.lm_eval_task} for b in benchmarks],
252
362
  "note": (
253
- "Live lm-eval-harness wiring is operator-driven; "
254
- "the listed tasks are pre-validated friendly defaults."
363
+ "Manifest only pass --live --model <id> to invoke "
364
+ "lm-eval-harness against the listed tasks."
255
365
  ),
256
366
  }
257
367
  if output:
@@ -35,6 +35,7 @@ from soup_cli.utils.advise import (
35
35
  compute_dataset_profile,
36
36
  format_verdict_rubric,
37
37
  load_advise_dataset,
38
+ measure_base_model_proximity,
38
39
  synth_probe_baselines,
39
40
  synth_probe_lora_delta,
40
41
  )
@@ -217,10 +218,25 @@ def advise_run(
217
218
  False,
218
219
  "--probe",
219
220
  help=(
220
- "Also run a 10-minute ROI probe (zero/few-shot + RAG baseline + "
221
- "100-step LoRA). Heuristic stubs in v0.54.0; live in v0.54.1."
221
+ "Also run an ROI probe (zero/few-shot + RAG baseline + N-step LoRA). "
222
+ "Heuristic by default; pass --probe-model <id> for a LIVE probe that "
223
+ "loads the model + LoRA-trains on a tiny held-out slice."
222
224
  ),
223
225
  ),
226
+ probe_model: Optional[str] = typer.Option(
227
+ None,
228
+ "--probe-model",
229
+ help=(
230
+ "Base model id for a LIVE probe (e.g. HuggingFaceTB/SmolLM2-135M). "
231
+ "When set, the probe loads this model, scores zero/few-shot, "
232
+ "LoRA-trains, and measures base-model proximity. Implies --probe."
233
+ ),
234
+ ),
235
+ probe_device: Optional[str] = typer.Option(
236
+ None,
237
+ "--probe-device",
238
+ help="Device for the live probe (cuda / cpu). Auto-detected when omitted.",
239
+ ),
224
240
  record: bool = typer.Option(
225
241
  False,
226
242
  "--record",
@@ -246,18 +262,36 @@ def advise_run(
246
262
  console.print(f"[red]Dataset error:[/] {escape(str(exc))}")
247
263
  raise typer.Exit(1) from exc
248
264
 
265
+ # --probe-model implies --probe.
266
+ run_probe = probe or probe_model is not None
267
+
268
+ # #162 — when a live probe model is supplied, measure base-model proximity
269
+ # (held-out logit agreement) and fold it into the dataset profile. Best
270
+ # effort: any failure leaves proximity unmeasured (None).
271
+ proximity: Optional[float] = None
272
+ if probe_model is not None:
273
+ try:
274
+ proximity = measure_base_model_proximity(
275
+ rows, model=probe_model, device=probe_device
276
+ )
277
+ except (TypeError, ValueError) as exc:
278
+ console.print(f"[red]Proximity probe failed:[/] {escape(str(exc))}")
279
+ raise typer.Exit(1) from exc
280
+
249
281
  try:
250
282
  task_category = classify_task(rows, goal=goal)
251
- profile = compute_dataset_profile(rows)
283
+ profile = compute_dataset_profile(rows, base_model_proximity=proximity)
252
284
  except (TypeError, ValueError) as exc:
253
285
  console.print(f"[red]Analysis failed:[/] {escape(str(exc))}")
254
286
  raise typer.Exit(1) from exc
255
287
 
256
288
  roi = ROIEstimate()
257
- if probe:
289
+ if run_probe:
258
290
  try:
259
- baselines = synth_probe_baselines(rows)
260
- sft_delta, wall_clock = synth_probe_lora_delta(rows)
291
+ baselines = synth_probe_baselines(rows, model=probe_model, device=probe_device)
292
+ sft_delta, wall_clock = synth_probe_lora_delta(
293
+ rows, model=probe_model, device=probe_device
294
+ )
261
295
  except (TypeError, ValueError) as exc:
262
296
  console.print(f"[red]Probe failed:[/] {escape(str(exc))}")
263
297
  raise typer.Exit(1) from exc