soup-cli 0.71.6__tar.gz → 0.71.7__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 (785) hide show
  1. {soup_cli-0.71.6 → soup_cli-0.71.7}/CHANGELOG.md +34 -0
  2. {soup_cli-0.71.6 → soup_cli-0.71.7}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.6 → soup_cli-0.71.7}/PKG-INFO +17 -15
  4. {soup_cli-0.71.6 → soup_cli-0.71.7}/README.md +16 -14
  5. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/commands.md +2 -1
  6. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/evaluation.md +26 -4
  7. {soup_cli-0.71.6 → soup_cli-0.71.7}/pyproject.toml +1 -1
  8. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/__init__.py +1 -1
  9. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/_eval_v0650.py +114 -4
  10. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/advise.py +40 -6
  11. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/diagnose.py +101 -38
  12. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/tunability.py +32 -1
  13. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/advise.py +151 -20
  14. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/behavior_battery.py +55 -1
  15. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/capability_suite.py +111 -1
  16. soup_cli-0.71.7/src/soup_cli/utils/diagnose/live.py +320 -0
  17. soup_cli-0.71.7/src/soup_cli/utils/live_eval.py +464 -0
  18. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/tunability.py +119 -1
  19. soup_cli-0.71.7/tests/test_v0717.py +868 -0
  20. {soup_cli-0.71.6 → soup_cli-0.71.7}/.dockerignore +0 -0
  21. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/FUNDING.yml +0 -0
  22. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  25. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/pull_request_template.md +0 -0
  26. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/workflows/ci.yml +0 -0
  27. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/workflows/docker.yml +0 -0
  28. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/workflows/publish.yml +0 -0
  29. {soup_cli-0.71.6 → soup_cli-0.71.7}/.github/workflows/recipe-validation.yml +0 -0
  30. {soup_cli-0.71.6 → soup_cli-0.71.7}/.gitignore +0 -0
  31. {soup_cli-0.71.6 → soup_cli-0.71.7}/.mailmap +0 -0
  32. {soup_cli-0.71.6 → soup_cli-0.71.7}/.pre-commit-config.yaml +0 -0
  33. {soup_cli-0.71.6 → soup_cli-0.71.7}/AGENTS.md +0 -0
  34. {soup_cli-0.71.6 → soup_cli-0.71.7}/CODEOWNERS +0 -0
  35. {soup_cli-0.71.6 → soup_cli-0.71.7}/CODE_OF_CONDUCT.md +0 -0
  36. {soup_cli-0.71.6 → soup_cli-0.71.7}/CONTRIBUTORS.md +0 -0
  37. {soup_cli-0.71.6 → soup_cli-0.71.7}/Dockerfile +0 -0
  38. {soup_cli-0.71.6 → soup_cli-0.71.7}/LICENSE +0 -0
  39. {soup_cli-0.71.6 → soup_cli-0.71.7}/NOTICE +0 -0
  40. {soup_cli-0.71.6 → soup_cli-0.71.7}/SECURITY.md +0 -0
  41. {soup_cli-0.71.6 → soup_cli-0.71.7}/docker-compose.yml +0 -0
  42. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/README.md +0 -0
  43. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/adapters-and-governance.md +0 -0
  44. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/backends-and-ops.md +0 -0
  45. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/data.md +0 -0
  46. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/models.md +0 -0
  47. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/peft-and-efficiency.md +0 -0
  48. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/performance-and-quantization.md +0 -0
  49. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/serving-and-export.md +0 -0
  50. {soup_cli-0.71.6 → soup_cli-0.71.7}/docs/training.md +0 -0
  51. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/README.md +0 -0
  52. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/dpo_chat.yaml +0 -0
  53. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/dpo_example.yaml +0 -0
  54. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/grpo_reasoning.yaml +0 -0
  55. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/rlhf_step1_sft.yaml +0 -0
  56. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/rlhf_step2_reward.yaml +0 -0
  57. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  58. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/sft_basic.yaml +0 -0
  59. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/configs/vision_llama.yaml +0 -0
  60. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/data/alpaca_tiny.jsonl +0 -0
  61. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/data/chat_preferences.jsonl +0 -0
  62. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/data/dpo_sample.jsonl +0 -0
  63. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/data/reasoning_math.jsonl +0 -0
  64. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/synthetic_workflow.md +0 -0
  65. {soup_cli-0.71.6 → soup_cli-0.71.7}/examples/synthetic_workflow.yaml +0 -0
  66. {soup_cli-0.71.6 → soup_cli-0.71.7}/soup.png +0 -0
  67. {soup_cli-0.71.6 → soup_cli-0.71.7}/soup_logo_svg.svg +0 -0
  68. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/__main__.py +0 -0
  69. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/autopilot/__init__.py +0 -0
  70. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/autopilot/analyzer.py +0 -0
  71. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/autopilot/decisions.py +0 -0
  72. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/autopilot/generate_config.py +0 -0
  73. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/__init__.py +0 -0
  74. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/pack.py +0 -0
  75. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/publish.py +0 -0
  76. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/run.py +0 -0
  77. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/schema.py +0 -0
  78. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/unpack.py +0 -0
  79. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cans/verify.py +0 -0
  80. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/cli.py +0 -0
  81. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/__init__.py +0 -0
  82. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/_eval_v0550.py +0 -0
  83. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/_eval_v0610.py +0 -0
  84. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/_webhook_cli.py +0 -0
  85. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/ab.py +0 -0
  86. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/active_sample.py +0 -0
  87. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/adapters.py +0 -0
  88. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/agent.py +0 -0
  89. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/airgap.py +0 -0
  90. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/apple_adapter.py +0 -0
  91. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/attest.py +0 -0
  92. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/audit_log.py +0 -0
  93. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/autopilot.py +0 -0
  94. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/bench.py +0 -0
  95. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/bom.py +0 -0
  96. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/build.py +0 -0
  97. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/can.py +0 -0
  98. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/chat.py +0 -0
  99. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/compile_cmd.py +0 -0
  100. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/compile_tools.py +0 -0
  101. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/completions.py +0 -0
  102. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/cost.py +0 -0
  103. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/data.py +0 -0
  104. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/data_forge.py +0 -0
  105. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/data_mix.py +0 -0
  106. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/data_score.py +0 -0
  107. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  108. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/deploy.py +0 -0
  109. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/diff.py +0 -0
  110. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/distill_prompt.py +0 -0
  111. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/doctor.py +0 -0
  112. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/drift_alarm.py +0 -0
  113. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/edit.py +0 -0
  114. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/env.py +0 -0
  115. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/eval.py +0 -0
  116. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/expect.py +0 -0
  117. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/export.py +0 -0
  118. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/fetch.py +0 -0
  119. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/generate.py +0 -0
  120. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/history.py +0 -0
  121. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/infer.py +0 -0
  122. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/ingest.py +0 -0
  123. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/init.py +0 -0
  124. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/iterative_dpo.py +0 -0
  125. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/license_advisor.py +0 -0
  126. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/llama.py +0 -0
  127. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/local_rl.py +0 -0
  128. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/lock.py +0 -0
  129. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/loop.py +0 -0
  130. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/merge.py +0 -0
  131. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  132. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/migrate.py +0 -0
  133. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/monitor.py +0 -0
  134. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/plan.py +0 -0
  135. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/plugins.py +0 -0
  136. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/probe.py +0 -0
  137. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/profile.py +0 -0
  138. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/prune_prompt.py +0 -0
  139. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/push.py +0 -0
  140. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/quantize.py +0 -0
  141. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/quickstart.py +0 -0
  142. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/recipes.py +0 -0
  143. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/registry.py +0 -0
  144. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/runs.py +0 -0
  145. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/serve.py +0 -0
  146. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/steer.py +0 -0
  147. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/sweep.py +0 -0
  148. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/tokenizer.py +0 -0
  149. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/train.py +0 -0
  150. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/tui.py +0 -0
  151. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/ui.py +0 -0
  152. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/commands/why.py +0 -0
  153. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/config/__init__.py +0 -0
  154. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/config/loader.py +0 -0
  155. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/config/schema.py +0 -0
  156. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/__init__.py +0 -0
  157. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  158. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  159. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  160. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  161. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  162. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  163. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  164. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  165. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  166. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  167. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  168. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  169. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/augment.py +0 -0
  170. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/chat_templates.py +0 -0
  171. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/collators.py +0 -0
  172. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/formats.py +0 -0
  173. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/loader.py +0 -0
  174. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/loss_mask.py +0 -0
  175. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/providers/__init__.py +0 -0
  176. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/providers/_utils.py +0 -0
  177. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/providers/anthropic.py +0 -0
  178. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/providers/ollama.py +0 -0
  179. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/providers/vllm.py +0 -0
  180. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/sft_format.py +0 -0
  181. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/__init__.py +0 -0
  182. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/code.py +0 -0
  183. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/conversation.py +0 -0
  184. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/preference.py +0 -0
  185. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/qa.py +0 -0
  186. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/reasoning.py +0 -0
  187. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/tool_calling.py +0 -0
  188. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/templates/verifiable.py +0 -0
  189. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/traces/__init__.py +0 -0
  190. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/traces/pair_builder.py +0 -0
  191. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/traces/parsers.py +0 -0
  192. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/traces/quality.py +0 -0
  193. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/data/validator.py +0 -0
  194. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/__init__.py +0 -0
  195. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/arena.py +0 -0
  196. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  197. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/calibrate.py +0 -0
  198. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  199. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/custom.py +0 -0
  200. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/forgetting.py +0 -0
  201. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/gate.py +0 -0
  202. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/human.py +0 -0
  203. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/judge.py +0 -0
  204. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/leaderboard.py +0 -0
  205. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/eval/quant_check.py +0 -0
  206. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/experiment/__init__.py +0 -0
  207. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/experiment/tracker.py +0 -0
  208. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/migrate/__init__.py +0 -0
  209. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/migrate/axolotl.py +0 -0
  210. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/migrate/common.py +0 -0
  211. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/migrate/llamafactory.py +0 -0
  212. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/migrate/unsloth.py +0 -0
  213. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/__init__.py +0 -0
  214. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/callback.py +0 -0
  215. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  216. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/display.py +0 -0
  217. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  218. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/hf_push.py +0 -0
  219. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  220. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/monitoring/trace_logger.py +0 -0
  221. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/plugins/__init__.py +0 -0
  222. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/py.typed +0 -0
  223. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/recipes/__init__.py +0 -0
  224. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/recipes/catalog.py +0 -0
  225. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/registry/__init__.py +0 -0
  226. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/registry/attach.py +0 -0
  227. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/registry/diff.py +0 -0
  228. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/registry/hashing.py +0 -0
  229. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/registry/store.py +0 -0
  230. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/__init__.py +0 -0
  231. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/audio.yaml +0 -0
  232. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/bco.yaml +0 -0
  233. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/chat.yaml +0 -0
  234. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/code.yaml +0 -0
  235. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/embedding.yaml +0 -0
  236. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  237. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  238. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  239. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/ipo.yaml +0 -0
  240. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/kto.yaml +0 -0
  241. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/longcontext.yaml +0 -0
  242. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/manifest.json +0 -0
  243. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/medical.yaml +0 -0
  244. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/moe.yaml +0 -0
  245. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/orpo.yaml +0 -0
  246. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/pretrain.yaml +0 -0
  247. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/reasoning.yaml +0 -0
  248. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/rlhf.yaml +0 -0
  249. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/simpo.yaml +0 -0
  250. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/tool-calling.yaml +0 -0
  251. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/templates/vision.yaml +0 -0
  252. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/__init__.py +0 -0
  253. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/bco.py +0 -0
  254. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/classifier.py +0 -0
  255. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/distill.py +0 -0
  256. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/dpo.py +0 -0
  257. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/embedding.py +0 -0
  258. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/grpo.py +0 -0
  259. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/ipo.py +0 -0
  260. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/kto.py +0 -0
  261. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  262. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  263. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/mlx_routing.py +0 -0
  264. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/mlx_sft.py +0 -0
  265. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/orpo.py +0 -0
  266. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/ppo.py +0 -0
  267. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/preference.py +0 -0
  268. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/pretrain.py +0 -0
  269. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/prm.py +0 -0
  270. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/reward_model.py +0 -0
  271. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/rewards.py +0 -0
  272. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/sft.py +0 -0
  273. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/simpo.py +0 -0
  274. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/trainer/unlearn.py +0 -0
  275. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/tui_app.py +0 -0
  276. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/__init__.py +0 -0
  277. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/app.py +0 -0
  278. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/plugins/__init__.py +0 -0
  279. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/static/app.js +0 -0
  280. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/static/index.html +0 -0
  281. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/static/logo.png +0 -0
  282. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/static/logo.svg +0 -0
  283. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/ui/static/style.css +0 -0
  284. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/__init__.py +0 -0
  285. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/_eval_text.py +0 -0
  286. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ab_test.py +0 -0
  287. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/activation_offload.py +0 -0
  288. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/active_sampler.py +0 -0
  289. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_bisect.py +0 -0
  290. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_branch.py +0 -0
  291. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_diff.py +0 -0
  292. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_merge.py +0 -0
  293. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_pr.py +0 -0
  294. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_scan.py +0 -0
  295. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/adapter_sign.py +0 -0
  296. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/advanced_precision.py +0 -0
  297. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/advise_history.py +0 -0
  298. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/agent_forge.py +0 -0
  299. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/agent_rollout.py +0 -0
  300. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/airgap_bundle.py +0 -0
  301. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/annex_xi.py +0 -0
  302. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/anthropic_messages.py +0 -0
  303. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/apple_adapter.py +0 -0
  304. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/attest.py +0 -0
  305. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/audit_log.py +0 -0
  306. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/auto_quant.py +0 -0
  307. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/backend_detect.py +0 -0
  308. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/batch_probe.py +0 -0
  309. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/bitnet.py +0 -0
  310. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/blame.py +0 -0
  311. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/block_expansion.py +0 -0
  312. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/bom.py +0 -0
  313. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/brain_rot.py +0 -0
  314. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  315. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/build_dag.py +0 -0
  316. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/canary_discovery.py +0 -0
  317. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/canary_router.py +0 -0
  318. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/checklist_dsl.py +0 -0
  319. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  320. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/citation_faithful.py +0 -0
  321. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/classifier.py +0 -0
  322. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/cmaes_merge.py +0 -0
  323. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/compile_tools.py +0 -0
  324. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/completions.py +0 -0
  325. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/constants.py +0 -0
  326. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/convergence.py +0 -0
  327. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/crash.py +0 -0
  328. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  329. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/curriculum.py +0 -0
  330. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  331. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/cut_ce.py +0 -0
  332. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/data_forge.py +0 -0
  333. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/data_mix.py +0 -0
  334. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/data_pipeline.py +0 -0
  335. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/data_score.py +0 -0
  336. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/deepspeed.py +0 -0
  337. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  338. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/demo_bundles.py +0 -0
  339. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  340. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/deploy_measure.py +0 -0
  341. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  342. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/_common.py +0 -0
  343. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/badge.py +0 -0
  344. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  345. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  346. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/format.py +0 -0
  347. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  348. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  349. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  350. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/report.py +0 -0
  351. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/diagnose/runner.py +0 -0
  352. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/distill.py +0 -0
  353. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/dpo_variants.py +0 -0
  354. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/drift_alarm.py +0 -0
  355. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  356. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/echo_trap.py +0 -0
  357. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/edit_diff.py +0 -0
  358. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/edit_governor.py +0 -0
  359. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/encoding.py +0 -0
  360. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/energy.py +0 -0
  361. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/env_lock.py +0 -0
  362. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/errors.py +0 -0
  363. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/eval_design.py +0 -0
  364. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  365. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  366. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/expectations.py +0 -0
  367. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/fetch_examples.py +0 -0
  368. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/flash_attn.py +0 -0
  369. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/fp8.py +0 -0
  370. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/freeze.py +0 -0
  371. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/fsdp.py +0 -0
  372. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  373. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/galore.py +0 -0
  374. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/gguf_quant.py +0 -0
  375. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/gpu.py +0 -0
  376. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/gpu_monitor.py +0 -0
  377. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/grace_codebook.py +0 -0
  378. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/graceful_save.py +0 -0
  379. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/grad_accum.py +0 -0
  380. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  381. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/grpo_long_context.py +0 -0
  382. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/grpo_variants.py +0 -0
  383. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/hardware_fit.py +0 -0
  384. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/hf.py +0 -0
  385. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/hf_space.py +0 -0
  386. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/hubs.py +0 -0
  387. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ingest_sources.py +0 -0
  388. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/integrations.py +0 -0
  389. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/interference.py +0 -0
  390. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/irt.py +0 -0
  391. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/iterative_dpo.py +0 -0
  392. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  393. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/kernel_picker.py +0 -0
  394. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/knowledge_edit.py +0 -0
  395. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/kv_cache.py +0 -0
  396. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/launcher.py +0 -0
  397. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/license_advisor.py +0 -0
  398. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/license_matrix.py +0 -0
  399. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/liger.py +0 -0
  400. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/llama_proxy.py +0 -0
  401. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/llama_server_timings.py +0 -0
  402. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/local_rl.py +0 -0
  403. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loftq_init.py +0 -0
  404. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/log_level.py +0 -0
  405. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/long_context.py +0 -0
  406. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/longlora.py +0 -0
  407. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loop_budget.py +0 -0
  408. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loop_daemon.py +0 -0
  409. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loop_iteration.py +0 -0
  410. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loop_stages.py +0 -0
  411. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/loop_state.py +0 -0
  412. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/lr_finder.py +0 -0
  413. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/lr_groups.py +0 -0
  414. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/magpie.py +0 -0
  415. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/metrics.py +0 -0
  416. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/mii.py +0 -0
  417. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/minillm.py +0 -0
  418. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/mix_proxy.py +0 -0
  419. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/mixed_precision.py +0 -0
  420. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/mlx.py +0 -0
  421. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/moe.py +0 -0
  422. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/moe_quant.py +0 -0
  423. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/mole_routing.py +0 -0
  424. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/multipack.py +0 -0
  425. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/multipack_sampler.py +0 -0
  426. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/multipack_trainer.py +0 -0
  427. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/namespace_pin.py +0 -0
  428. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/neat_packing.py +0 -0
  429. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ngram_spec.py +0 -0
  430. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/nlg_metrics.py +0 -0
  431. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ollama.py +0 -0
  432. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/onboarding.py +0 -0
  433. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  434. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/paths.py +0 -0
  435. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/peft_builder.py +0 -0
  436. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/peft_patches.py +0 -0
  437. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/peft_wiring.py +0 -0
  438. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/persona_hub.py +0 -0
  439. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/pipeline.py +0 -0
  440. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/preference_combine.py +0 -0
  441. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/prm.py +0 -0
  442. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/probe_pack.py +0 -0
  443. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/profiler.py +0 -0
  444. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/profiling.py +0 -0
  445. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  446. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/prompt_compile.py +0 -0
  447. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/prompt_distill.py +0 -0
  448. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/prune_prompt.py +0 -0
  449. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/qat.py +0 -0
  450. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/qr_url.py +0 -0
  451. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/quality.py +0 -0
  452. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/quant_menu.py +0 -0
  453. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ra_dit.py +0 -0
  454. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/reasoning_effort.py +0 -0
  455. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/reasoning_parser.py +0 -0
  456. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/recipe_dag.py +0 -0
  457. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/recipe_run.py +0 -0
  458. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/registry.py +0 -0
  459. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/relora.py +0 -0
  460. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/replay.py +0 -0
  461. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/repro_receipt.py +0 -0
  462. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/reward_hacking.py +0 -0
  463. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ring_attention.py +0 -0
  464. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  465. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/run_cost.py +0 -0
  466. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/sae_diff.py +0 -0
  467. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/save_formats.py +0 -0
  468. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/server_tools.py +0 -0
  469. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/sglang.py +0 -0
  470. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/shortcuts.py +0 -0
  471. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/signing.py +0 -0
  472. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/sleeper_probe.py +0 -0
  473. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/soup_lock.py +0 -0
  474. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/spec_pairing.py +0 -0
  475. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/spike_recovery.py +0 -0
  476. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/sse_train_stream.py +0 -0
  477. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/steering.py +0 -0
  478. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/strict_safetensors.py +0 -0
  479. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/structured_output.py +0 -0
  480. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/sweep_config.py +0 -0
  481. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/tail_latency.py +0 -0
  482. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/terraform_plan.py +0 -0
  483. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/tool_outputs.py +0 -0
  484. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/topology.py +0 -0
  485. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/tracing.py +0 -0
  486. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/trackers.py +0 -0
  487. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/train_event_buffer.py +0 -0
  488. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/trainer_plugins.py +0 -0
  489. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/trust_remote.py +0 -0
  490. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/tts.py +0 -0
  491. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/ui_env.py +0 -0
  492. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/uld.py +0 -0
  493. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/unlearning.py +0 -0
  494. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/unlearning_eval.py +0 -0
  495. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/unsloth.py +0 -0
  496. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/v028_features.py +0 -0
  497. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/vector_bank.py +0 -0
  498. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/vllm.py +0 -0
  499. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/vscode_setup.py +0 -0
  500. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/warmup.py +0 -0
  501. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/webhooks.py +0 -0
  502. {soup_cli-0.71.6 → soup_cli-0.71.7}/src/soup_cli/utils/why.py +0 -0
  503. {soup_cli-0.71.6 → soup_cli-0.71.7}/templates/chat.yaml +0 -0
  504. {soup_cli-0.71.6 → soup_cli-0.71.7}/templates/code.yaml +0 -0
  505. {soup_cli-0.71.6 → soup_cli-0.71.7}/templates/medical.yaml +0 -0
  506. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/__init__.py +0 -0
  507. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/conftest.py +0 -0
  508. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/qa/v053_qa.md +0 -0
  509. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/qa/v0716_qa.md +0 -0
  510. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_adapters.py +0 -0
  511. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_advanced_peft.py +0 -0
  512. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_assistant_mask.py +0 -0
  513. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_audio.py +0 -0
  514. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_auto_tuning.py +0 -0
  515. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_autopilot.py +0 -0
  516. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_awq_gptq_export.py +0 -0
  517. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_batch_probe.py +0 -0
  518. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_bco.py +0 -0
  519. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_bench.py +0 -0
  520. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_brain_rot_multilingual.py +0 -0
  521. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_bugfixes.py +0 -0
  522. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_callback.py +0 -0
  523. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_cans.py +0 -0
  524. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_chat.py +0 -0
  525. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_chat_template.py +0 -0
  526. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_cli.py +0 -0
  527. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_cli_subprocess.py +0 -0
  528. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_config.py +0 -0
  529. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_cost.py +0 -0
  530. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_crash_reporter.py +0 -0
  531. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_curriculum.py +0 -0
  532. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_data.py +0 -0
  533. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_data_augment.py +0 -0
  534. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_data_sample.py +0 -0
  535. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_data_split.py +0 -0
  536. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_data_tools.py +0 -0
  537. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_dataset_hub.py +0 -0
  538. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_dataset_registry.py +0 -0
  539. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_deepspeed.py +0 -0
  540. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_deploy_ollama.py +0 -0
  541. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_diff.py +0 -0
  542. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_display.py +0 -0
  543. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_doctor.py +0 -0
  544. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_dpo_example.py +0 -0
  545. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_dpo_variants.py +0 -0
  546. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_embedding.py +0 -0
  547. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_errors.py +0 -0
  548. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_eval.py +0 -0
  549. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_eval_gate.py +0 -0
  550. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_eval_platform.py +0 -0
  551. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_export.py +0 -0
  552. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_formats.py +0 -0
  553. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_fp8_recipe.py +0 -0
  554. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_freeze_training.py +0 -0
  555. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_generate.py +0 -0
  556. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_gpu.py +0 -0
  557. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_grpo.py +0 -0
  558. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_hf_integration.py +0 -0
  559. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_infer.py +0 -0
  560. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_inference_advanced.py +0 -0
  561. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_init.py +0 -0
  562. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ipo.py +0 -0
  563. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_jinja_analyzer.py +0 -0
  564. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_kto.py +0 -0
  565. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_loader.py +0 -0
  566. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_log_level.py +0 -0
  567. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_loss_watchdog.py +0 -0
  568. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_merge.py +0 -0
  569. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_migrate.py +0 -0
  570. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_mlx_backend.py +0 -0
  571. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_moe.py +0 -0
  572. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_multi_adapter.py +0 -0
  573. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_multi_gpu.py +0 -0
  574. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_multipack_config.py +0 -0
  575. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_multipack_invariants.py +0 -0
  576. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_multipack_sampler.py +0 -0
  577. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_neat_packing.py +0 -0
  578. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_neftune_rslora.py +0 -0
  579. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_onnx_tensorrt_export.py +0 -0
  580. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_orpo.py +0 -0
  581. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_packing.py +0 -0
  582. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_a_wave1.py +0 -0
  583. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_a_wave2.py +0 -0
  584. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_b.py +0 -0
  585. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_c.py +0 -0
  586. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_d.py +0 -0
  587. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_e.py +0 -0
  588. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_part_f_hardening.py +0 -0
  589. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_peft_methods.py +0 -0
  590. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_peft_patches.py +0 -0
  591. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_performance.py +0 -0
  592. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_pissa_init.py +0 -0
  593. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ppo.py +0 -0
  594. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_preference_dispatcher.py +0 -0
  595. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_preference_multi.py +0 -0
  596. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_preference_multi_runtime.py +0 -0
  597. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_pretrain.py +0 -0
  598. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_profile.py +0 -0
  599. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_profiling.py +0 -0
  600. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_progress.py +0 -0
  601. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_push.py +0 -0
  602. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_qat.py +0 -0
  603. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_quality_filter.py +0 -0
  604. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_quant_check.py +0 -0
  605. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_quant_menu.py +0 -0
  606. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_quickstart.py +0 -0
  607. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_rank_pattern.py +0 -0
  608. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_recipes.py +0 -0
  609. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_recipes_v031.py +0 -0
  610. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_refusal_multilingual.py +0 -0
  611. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_registry.py +0 -0
  612. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_relora.py +0 -0
  613. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_replay.py +0 -0
  614. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_resume.py +0 -0
  615. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_rlvr.py +0 -0
  616. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_run_cost.py +0 -0
  617. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_runs.py +0 -0
  618. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_serve.py +0 -0
  619. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_server_generate.py +0 -0
  620. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_sglang_serve.py +0 -0
  621. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_simpo.py +0 -0
  622. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_smoke_train.py +0 -0
  623. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_speculative_decoding.py +0 -0
  624. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_sweep.py +0 -0
  625. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_synth_data_pro.py +0 -0
  626. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_templates_yaml.py +0 -0
  627. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_tensorboard.py +0 -0
  628. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_tool_calling.py +0 -0
  629. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_trace_to_pref.py +0 -0
  630. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_tracker.py +0 -0
  631. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_trainer_coverage_v035.py +0 -0
  632. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_trainer_init.py +0 -0
  633. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_training_intelligence.py +0 -0
  634. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_training_speed.py +0 -0
  635. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_trust_remote_code.py +0 -0
  636. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_tui.py +0 -0
  637. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ui.py +0 -0
  638. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ui_chat.py +0 -0
  639. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ui_config_builder.py +0 -0
  640. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ui_live_monitor.py +0 -0
  641. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_ui_metrics.py +0 -0
  642. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_unsloth.py +0 -0
  643. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0401_part_c.py +0 -0
  644. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0401_part_d.py +0 -0
  645. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0401_part_e.py +0 -0
  646. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0402_part_a.py +0 -0
  647. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0402_part_b.py +0 -0
  648. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0403_part_a.py +0 -0
  649. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0403_part_b.py +0 -0
  650. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0403_part_c.py +0 -0
  651. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0404_part_a.py +0 -0
  652. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0404_part_b.py +0 -0
  653. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0405_part_a.py +0 -0
  654. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0406_part_a.py +0 -0
  655. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0410_part_a.py +0 -0
  656. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0410_part_b.py +0 -0
  657. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0410_part_c.py +0 -0
  658. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0420.py +0 -0
  659. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0430_part_a.py +0 -0
  660. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0430_part_b.py +0 -0
  661. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0430_part_c.py +0 -0
  662. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0430_part_d.py +0 -0
  663. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0440_part_a.py +0 -0
  664. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0440_part_b.py +0 -0
  665. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0440_part_c.py +0 -0
  666. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0440_part_d.py +0 -0
  667. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0440_review_followups.py +0 -0
  668. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0450.py +0 -0
  669. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0460_part_a.py +0 -0
  670. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0460_part_b.py +0 -0
  671. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0470_part_a.py +0 -0
  672. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0470_part_b.py +0 -0
  673. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0480_part_a.py +0 -0
  674. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0480_part_b.py +0 -0
  675. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0490.py +0 -0
  676. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0500_part_a.py +0 -0
  677. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0500_part_b.py +0 -0
  678. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0500_part_c.py +0 -0
  679. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0500_part_d.py +0 -0
  680. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0500_part_e.py +0 -0
  681. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0510.py +0 -0
  682. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0520.py +0 -0
  683. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0530.py +0 -0
  684. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v05310.py +0 -0
  685. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v05311.py +0 -0
  686. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0531_109.py +0 -0
  687. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0531_139.py +0 -0
  688. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0531_142.py +0 -0
  689. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0531_82.py +0 -0
  690. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0532.py +0 -0
  691. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0533.py +0 -0
  692. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0534.py +0 -0
  693. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0535.py +0 -0
  694. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0536.py +0 -0
  695. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0537.py +0 -0
  696. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0538.py +0 -0
  697. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0539.py +0 -0
  698. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0540.py +0 -0
  699. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0550.py +0 -0
  700. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0550_followups.py +0 -0
  701. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0560.py +0 -0
  702. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0570_part_a.py +0 -0
  703. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0570_part_b.py +0 -0
  704. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0570_part_c.py +0 -0
  705. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0570_part_d.py +0 -0
  706. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0580.py +0 -0
  707. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0590.py +0 -0
  708. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_a.py +0 -0
  709. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_b.py +0 -0
  710. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_c.py +0 -0
  711. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_d.py +0 -0
  712. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_e.py +0 -0
  713. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0600_part_f.py +0 -0
  714. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0610_part_a.py +0 -0
  715. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0610_part_b.py +0 -0
  716. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0610_part_c.py +0 -0
  717. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0610_part_d.py +0 -0
  718. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0610_part_e.py +0 -0
  719. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_followups.py +0 -0
  720. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_part_a.py +0 -0
  721. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_part_b.py +0 -0
  722. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_part_c.py +0 -0
  723. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_part_d.py +0 -0
  724. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0620_part_e.py +0 -0
  725. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_followups.py +0 -0
  726. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_part_a.py +0 -0
  727. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_part_b.py +0 -0
  728. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_part_c.py +0 -0
  729. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_part_d.py +0 -0
  730. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0630_part_e.py +0 -0
  731. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0631_206.py +0 -0
  732. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_followups.py +0 -0
  733. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_a.py +0 -0
  734. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_b.py +0 -0
  735. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_c.py +0 -0
  736. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_d.py +0 -0
  737. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_e.py +0 -0
  738. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0640_part_f.py +0 -0
  739. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_followups.py +0 -0
  740. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_part_a.py +0 -0
  741. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_part_b.py +0 -0
  742. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_part_c.py +0 -0
  743. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_part_d.py +0 -0
  744. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0650_part_e.py +0 -0
  745. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_cli.py +0 -0
  746. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_followups.py +0 -0
  747. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_part_a.py +0 -0
  748. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_part_b.py +0 -0
  749. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_part_c.py +0 -0
  750. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_part_d.py +0 -0
  751. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0660_part_e.py +0 -0
  752. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_followups.py +0 -0
  753. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_a.py +0 -0
  754. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_b.py +0 -0
  755. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_c.py +0 -0
  756. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_d.py +0 -0
  757. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_e.py +0 -0
  758. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0670_part_f.py +0 -0
  759. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_followups.py +0 -0
  760. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_part_a.py +0 -0
  761. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_part_b.py +0 -0
  762. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_part_c.py +0 -0
  763. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_part_d.py +0 -0
  764. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0680_part_e.py +0 -0
  765. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0690_part_a.py +0 -0
  766. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0690_part_b.py +0 -0
  767. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0690_part_c.py +0 -0
  768. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0690_part_d.py +0 -0
  769. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0690_part_e.py +0 -0
  770. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_a.py +0 -0
  771. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_b.py +0 -0
  772. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_c.py +0 -0
  773. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_d.py +0 -0
  774. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_e.py +0 -0
  775. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0700_part_f.py +0 -0
  776. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0712.py +0 -0
  777. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0713.py +0 -0
  778. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0714.py +0 -0
  779. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0715.py +0 -0
  780. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_v0716.py +0 -0
  781. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_validator.py +0 -0
  782. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_vision.py +0 -0
  783. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_vllm_serve.py +0 -0
  784. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_why.py +0 -0
  785. {soup_cli-0.71.6 → soup_cli-0.71.7}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,40 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.7] - 2026-06-02
16
+
17
+ ### Added
18
+ - **Eval live runners** — six probe surfaces that previously emitted heuristic
19
+ / neutral stubs now load a real model and run live (closes #161, #162, #208,
20
+ #211, #212, #165). New shared `soup_cli/utils/live_eval.py` provides the
21
+ model-loading primitives (generator / multi-generator closures, masked
22
+ cross-entropy eval-loss, a short-LoRA probe, and held-out logit agreement);
23
+ every heavy import (`torch` / `transformers` / `peft` / `lm_eval`) is lazy.
24
+ - **`soup advise --probe-model <id>`** — runs a LIVE ROI probe: zero/few-shot
25
+ token-F1 baselines, a short LoRA probe (relative held-out-loss improvement +
26
+ real wall-clock), and base-model proximity (held-out logit agreement) folded
27
+ into the dataset profile. Without `--probe-model`, `--probe` stays the offline
28
+ heuristic.
29
+ - **`soup tunability --live`** — replaces the offline heuristic with a real
30
+ per-candidate LoRA probe (loads each `repo_id`, trains `--probe-steps` on a
31
+ held-out-excluded slice, reports the held-out-loss drop).
32
+ - **`soup eval capability --live --model <id>`** — invokes lm-eval-harness per
33
+ resolved task (or a `--tasks` override) with `--limit` / `--device`, isolating
34
+ per-task failures and surfacing a no-metric result as an explicit error.
35
+ - **`soup eval behavior --base-model <id> [--adapter <path>]`** — generates
36
+ pre/post responses on the bundled behaviour battery and scores the live diff.
37
+ - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset <jsonl>]
38
+ [--tokenizer <id>]`** — runs all six failure-mode probes (forgetting / refusal
39
+ / format / mode_collapse / memorization / contamination) live via
40
+ `soup_cli.utils.diagnose.live.run_live_diagnose`; falls back to neutral OK or
41
+ `--evidence` JSON when no model is supplied.
42
+
43
+ ### Security
44
+ - The two new JSONL dataset readers (`diagnose.live._load_dataset_rows`,
45
+ `tunability._load_jsonl_rows`) open with `O_NOFOLLOW` after the cwd-containment
46
+ check, closing the check→open TOCTOU window (matches the v0.65 / v0.67 reader
47
+ policy).
48
+
15
49
  ## [0.71.6] - 2026-06-02
16
50
 
17
51
  ### 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 (277 files, 12771 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.7
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,22 @@ 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.7Eval live runners.** Six probe surfaces that used to emit heuristic / neutral stubs
187
+ now load a real model and run live (opt-in flags; the offline paths stay the default):
188
+
189
+ - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset d.jsonl]`** runs all six
190
+ failure-mode probes (forgetting / refusal / format / mode_collapse / memorization /
191
+ contamination) against the loaded model instead of emitting neutral OK.
192
+ - **`soup advise --probe-model <id>`**a live ROI probe: zero/few-shot token-F1 baselines, a
193
+ short LoRA probe (real held-out-loss drop + wall-clock), and base-model proximity.
194
+ - **`soup tunability --live`** — a real per-candidate LoRA probe (loads each base, trains
195
+ `--probe-steps` on a held-out slice).
196
+ - **`soup eval capability --live --model <id>`** invokes lm-eval-harness per task (with
197
+ `--tasks` / `--limit` / `--device`), isolating per-task failures.
198
+ - **`soup eval behavior --base-model <id> [--adapter <path>]`** generates pre/post responses on
199
+ the bundled behaviour battery and scores the live diff.
200
+ - New shared `soup_cli/utils/live_eval.py` holds the model-loading primitives; heavy imports stay
201
+ lazy. Validated end-to-end on SmolLM2-135M (RTX 3050 4 GB).
200
202
 
201
203
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
202
204
 
@@ -49,20 +49,22 @@ 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.7Eval live runners.** Six probe surfaces that used to emit heuristic / neutral stubs
53
+ now load a real model and run live (opt-in flags; the offline paths stay the default):
54
+
55
+ - **`soup diagnose --base-model <id> [--adapter <path>] [--dataset d.jsonl]`** runs all six
56
+ failure-mode probes (forgetting / refusal / format / mode_collapse / memorization /
57
+ contamination) against the loaded model instead of emitting neutral OK.
58
+ - **`soup advise --probe-model <id>`**a live ROI probe: zero/few-shot token-F1 baselines, a
59
+ short LoRA probe (real held-out-loss drop + wall-clock), and base-model proximity.
60
+ - **`soup tunability --live`** — a real per-candidate LoRA probe (loads each base, trains
61
+ `--probe-steps` on a held-out slice).
62
+ - **`soup eval capability --live --model <id>`** invokes lm-eval-harness per task (with
63
+ `--tasks` / `--limit` / `--device`), isolating per-task failures.
64
+ - **`soup eval behavior --base-model <id> [--adapter <path>]`** generates pre/post responses on
65
+ the bundled behaviour battery and scores the live diff.
66
+ - New shared `soup_cli/utils/live_eval.py` holds the model-loading primitives; heavy imports stay
67
+ lazy. Validated end-to-end on SmolLM2-135M (RTX 3050 4 GB).
66
68
 
67
69
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
68
70
 
@@ -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)
@@ -61,9 +61,13 @@ soup advise data.jsonl --goal "make our chatbot more concise"
61
61
  # Why: Task is summarization with 120 rows and healthy diversity ...
62
62
  # Flip when: the prompt-engineering baseline already meets your target ...
63
63
 
64
- # Optional 10-min ROI probe (zero/few-shot + RAG + 100-step LoRA).
64
+ # Optional ROI probe (offline heuristic: zero/few-shot + RAG + LoRA estimate).
65
65
  soup advise data.jsonl --goal "summarize my reports" --probe
66
66
 
67
+ # LIVE ROI probe (v0.71.7): loads the model for zero/few-shot token-F1, a short
68
+ # LoRA probe, and base-model proximity (held-out logit agreement). Implies --probe.
69
+ soup advise data.jsonl --goal "..." --probe-model HuggingFaceTB/SmolLM2-135M
70
+
67
71
  # Print the rubric / evidence trail of the last verdict.
68
72
  soup advise explain
69
73
 
@@ -239,9 +243,13 @@ Default threshold 0.2 matches v0.43.0 KL-delta quant-check thresholds. Webhooks
239
243
  `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
244
 
241
245
  ```bash
242
- # Heuristic neutral report (no model load — runs as a sanity check)
246
+ # Neutral report (no model load — runs as a sanity check)
243
247
  soup diagnose my-run-id
244
248
 
249
+ # LIVE (v0.71.7): load the model and run all six probes for real
250
+ soup diagnose my-run-id --base-model HuggingFaceTB/SmolLM2-135M \
251
+ --adapter ./out --dataset train.jsonl --tokenizer HuggingFaceTB/SmolLM2-135M
252
+
245
253
  # Compute scores from a pre-built evidence JSON
246
254
  soup diagnose my-run-id --evidence evidence.json --output diag.json
247
255
 
@@ -252,6 +260,12 @@ soup diagnose my-run-id --badge diag.svg
252
260
  soup diagnose my-run-id --output diag.json --attach-to-registry abc123
253
261
  ```
254
262
 
263
+ **Live runners (v0.71.7).** With `--base-model` the six probes run against the loaded model
264
+ (+ optional `--adapter` LoRA path, `--dataset` for the forgetting / format / memorization probes,
265
+ `--tokenizer` for a sub-word memorization variant) instead of emitting neutral OK. `refusal` uses
266
+ a built-in probe set; `format` only fires when the dataset's own targets look like JSON;
267
+ `contamination` stays neutral unless a benchmark corpus is supplied. Validated on SmolLM2-135M.
268
+
255
269
  **Six failure-mode probes:**
256
270
 
257
271
  | Mode | What it catches | Score range |
@@ -429,7 +443,7 @@ soup tunability --dataset ./eval.jsonl --candidates qwen3-0.6b,phi-4-mini --plan
429
443
  soup tunability --dataset ./eval.jsonl --probe-steps 100 --output ./tunability.json
430
444
  ```
431
445
 
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.
446
+ 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
447
 
434
448
 
435
449
  ## Eval Depth (`soup eval behavior / capability / checklist / irt-subset`)
@@ -459,6 +473,10 @@ Persist a calibration once and reuse it across runs (v0.71.1): `write_judge_cali
459
473
  # Score over-refusal regression on XSTest (operator supplies evidence JSON)
460
474
  soup eval behavior my_run --battery xstest --evidence ev.json --output diff.json
461
475
 
476
+ # LIVE (v0.71.7): generate pre/post responses on the bundled battery + score the diff
477
+ soup eval behavior my_run --battery xstest \
478
+ --base-model HuggingFaceTB/SmolLM2-135M --adapter ./out
479
+
462
480
  # Bundled batteries: xstest, harmbench, jailbreakbench, elephant, syceval
463
481
  # Harmful prompts ship REDACTED — pull real sets from upstream papers.
464
482
  ```
@@ -472,9 +490,13 @@ soup eval capability my_run --suite math --output cap.json # AIME + MATH-500
472
490
  soup eval capability my_run --suite code --output cap.json # HumanEval+ + SWE-bench-Verified
473
491
  soup eval capability my_run --suite fast --output cap.json # MMLU-Pro + HumanEval+
474
492
  soup eval capability my_run --suite full --output cap.json # all 7 benchmarks
493
+
494
+ # LIVE (v0.71.7): invoke lm-eval-harness per task against a real model
495
+ soup eval capability my_run --live --model HuggingFaceTB/SmolLM2-135M \
496
+ --tasks arc_easy --limit 1 --device cpu
475
497
  ```
476
498
 
477
- Emits the (benchmark, lm-eval task) manifest; chain into the existing `soup eval benchmark` surface.
499
+ 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
500
 
479
501
  **CheckList behavioural DSL** — Ribeiro et al. 2020 MFT / INV / DIR tests:
480
502
 
@@ -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.7"
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.7"
@@ -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
@@ -7,12 +7,12 @@ Top-level CLI command (NOT a sub-group) — operators type:
7
7
  soup diagnose <run-id> --badge diagnose.svg
8
8
  soup diagnose <run-id> --attach-to-registry <id>
9
9
 
10
- The live probe runners (forgetting / refusal / format / mode_collapse /
11
- memorization / contamination) require a base + adapter model pair; this
12
- release computes neutral OK scores when no probe evidence is supplied,
13
- matching the v0.27.0 / v0.50.0 stub-then-live cadence. Operators with a
14
- SoupConfig + an evidence dict can call ``soup_cli.utils.diagnose.diagnose``
15
- to produce a real report card.
10
+ Since v0.71.7 (#165) the six probe runners (forgetting / refusal / format /
11
+ mode_collapse / memorization / contamination) run LIVE when ``--base-model``
12
+ is supplied: the model (+ optional ``--adapter`` LoRA path, ``--dataset``,
13
+ ``--tokenizer``) is loaded and each probe is fed real generator output via
14
+ ``soup_cli.utils.diagnose.live.run_live_diagnose``. Without ``--base-model``
15
+ the command computes scores from ``--evidence`` JSON or defaults to neutral OK.
16
16
  """
17
17
 
18
18
  from __future__ import annotations
@@ -173,6 +173,47 @@ def _attach_to_registry(report: FailureReport, registry_id: str, output: str) ->
173
173
  )
174
174
 
175
175
 
176
+ def _emit_report(
177
+ report: FailureReport,
178
+ *,
179
+ output: Optional[str],
180
+ badge: Optional[str],
181
+ attach_to_registry: Optional[str],
182
+ ) -> None:
183
+ """Shared render + optional output/badge/registry-attach (no exit)."""
184
+ _render_report(report)
185
+
186
+ if output:
187
+ try:
188
+ write_report(report, output)
189
+ console.print(f"[green]Wrote[/] {escape(output)}")
190
+ except (OSError, ValueError) as exc:
191
+ console.print(
192
+ f"[red]Error:[/] cannot write --output: "
193
+ f"{escape(type(exc).__name__)}: {escape(str(exc))}"
194
+ )
195
+ raise typer.Exit(code=1) from exc
196
+
197
+ if badge:
198
+ try:
199
+ svg = render_badge_svg(report)
200
+ _write_badge(badge, svg)
201
+ console.print(f"[green]Badge written[/] to {escape(badge)}")
202
+ except (OSError, ValueError, TypeError) as exc:
203
+ console.print(
204
+ f"[red]Error:[/] cannot write --badge: "
205
+ f"{escape(type(exc).__name__)}: {escape(str(exc))}"
206
+ )
207
+ raise typer.Exit(code=1) from exc
208
+
209
+ if attach_to_registry and output:
210
+ _attach_to_registry(report, attach_to_registry, output)
211
+ elif attach_to_registry and not output:
212
+ console.print(
213
+ "[yellow]Warning:[/] --attach-to-registry needs --output (skipped)."
214
+ )
215
+
216
+
176
217
  def diagnose(
177
218
  run_id: str = typer.Argument(..., help="Registry run id (or any opaque tag)."),
178
219
  base: str = typer.Option("", "--base", help="Base model name (informational)."),
@@ -191,13 +232,65 @@ def diagnose(
191
232
  attach_to_registry: Optional[str] = typer.Option(
192
233
  None, "--attach-to-registry", help="Attach the report to a registry entry id."
193
234
  ),
235
+ base_model: Optional[str] = typer.Option(
236
+ None,
237
+ "--base-model",
238
+ help=(
239
+ "Base model id to LOAD for a live diagnose run (e.g. "
240
+ "HuggingFaceTB/SmolLM2-135M). When set, the 6 probes run live "
241
+ "against the model instead of emitting neutral scores."
242
+ ),
243
+ ),
244
+ dataset: Optional[str] = typer.Option(
245
+ None,
246
+ "--dataset",
247
+ help="Training JSONL for the live forgetting / format / memorization "
248
+ "probes (must stay under cwd).",
249
+ ),
250
+ tokenizer: Optional[str] = typer.Option(
251
+ None,
252
+ "--tokenizer",
253
+ help="Tokenizer id/path for a sub-word memorization probe (live).",
254
+ ),
255
+ device: Optional[str] = typer.Option(
256
+ None, "--device", help="Device for the live run (cuda / cpu)."
257
+ ),
194
258
  ) -> None:
195
- """Compute a 6-mode FailureReport for a completed run."""
259
+ """Compute a 6-mode FailureReport for a completed run.
260
+
261
+ With ``--base-model`` the six probes run LIVE against the loaded model
262
+ (+ optional ``--adapter`` LoRA path, ``--dataset``, ``--tokenizer``).
263
+ Without it, scores come from ``--evidence`` JSON or default to neutral OK.
264
+ """
196
265
  if not isinstance(run_id, str) or not run_id.strip():
197
266
  raise typer.BadParameter("run_id must be a non-empty string")
198
267
  if "\x00" in run_id or len(run_id) > 512:
199
268
  raise typer.BadParameter("run_id has a null byte or is too long")
200
269
 
270
+ if base_model is not None:
271
+ from soup_cli.utils.diagnose.live import run_live_diagnose
272
+
273
+ try:
274
+ report = run_live_diagnose(
275
+ run_id=run_id,
276
+ base=base_model,
277
+ adapter=adapter or None,
278
+ dataset_path=dataset,
279
+ device=device,
280
+ tokenizer=tokenizer,
281
+ soup_version=__version__,
282
+ )
283
+ except (ValueError, TypeError, OSError, RuntimeError) as exc:
284
+ console.print(
285
+ f"[red]Error:[/] live diagnose failed: "
286
+ f"{escape(type(exc).__name__)}: {escape(str(exc))}"
287
+ )
288
+ raise typer.Exit(code=1) from exc
289
+ _emit_report(report, output=output, badge=badge, attach_to_registry=attach_to_registry)
290
+ if report.overall == "MAJOR":
291
+ raise typer.Exit(code=2)
292
+ return
293
+
201
294
  scores = {}
202
295
  extras = {}
203
296
  if evidence_path:
@@ -235,37 +328,7 @@ def diagnose(
235
328
  soup_version=__version__,
236
329
  extras=extras,
237
330
  )
238
- _render_report(report)
239
-
240
- if output:
241
- try:
242
- write_report(report, output)
243
- console.print(f"[green]Wrote[/] {escape(output)}")
244
- except (OSError, ValueError) as exc:
245
- console.print(
246
- f"[red]Error:[/] cannot write --output: "
247
- f"{escape(type(exc).__name__)}: {escape(str(exc))}"
248
- )
249
- raise typer.Exit(code=1) from exc
250
-
251
- if badge:
252
- try:
253
- svg = render_badge_svg(report)
254
- _write_badge(badge, svg)
255
- console.print(f"[green]Badge written[/] to {escape(badge)}")
256
- except (OSError, ValueError, TypeError) as exc:
257
- console.print(
258
- f"[red]Error:[/] cannot write --badge: "
259
- f"{escape(type(exc).__name__)}: {escape(str(exc))}"
260
- )
261
- raise typer.Exit(code=1) from exc
262
-
263
- if attach_to_registry and output:
264
- _attach_to_registry(report, attach_to_registry, output)
265
- elif attach_to_registry and not output:
266
- console.print(
267
- "[yellow]Warning:[/] --attach-to-registry needs --output (skipped)."
268
- )
331
+ _emit_report(report, output=output, badge=badge, attach_to_registry=attach_to_registry)
269
332
 
270
333
  if report.overall == "MAJOR":
271
334
  raise typer.Exit(code=2)