soup-cli 0.71.4__tar.gz → 0.71.5__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 (778) hide show
  1. {soup_cli-0.71.4 → soup_cli-0.71.5}/CHANGELOG.md +45 -0
  2. {soup_cli-0.71.4 → soup_cli-0.71.5}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.4 → soup_cli-0.71.5}/PKG-INFO +17 -16
  4. {soup_cli-0.71.4 → soup_cli-0.71.5}/README.md +16 -15
  5. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/backends-and-ops.md +5 -0
  6. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/commands.md +5 -1
  7. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/data.md +12 -0
  8. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/evaluation.md +4 -0
  9. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/training.md +3 -0
  10. {soup_cli-0.71.4 → soup_cli-0.71.5}/pyproject.toml +1 -1
  11. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/__init__.py +1 -1
  12. soup_cli-0.71.5/src/soup_cli/commands/_webhook_cli.py +71 -0
  13. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/ab.py +40 -0
  14. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/active_sample.py +28 -0
  15. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/advise.py +21 -1
  16. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/data.py +74 -2
  17. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/data_forge.py +45 -1
  18. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/ingest.py +25 -0
  19. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/prune_prompt.py +34 -0
  20. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/experiment/tracker.py +37 -1
  21. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/curriculum_callback.py +73 -5
  22. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/advise.py +194 -2
  23. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/advise_history.py +10 -0
  24. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/curriculum_dynamic.py +43 -0
  25. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/drift_alarm.py +7 -105
  26. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/peft_wiring.py +13 -1
  27. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/prune_prompt.py +179 -4
  28. soup_cli-0.71.5/src/soup_cli/utils/webhooks.py +152 -0
  29. soup_cli-0.71.5/tests/test_v0715.py +1222 -0
  30. {soup_cli-0.71.4 → soup_cli-0.71.5}/.dockerignore +0 -0
  31. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/FUNDING.yml +0 -0
  32. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  33. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  34. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  35. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/pull_request_template.md +0 -0
  36. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/workflows/ci.yml +0 -0
  37. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/workflows/docker.yml +0 -0
  38. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/workflows/publish.yml +0 -0
  39. {soup_cli-0.71.4 → soup_cli-0.71.5}/.github/workflows/recipe-validation.yml +0 -0
  40. {soup_cli-0.71.4 → soup_cli-0.71.5}/.gitignore +0 -0
  41. {soup_cli-0.71.4 → soup_cli-0.71.5}/.pre-commit-config.yaml +0 -0
  42. {soup_cli-0.71.4 → soup_cli-0.71.5}/AGENTS.md +0 -0
  43. {soup_cli-0.71.4 → soup_cli-0.71.5}/CODEOWNERS +0 -0
  44. {soup_cli-0.71.4 → soup_cli-0.71.5}/CODE_OF_CONDUCT.md +0 -0
  45. {soup_cli-0.71.4 → soup_cli-0.71.5}/Dockerfile +0 -0
  46. {soup_cli-0.71.4 → soup_cli-0.71.5}/LICENSE +0 -0
  47. {soup_cli-0.71.4 → soup_cli-0.71.5}/NOTICE +0 -0
  48. {soup_cli-0.71.4 → soup_cli-0.71.5}/SECURITY.md +0 -0
  49. {soup_cli-0.71.4 → soup_cli-0.71.5}/docker-compose.yml +0 -0
  50. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/README.md +0 -0
  51. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/adapters-and-governance.md +0 -0
  52. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/models.md +0 -0
  53. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/peft-and-efficiency.md +0 -0
  54. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/performance-and-quantization.md +0 -0
  55. {soup_cli-0.71.4 → soup_cli-0.71.5}/docs/serving-and-export.md +0 -0
  56. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/README.md +0 -0
  57. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/dpo_chat.yaml +0 -0
  58. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/dpo_example.yaml +0 -0
  59. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/grpo_reasoning.yaml +0 -0
  60. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/rlhf_step1_sft.yaml +0 -0
  61. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/rlhf_step2_reward.yaml +0 -0
  62. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  63. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/sft_basic.yaml +0 -0
  64. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/configs/vision_llama.yaml +0 -0
  65. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/data/alpaca_tiny.jsonl +0 -0
  66. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/data/chat_preferences.jsonl +0 -0
  67. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/data/dpo_sample.jsonl +0 -0
  68. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/data/reasoning_math.jsonl +0 -0
  69. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/synthetic_workflow.md +0 -0
  70. {soup_cli-0.71.4 → soup_cli-0.71.5}/examples/synthetic_workflow.yaml +0 -0
  71. {soup_cli-0.71.4 → soup_cli-0.71.5}/soup.png +0 -0
  72. {soup_cli-0.71.4 → soup_cli-0.71.5}/soup_logo_svg.svg +0 -0
  73. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/__main__.py +0 -0
  74. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/autopilot/__init__.py +0 -0
  75. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/autopilot/analyzer.py +0 -0
  76. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/autopilot/decisions.py +0 -0
  77. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/autopilot/generate_config.py +0 -0
  78. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/__init__.py +0 -0
  79. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/pack.py +0 -0
  80. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/publish.py +0 -0
  81. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/run.py +0 -0
  82. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/schema.py +0 -0
  83. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/unpack.py +0 -0
  84. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cans/verify.py +0 -0
  85. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/cli.py +0 -0
  86. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/__init__.py +0 -0
  87. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0550.py +0 -0
  88. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0610.py +0 -0
  89. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0650.py +0 -0
  90. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/adapters.py +0 -0
  91. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/agent.py +0 -0
  92. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/airgap.py +0 -0
  93. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/apple_adapter.py +0 -0
  94. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/attest.py +0 -0
  95. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/audit_log.py +0 -0
  96. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/autopilot.py +0 -0
  97. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/bench.py +0 -0
  98. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/bom.py +0 -0
  99. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/build.py +0 -0
  100. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/can.py +0 -0
  101. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/chat.py +0 -0
  102. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/compile_cmd.py +0 -0
  103. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/compile_tools.py +0 -0
  104. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/completions.py +0 -0
  105. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/cost.py +0 -0
  106. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/data_mix.py +0 -0
  107. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/data_score.py +0 -0
  108. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  109. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/deploy.py +0 -0
  110. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/diagnose.py +0 -0
  111. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/diff.py +0 -0
  112. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/distill_prompt.py +0 -0
  113. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/doctor.py +0 -0
  114. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/drift_alarm.py +0 -0
  115. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/edit.py +0 -0
  116. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/env.py +0 -0
  117. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/eval.py +0 -0
  118. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/expect.py +0 -0
  119. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/export.py +0 -0
  120. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/fetch.py +0 -0
  121. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/generate.py +0 -0
  122. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/history.py +0 -0
  123. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/infer.py +0 -0
  124. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/init.py +0 -0
  125. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/iterative_dpo.py +0 -0
  126. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/license_advisor.py +0 -0
  127. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/llama.py +0 -0
  128. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/local_rl.py +0 -0
  129. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/lock.py +0 -0
  130. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/loop.py +0 -0
  131. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/merge.py +0 -0
  132. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  133. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/migrate.py +0 -0
  134. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/monitor.py +0 -0
  135. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/plan.py +0 -0
  136. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/plugins.py +0 -0
  137. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/probe.py +0 -0
  138. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/profile.py +0 -0
  139. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/push.py +0 -0
  140. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/quantize.py +0 -0
  141. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/quickstart.py +0 -0
  142. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/recipes.py +0 -0
  143. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/registry.py +0 -0
  144. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/runs.py +0 -0
  145. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/serve.py +0 -0
  146. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/steer.py +0 -0
  147. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/sweep.py +0 -0
  148. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/tokenizer.py +0 -0
  149. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/train.py +0 -0
  150. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/tui.py +0 -0
  151. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/tunability.py +0 -0
  152. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/ui.py +0 -0
  153. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/commands/why.py +0 -0
  154. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/config/__init__.py +0 -0
  155. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/config/loader.py +0 -0
  156. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/config/schema.py +0 -0
  157. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/__init__.py +0 -0
  158. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  159. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  160. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  161. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  162. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  163. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  164. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  165. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  166. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  167. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  168. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  169. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  170. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/augment.py +0 -0
  171. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/chat_templates.py +0 -0
  172. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/collators.py +0 -0
  173. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/formats.py +0 -0
  174. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/loader.py +0 -0
  175. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/loss_mask.py +0 -0
  176. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/providers/__init__.py +0 -0
  177. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/providers/_utils.py +0 -0
  178. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/providers/anthropic.py +0 -0
  179. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/providers/ollama.py +0 -0
  180. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/providers/vllm.py +0 -0
  181. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/sft_format.py +0 -0
  182. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/__init__.py +0 -0
  183. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/code.py +0 -0
  184. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/conversation.py +0 -0
  185. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/preference.py +0 -0
  186. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/qa.py +0 -0
  187. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/reasoning.py +0 -0
  188. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/tool_calling.py +0 -0
  189. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/templates/verifiable.py +0 -0
  190. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/traces/__init__.py +0 -0
  191. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/traces/pair_builder.py +0 -0
  192. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/traces/parsers.py +0 -0
  193. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/traces/quality.py +0 -0
  194. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/data/validator.py +0 -0
  195. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/__init__.py +0 -0
  196. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/arena.py +0 -0
  197. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  198. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/calibrate.py +0 -0
  199. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  200. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/custom.py +0 -0
  201. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/forgetting.py +0 -0
  202. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/gate.py +0 -0
  203. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/human.py +0 -0
  204. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/judge.py +0 -0
  205. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/leaderboard.py +0 -0
  206. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/eval/quant_check.py +0 -0
  207. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/experiment/__init__.py +0 -0
  208. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/migrate/__init__.py +0 -0
  209. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/migrate/axolotl.py +0 -0
  210. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/migrate/common.py +0 -0
  211. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/migrate/llamafactory.py +0 -0
  212. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/migrate/unsloth.py +0 -0
  213. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/__init__.py +0 -0
  214. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/callback.py +0 -0
  215. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/display.py +0 -0
  216. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  217. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/hf_push.py +0 -0
  218. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  219. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/monitoring/trace_logger.py +0 -0
  220. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/plugins/__init__.py +0 -0
  221. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/py.typed +0 -0
  222. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/recipes/__init__.py +0 -0
  223. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/recipes/catalog.py +0 -0
  224. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/registry/__init__.py +0 -0
  225. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/registry/attach.py +0 -0
  226. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/registry/diff.py +0 -0
  227. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/registry/hashing.py +0 -0
  228. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/registry/store.py +0 -0
  229. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/__init__.py +0 -0
  230. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/audio.yaml +0 -0
  231. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/bco.yaml +0 -0
  232. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/chat.yaml +0 -0
  233. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/code.yaml +0 -0
  234. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/embedding.yaml +0 -0
  235. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  236. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  237. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  238. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/ipo.yaml +0 -0
  239. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/kto.yaml +0 -0
  240. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/longcontext.yaml +0 -0
  241. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/manifest.json +0 -0
  242. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/medical.yaml +0 -0
  243. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/moe.yaml +0 -0
  244. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/orpo.yaml +0 -0
  245. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/pretrain.yaml +0 -0
  246. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/reasoning.yaml +0 -0
  247. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/rlhf.yaml +0 -0
  248. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/simpo.yaml +0 -0
  249. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/tool-calling.yaml +0 -0
  250. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/templates/vision.yaml +0 -0
  251. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/__init__.py +0 -0
  252. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/bco.py +0 -0
  253. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/classifier.py +0 -0
  254. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/distill.py +0 -0
  255. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/dpo.py +0 -0
  256. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/embedding.py +0 -0
  257. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/grpo.py +0 -0
  258. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/ipo.py +0 -0
  259. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/kto.py +0 -0
  260. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  261. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  262. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_routing.py +0 -0
  263. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_sft.py +0 -0
  264. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/orpo.py +0 -0
  265. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/ppo.py +0 -0
  266. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/preference.py +0 -0
  267. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/pretrain.py +0 -0
  268. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/prm.py +0 -0
  269. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/reward_model.py +0 -0
  270. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/rewards.py +0 -0
  271. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/sft.py +0 -0
  272. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/simpo.py +0 -0
  273. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/trainer/unlearn.py +0 -0
  274. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/tui_app.py +0 -0
  275. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/__init__.py +0 -0
  276. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/app.py +0 -0
  277. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/plugins/__init__.py +0 -0
  278. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/static/app.js +0 -0
  279. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/static/index.html +0 -0
  280. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/static/logo.png +0 -0
  281. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/static/logo.svg +0 -0
  282. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/ui/static/style.css +0 -0
  283. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/__init__.py +0 -0
  284. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/_eval_text.py +0 -0
  285. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ab_test.py +0 -0
  286. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/activation_offload.py +0 -0
  287. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/active_sampler.py +0 -0
  288. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_bisect.py +0 -0
  289. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_branch.py +0 -0
  290. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_diff.py +0 -0
  291. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_merge.py +0 -0
  292. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_pr.py +0 -0
  293. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_scan.py +0 -0
  294. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_sign.py +0 -0
  295. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/advanced_precision.py +0 -0
  296. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/agent_forge.py +0 -0
  297. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/agent_rollout.py +0 -0
  298. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/airgap_bundle.py +0 -0
  299. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/annex_xi.py +0 -0
  300. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/anthropic_messages.py +0 -0
  301. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/apple_adapter.py +0 -0
  302. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/attest.py +0 -0
  303. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/audit_log.py +0 -0
  304. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/auto_quant.py +0 -0
  305. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/backend_detect.py +0 -0
  306. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/batch_probe.py +0 -0
  307. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/behavior_battery.py +0 -0
  308. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/bitnet.py +0 -0
  309. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/blame.py +0 -0
  310. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/block_expansion.py +0 -0
  311. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/bom.py +0 -0
  312. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/brain_rot.py +0 -0
  313. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  314. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/build_dag.py +0 -0
  315. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/canary_discovery.py +0 -0
  316. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/canary_router.py +0 -0
  317. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/capability_suite.py +0 -0
  318. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/checklist_dsl.py +0 -0
  319. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  320. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/citation_faithful.py +0 -0
  321. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/classifier.py +0 -0
  322. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/cmaes_merge.py +0 -0
  323. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/compile_tools.py +0 -0
  324. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/completions.py +0 -0
  325. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/constants.py +0 -0
  326. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/convergence.py +0 -0
  327. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/crash.py +0 -0
  328. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  329. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/curriculum.py +0 -0
  330. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/cut_ce.py +0 -0
  331. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/data_forge.py +0 -0
  332. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/data_mix.py +0 -0
  333. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/data_pipeline.py +0 -0
  334. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/data_score.py +0 -0
  335. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/deepspeed.py +0 -0
  336. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  337. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/demo_bundles.py +0 -0
  338. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  339. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/deploy_measure.py +0 -0
  340. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  341. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/_common.py +0 -0
  342. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/badge.py +0 -0
  343. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  344. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  345. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/format.py +0 -0
  346. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  347. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  348. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  349. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/report.py +0 -0
  350. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/runner.py +0 -0
  351. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/distill.py +0 -0
  352. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/dpo_variants.py +0 -0
  353. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  354. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/echo_trap.py +0 -0
  355. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/edit_diff.py +0 -0
  356. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/edit_governor.py +0 -0
  357. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/encoding.py +0 -0
  358. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/energy.py +0 -0
  359. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/env_lock.py +0 -0
  360. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/errors.py +0 -0
  361. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/eval_design.py +0 -0
  362. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  363. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  364. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/expectations.py +0 -0
  365. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/fetch_examples.py +0 -0
  366. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/flash_attn.py +0 -0
  367. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/fp8.py +0 -0
  368. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/freeze.py +0 -0
  369. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/fsdp.py +0 -0
  370. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  371. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/galore.py +0 -0
  372. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/gguf_quant.py +0 -0
  373. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/gpu.py +0 -0
  374. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/gpu_monitor.py +0 -0
  375. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/grace_codebook.py +0 -0
  376. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/graceful_save.py +0 -0
  377. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/grad_accum.py +0 -0
  378. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  379. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/grpo_long_context.py +0 -0
  380. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/grpo_variants.py +0 -0
  381. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/hardware_fit.py +0 -0
  382. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/hf.py +0 -0
  383. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/hf_space.py +0 -0
  384. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/hubs.py +0 -0
  385. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ingest_sources.py +0 -0
  386. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/integrations.py +0 -0
  387. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/interference.py +0 -0
  388. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/irt.py +0 -0
  389. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/iterative_dpo.py +0 -0
  390. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  391. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/kernel_picker.py +0 -0
  392. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/knowledge_edit.py +0 -0
  393. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/kv_cache.py +0 -0
  394. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/launcher.py +0 -0
  395. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/license_advisor.py +0 -0
  396. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/license_matrix.py +0 -0
  397. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/liger.py +0 -0
  398. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/llama_proxy.py +0 -0
  399. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/llama_server_timings.py +0 -0
  400. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/local_rl.py +0 -0
  401. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loftq_init.py +0 -0
  402. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/log_level.py +0 -0
  403. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/long_context.py +0 -0
  404. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/longlora.py +0 -0
  405. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loop_budget.py +0 -0
  406. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loop_daemon.py +0 -0
  407. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loop_iteration.py +0 -0
  408. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loop_stages.py +0 -0
  409. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/loop_state.py +0 -0
  410. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/lr_finder.py +0 -0
  411. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/lr_groups.py +0 -0
  412. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/magpie.py +0 -0
  413. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/metrics.py +0 -0
  414. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/mii.py +0 -0
  415. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/minillm.py +0 -0
  416. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/mix_proxy.py +0 -0
  417. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/mixed_precision.py +0 -0
  418. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/mlx.py +0 -0
  419. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/moe.py +0 -0
  420. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/moe_quant.py +0 -0
  421. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/mole_routing.py +0 -0
  422. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/multipack.py +0 -0
  423. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/multipack_sampler.py +0 -0
  424. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/multipack_trainer.py +0 -0
  425. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/namespace_pin.py +0 -0
  426. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/neat_packing.py +0 -0
  427. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ngram_spec.py +0 -0
  428. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/nlg_metrics.py +0 -0
  429. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ollama.py +0 -0
  430. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/onboarding.py +0 -0
  431. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  432. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/paths.py +0 -0
  433. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/peft_builder.py +0 -0
  434. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/peft_patches.py +0 -0
  435. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/persona_hub.py +0 -0
  436. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/pipeline.py +0 -0
  437. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/preference_combine.py +0 -0
  438. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/prm.py +0 -0
  439. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/probe_pack.py +0 -0
  440. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/profiler.py +0 -0
  441. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/profiling.py +0 -0
  442. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  443. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/prompt_compile.py +0 -0
  444. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/prompt_distill.py +0 -0
  445. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/qat.py +0 -0
  446. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/qr_url.py +0 -0
  447. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/quality.py +0 -0
  448. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/quant_menu.py +0 -0
  449. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ra_dit.py +0 -0
  450. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/reasoning_effort.py +0 -0
  451. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/reasoning_parser.py +0 -0
  452. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/recipe_dag.py +0 -0
  453. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/recipe_run.py +0 -0
  454. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/registry.py +0 -0
  455. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/relora.py +0 -0
  456. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/replay.py +0 -0
  457. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/repro_receipt.py +0 -0
  458. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/reward_hacking.py +0 -0
  459. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ring_attention.py +0 -0
  460. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  461. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/run_cost.py +0 -0
  462. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/sae_diff.py +0 -0
  463. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/save_formats.py +0 -0
  464. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/server_tools.py +0 -0
  465. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/sglang.py +0 -0
  466. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/shortcuts.py +0 -0
  467. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/signing.py +0 -0
  468. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/sleeper_probe.py +0 -0
  469. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/soup_lock.py +0 -0
  470. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/spec_pairing.py +0 -0
  471. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/spike_recovery.py +0 -0
  472. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/sse_train_stream.py +0 -0
  473. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/steering.py +0 -0
  474. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/strict_safetensors.py +0 -0
  475. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/structured_output.py +0 -0
  476. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/sweep_config.py +0 -0
  477. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/tail_latency.py +0 -0
  478. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/terraform_plan.py +0 -0
  479. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/tool_outputs.py +0 -0
  480. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/topology.py +0 -0
  481. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/tracing.py +0 -0
  482. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/trackers.py +0 -0
  483. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/train_event_buffer.py +0 -0
  484. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/trainer_plugins.py +0 -0
  485. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/trust_remote.py +0 -0
  486. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/tts.py +0 -0
  487. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/tunability.py +0 -0
  488. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/ui_env.py +0 -0
  489. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/uld.py +0 -0
  490. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/unlearning.py +0 -0
  491. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/unlearning_eval.py +0 -0
  492. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/unsloth.py +0 -0
  493. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/v028_features.py +0 -0
  494. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/vector_bank.py +0 -0
  495. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/vllm.py +0 -0
  496. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/vscode_setup.py +0 -0
  497. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/warmup.py +0 -0
  498. {soup_cli-0.71.4 → soup_cli-0.71.5}/src/soup_cli/utils/why.py +0 -0
  499. {soup_cli-0.71.4 → soup_cli-0.71.5}/templates/chat.yaml +0 -0
  500. {soup_cli-0.71.4 → soup_cli-0.71.5}/templates/code.yaml +0 -0
  501. {soup_cli-0.71.4 → soup_cli-0.71.5}/templates/medical.yaml +0 -0
  502. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/__init__.py +0 -0
  503. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/conftest.py +0 -0
  504. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/qa/v053_qa.md +0 -0
  505. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_adapters.py +0 -0
  506. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_advanced_peft.py +0 -0
  507. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_assistant_mask.py +0 -0
  508. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_audio.py +0 -0
  509. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_auto_tuning.py +0 -0
  510. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_autopilot.py +0 -0
  511. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_awq_gptq_export.py +0 -0
  512. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_batch_probe.py +0 -0
  513. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_bco.py +0 -0
  514. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_bench.py +0 -0
  515. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_brain_rot_multilingual.py +0 -0
  516. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_bugfixes.py +0 -0
  517. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_callback.py +0 -0
  518. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_cans.py +0 -0
  519. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_chat.py +0 -0
  520. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_chat_template.py +0 -0
  521. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_cli.py +0 -0
  522. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_cli_subprocess.py +0 -0
  523. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_config.py +0 -0
  524. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_cost.py +0 -0
  525. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_crash_reporter.py +0 -0
  526. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_curriculum.py +0 -0
  527. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_data.py +0 -0
  528. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_data_augment.py +0 -0
  529. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_data_sample.py +0 -0
  530. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_data_split.py +0 -0
  531. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_data_tools.py +0 -0
  532. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_dataset_hub.py +0 -0
  533. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_dataset_registry.py +0 -0
  534. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_deepspeed.py +0 -0
  535. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_deploy_ollama.py +0 -0
  536. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_diff.py +0 -0
  537. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_display.py +0 -0
  538. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_doctor.py +0 -0
  539. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_dpo_example.py +0 -0
  540. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_dpo_variants.py +0 -0
  541. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_embedding.py +0 -0
  542. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_errors.py +0 -0
  543. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_eval.py +0 -0
  544. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_eval_gate.py +0 -0
  545. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_eval_platform.py +0 -0
  546. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_export.py +0 -0
  547. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_formats.py +0 -0
  548. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_fp8_recipe.py +0 -0
  549. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_freeze_training.py +0 -0
  550. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_generate.py +0 -0
  551. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_gpu.py +0 -0
  552. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_grpo.py +0 -0
  553. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_hf_integration.py +0 -0
  554. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_infer.py +0 -0
  555. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_inference_advanced.py +0 -0
  556. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_init.py +0 -0
  557. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ipo.py +0 -0
  558. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_jinja_analyzer.py +0 -0
  559. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_kto.py +0 -0
  560. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_loader.py +0 -0
  561. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_log_level.py +0 -0
  562. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_loss_watchdog.py +0 -0
  563. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_merge.py +0 -0
  564. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_migrate.py +0 -0
  565. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_mlx_backend.py +0 -0
  566. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_moe.py +0 -0
  567. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_multi_adapter.py +0 -0
  568. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_multi_gpu.py +0 -0
  569. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_multipack_config.py +0 -0
  570. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_multipack_invariants.py +0 -0
  571. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_multipack_sampler.py +0 -0
  572. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_neat_packing.py +0 -0
  573. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_neftune_rslora.py +0 -0
  574. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_onnx_tensorrt_export.py +0 -0
  575. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_orpo.py +0 -0
  576. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_packing.py +0 -0
  577. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_a_wave1.py +0 -0
  578. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_a_wave2.py +0 -0
  579. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_b.py +0 -0
  580. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_c.py +0 -0
  581. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_d.py +0 -0
  582. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_e.py +0 -0
  583. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_part_f_hardening.py +0 -0
  584. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_peft_methods.py +0 -0
  585. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_peft_patches.py +0 -0
  586. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_performance.py +0 -0
  587. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_pissa_init.py +0 -0
  588. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ppo.py +0 -0
  589. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_preference_dispatcher.py +0 -0
  590. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_preference_multi.py +0 -0
  591. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_preference_multi_runtime.py +0 -0
  592. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_pretrain.py +0 -0
  593. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_profile.py +0 -0
  594. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_profiling.py +0 -0
  595. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_progress.py +0 -0
  596. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_push.py +0 -0
  597. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_qat.py +0 -0
  598. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_quality_filter.py +0 -0
  599. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_quant_check.py +0 -0
  600. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_quant_menu.py +0 -0
  601. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_quickstart.py +0 -0
  602. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_rank_pattern.py +0 -0
  603. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_recipes.py +0 -0
  604. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_recipes_v031.py +0 -0
  605. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_refusal_multilingual.py +0 -0
  606. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_registry.py +0 -0
  607. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_relora.py +0 -0
  608. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_replay.py +0 -0
  609. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_resume.py +0 -0
  610. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_rlvr.py +0 -0
  611. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_run_cost.py +0 -0
  612. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_runs.py +0 -0
  613. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_serve.py +0 -0
  614. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_server_generate.py +0 -0
  615. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_sglang_serve.py +0 -0
  616. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_simpo.py +0 -0
  617. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_smoke_train.py +0 -0
  618. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_speculative_decoding.py +0 -0
  619. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_sweep.py +0 -0
  620. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_synth_data_pro.py +0 -0
  621. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_templates_yaml.py +0 -0
  622. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_tensorboard.py +0 -0
  623. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_tool_calling.py +0 -0
  624. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_trace_to_pref.py +0 -0
  625. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_tracker.py +0 -0
  626. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_trainer_coverage_v035.py +0 -0
  627. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_trainer_init.py +0 -0
  628. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_training_intelligence.py +0 -0
  629. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_training_speed.py +0 -0
  630. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_trust_remote_code.py +0 -0
  631. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_tui.py +0 -0
  632. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ui.py +0 -0
  633. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ui_chat.py +0 -0
  634. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ui_config_builder.py +0 -0
  635. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ui_live_monitor.py +0 -0
  636. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_ui_metrics.py +0 -0
  637. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_unsloth.py +0 -0
  638. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0401_part_c.py +0 -0
  639. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0401_part_d.py +0 -0
  640. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0401_part_e.py +0 -0
  641. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0402_part_a.py +0 -0
  642. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0402_part_b.py +0 -0
  643. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0403_part_a.py +0 -0
  644. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0403_part_b.py +0 -0
  645. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0403_part_c.py +0 -0
  646. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0404_part_a.py +0 -0
  647. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0404_part_b.py +0 -0
  648. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0405_part_a.py +0 -0
  649. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0406_part_a.py +0 -0
  650. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0410_part_a.py +0 -0
  651. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0410_part_b.py +0 -0
  652. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0410_part_c.py +0 -0
  653. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0420.py +0 -0
  654. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0430_part_a.py +0 -0
  655. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0430_part_b.py +0 -0
  656. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0430_part_c.py +0 -0
  657. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0430_part_d.py +0 -0
  658. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0440_part_a.py +0 -0
  659. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0440_part_b.py +0 -0
  660. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0440_part_c.py +0 -0
  661. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0440_part_d.py +0 -0
  662. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0440_review_followups.py +0 -0
  663. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0450.py +0 -0
  664. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0460_part_a.py +0 -0
  665. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0460_part_b.py +0 -0
  666. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0470_part_a.py +0 -0
  667. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0470_part_b.py +0 -0
  668. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0480_part_a.py +0 -0
  669. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0480_part_b.py +0 -0
  670. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0490.py +0 -0
  671. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0500_part_a.py +0 -0
  672. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0500_part_b.py +0 -0
  673. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0500_part_c.py +0 -0
  674. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0500_part_d.py +0 -0
  675. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0500_part_e.py +0 -0
  676. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0510.py +0 -0
  677. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0520.py +0 -0
  678. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0530.py +0 -0
  679. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v05310.py +0 -0
  680. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v05311.py +0 -0
  681. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0531_109.py +0 -0
  682. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0531_139.py +0 -0
  683. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0531_142.py +0 -0
  684. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0531_82.py +0 -0
  685. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0532.py +0 -0
  686. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0533.py +0 -0
  687. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0534.py +0 -0
  688. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0535.py +0 -0
  689. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0536.py +0 -0
  690. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0537.py +0 -0
  691. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0538.py +0 -0
  692. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0539.py +0 -0
  693. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0540.py +0 -0
  694. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0550.py +0 -0
  695. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0550_followups.py +0 -0
  696. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0560.py +0 -0
  697. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0570_part_a.py +0 -0
  698. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0570_part_b.py +0 -0
  699. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0570_part_c.py +0 -0
  700. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0570_part_d.py +0 -0
  701. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0580.py +0 -0
  702. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0590.py +0 -0
  703. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_a.py +0 -0
  704. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_b.py +0 -0
  705. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_c.py +0 -0
  706. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_d.py +0 -0
  707. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_e.py +0 -0
  708. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0600_part_f.py +0 -0
  709. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0610_part_a.py +0 -0
  710. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0610_part_b.py +0 -0
  711. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0610_part_c.py +0 -0
  712. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0610_part_d.py +0 -0
  713. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0610_part_e.py +0 -0
  714. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_followups.py +0 -0
  715. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_part_a.py +0 -0
  716. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_part_b.py +0 -0
  717. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_part_c.py +0 -0
  718. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_part_d.py +0 -0
  719. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0620_part_e.py +0 -0
  720. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_followups.py +0 -0
  721. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_part_a.py +0 -0
  722. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_part_b.py +0 -0
  723. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_part_c.py +0 -0
  724. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_part_d.py +0 -0
  725. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0630_part_e.py +0 -0
  726. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0631_206.py +0 -0
  727. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_followups.py +0 -0
  728. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_a.py +0 -0
  729. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_b.py +0 -0
  730. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_c.py +0 -0
  731. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_d.py +0 -0
  732. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_e.py +0 -0
  733. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0640_part_f.py +0 -0
  734. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_followups.py +0 -0
  735. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_part_a.py +0 -0
  736. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_part_b.py +0 -0
  737. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_part_c.py +0 -0
  738. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_part_d.py +0 -0
  739. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0650_part_e.py +0 -0
  740. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_cli.py +0 -0
  741. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_followups.py +0 -0
  742. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_part_a.py +0 -0
  743. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_part_b.py +0 -0
  744. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_part_c.py +0 -0
  745. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_part_d.py +0 -0
  746. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0660_part_e.py +0 -0
  747. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_followups.py +0 -0
  748. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_a.py +0 -0
  749. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_b.py +0 -0
  750. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_c.py +0 -0
  751. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_d.py +0 -0
  752. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_e.py +0 -0
  753. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0670_part_f.py +0 -0
  754. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_followups.py +0 -0
  755. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_part_a.py +0 -0
  756. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_part_b.py +0 -0
  757. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_part_c.py +0 -0
  758. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_part_d.py +0 -0
  759. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0680_part_e.py +0 -0
  760. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0690_part_a.py +0 -0
  761. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0690_part_b.py +0 -0
  762. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0690_part_c.py +0 -0
  763. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0690_part_d.py +0 -0
  764. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0690_part_e.py +0 -0
  765. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_a.py +0 -0
  766. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_b.py +0 -0
  767. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_c.py +0 -0
  768. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_d.py +0 -0
  769. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_e.py +0 -0
  770. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0700_part_f.py +0 -0
  771. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0712.py +0 -0
  772. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0713.py +0 -0
  773. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_v0714.py +0 -0
  774. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_validator.py +0 -0
  775. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_vision.py +0 -0
  776. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_vllm_serve.py +0 -0
  777. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_why.py +0 -0
  778. {soup_cli-0.71.4 → soup_cli-0.71.5}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,51 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.5] - 2026-06-02
16
+
17
+ ### Added
18
+ - **`soup eval against` now reads eval metrics** — `ExperimentTracker.get_metric_series`
19
+ falls back to the `eval_results` table when the metric is not a per-step
20
+ training column (`loss` / `lr` / `grad_norm` / `speed` / `gpu_mem`). So
21
+ `soup eval against <base> --candidate <run> --metric task_accuracy` returns a
22
+ real score series (benchmark scores live in `eval_results`, not `metrics`)
23
+ instead of "Empty series". Per-step columns still read from `metrics` — no
24
+ regression for existing callers.
25
+ - **`soup advise` learns from past project outcomes** — `soup advise` now reads
26
+ this project's accepted-verdict history (`~/.soup/advise_history.jsonl`) and
27
+ biases the rubric: 3+ successful SFT precedents flip a marginal RAG call to
28
+ SFT; 3+ negative GRPO outcomes suppress GRPO in favour of SFT-on-traces; an
29
+ encouraged choice gets a small confidence nudge. Scoped per-project (one
30
+ project's record never biases another). No history → identical to before.
31
+ - **Slack/Discord webhooks on four more commands** — `--slack-url` / `--discord-url`
32
+ (SSRF-hardened, loopback-only HTTP, RFC1918 rejected, never crashes the
33
+ command) now ship on `soup ingest`, `soup prune-prompt`, `soup ab` (fires only
34
+ on a `reject_h0` / `accept_h0` decision, not `continue`), and
35
+ `soup data active-sample` — not just `soup drift-alarm`. The validator + sender
36
+ moved to a shared `soup_cli/utils/webhooks.py`.
37
+ - **Tokenizer-aware `soup prune-prompt`** — `--tokenizer <model_or_path>` detects
38
+ and strips the shared system-prompt prefix on **token** boundaries instead of
39
+ characters, so a multi-byte UTF-8 prefix can never be split mid-code-point.
40
+ Default (no `--tokenizer`) keeps the whitespace-character behaviour.
41
+ - **Curriculum bucketing by loss percentile** — `DynamicCurriculumCallback` now
42
+ buckets samples by the percentile rank of the live loss (or perplexity)
43
+ signal within a rolling window when `data.curriculum_metric` is `loss` /
44
+ `perplexity`, so a consistently-hard sample is routed to the same difficulty
45
+ bucket across recomputes. `length` and warm-up still use round-robin.
46
+ - **`--hub` on `soup data push` and `soup data forge`** — `soup data push
47
+ --hub modelscope|modelers` uploads a dataset via the matching SDK
48
+ (`repo_type=dataset`, commit message sanitised); `soup data forge --hub
49
+ <non-hf> --teacher owner/name` pre-fetches the teacher model from that hub
50
+ (and warns when the teacher is not a repo id so `--hub` is never silently
51
+ ignored). HF stays the default.
52
+
53
+ ### Notes
54
+ - Live SaaS *pull* adapters for `soup ingest` (Langfuse / LangSmith / Helicone /
55
+ OpenPipe / OpenAI SDKs, issue #204) remain deferred: they need credentialed
56
+ vendor accounts with populated trace data to validate honestly. Tracked as an
57
+ open, `infra-blocked` (external-account) item. `soup ingest` continues to parse
58
+ the JSONL export you pull from your dashboard.
59
+
15
60
  ## [0.71.4] - 2026-06-02
16
61
 
17
62
  ### 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 (274 files, 12474 tests)
123
+ tests/ - Test suite (275 files, 12581 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.4
3
+ Version: 0.71.5
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,21 +183,22 @@ infrastructure instead of improving models. Soup fixes that.
183
183
 
184
184
  ## What's New
185
185
 
186
- **v0.71.4Adapter lifecycle + loop wiring.** The merge, PR, and continuous-loop surfaces go live:
187
-
188
- - **Canary verdict on merge** — `soup adapters merge --canary suite.json` scores the merged
189
- adapter and reports **OK / MINOR / MAJOR**; `--strict-verdict` exits non-zero on a MAJOR
190
- regression. Works with no model load using a pre-scored canary suite.
191
- - **Evolutionary merge for real** — `soup adapters merge --strategy cmaes --eval suite --budget 1h`
192
- now runs the full CMA-ES search (merge score optimise) and writes the best blend, instead of
193
- just printing a plan.
194
- - **Publish an adapter PR** — `soup adapters pr <title> --base-sha <hex> --adapter <path> --push
195
- owner/repo#42` posts the rendered PR straight to a GitHub PR comment.
196
- - **Continuous fine-tuning loop, wired up** `soup loop watch --pre-wired` runs the real
197
- traces DPO eval-gate canary pipeline; `--pack-cans` snapshots every iteration as a
198
- shareable Soup Can with Registry lineage (`soup loop replay <id> --extract dir`).
199
- - **Branches Registry** — `soup adapters branch <name> --attach-to-registry <id>` /
200
- `--from-registry <id>` links training-env snapshots into the Registry lineage DAG.
186
+ **v0.71.5Ingest, data & prompt polish.** Sharper production-loop ergonomics:
187
+
188
+ - **Alternative model hubs for data** — `soup data push --hub modelscope|modelers` uploads a
189
+ local JSONL to ModelScope / Modelers, and `soup data forge --hub --teacher owner/name`
190
+ pre-fetches the teacher from that hub.
191
+ - **Tokenizer-aware prompt pruning** — `soup prune-prompt --tokenizer <id-or-path>` finds the
192
+ shared *token* prefix and decodes only the remainder, so BPE multi-byte sequences never get
193
+ truncated mid-token the way char-slicing can.
194
+ - **Webhooks everywhere** — `--slack-url` / `--discord-url` now work on `soup ingest`,
195
+ `soup prune-prompt`, `soup ab`, and `soup data active-sample` (same SSRF-hardened validator as
196
+ `soup drift-alarm`). The A/B harness only pings when the sequential test actually decides.
197
+ - **Curriculum by difficulty percentile** dynamic curriculum can bucket by `loss` /
198
+ `perplexity` percentile instead of length round-robin.
199
+ - **Smarter pre-flight `advise`** — `soup advise` now nudges its confidence using your prior
200
+ verdicts for the same project, and `soup runs replay` can plot a benchmark-score curve, not
201
+ just the loss curve.
201
202
 
202
203
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
203
204
 
@@ -49,21 +49,22 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.4Adapter lifecycle + loop wiring.** The merge, PR, and continuous-loop surfaces go live:
53
-
54
- - **Canary verdict on merge** — `soup adapters merge --canary suite.json` scores the merged
55
- adapter and reports **OK / MINOR / MAJOR**; `--strict-verdict` exits non-zero on a MAJOR
56
- regression. Works with no model load using a pre-scored canary suite.
57
- - **Evolutionary merge for real** — `soup adapters merge --strategy cmaes --eval suite --budget 1h`
58
- now runs the full CMA-ES search (merge score optimise) and writes the best blend, instead of
59
- just printing a plan.
60
- - **Publish an adapter PR** — `soup adapters pr <title> --base-sha <hex> --adapter <path> --push
61
- owner/repo#42` posts the rendered PR straight to a GitHub PR comment.
62
- - **Continuous fine-tuning loop, wired up** `soup loop watch --pre-wired` runs the real
63
- traces DPO eval-gate canary pipeline; `--pack-cans` snapshots every iteration as a
64
- shareable Soup Can with Registry lineage (`soup loop replay <id> --extract dir`).
65
- - **Branches Registry** — `soup adapters branch <name> --attach-to-registry <id>` /
66
- `--from-registry <id>` links training-env snapshots into the Registry lineage DAG.
52
+ **v0.71.5Ingest, data & prompt polish.** Sharper production-loop ergonomics:
53
+
54
+ - **Alternative model hubs for data** — `soup data push --hub modelscope|modelers` uploads a
55
+ local JSONL to ModelScope / Modelers, and `soup data forge --hub --teacher owner/name`
56
+ pre-fetches the teacher from that hub.
57
+ - **Tokenizer-aware prompt pruning** — `soup prune-prompt --tokenizer <id-or-path>` finds the
58
+ shared *token* prefix and decodes only the remainder, so BPE multi-byte sequences never get
59
+ truncated mid-token the way char-slicing can.
60
+ - **Webhooks everywhere** — `--slack-url` / `--discord-url` now work on `soup ingest`,
61
+ `soup prune-prompt`, `soup ab`, and `soup data active-sample` (same SSRF-hardened validator as
62
+ `soup drift-alarm`). The A/B harness only pings when the sequential test actually decides.
63
+ - **Curriculum by difficulty percentile** dynamic curriculum can bucket by `loss` /
64
+ `perplexity` percentile instead of length round-robin.
65
+ - **Smarter pre-flight `advise`** — `soup advise` now nudges its confidence using your prior
66
+ verdicts for the same project, and `soup runs replay` can plot a benchmark-score curve, not
67
+ just the loss curve.
67
68
 
68
69
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
69
70
 
@@ -459,6 +459,11 @@ Every completed run also stores an estimated cost (`$` per run) computed from th
459
459
  captured GPU device name and duration. `soup runs show` renders `—` for CPU /
460
460
  MPS / unknown GPUs (no fabricated zeros).
461
461
 
462
+ As of v0.71.5, the metric-series lookup that powers replay (`ExperimentTracker.get_metric_series`)
463
+ transparently falls back to the `eval_results` table when a metric has no per-step
464
+ rows — so you can plot a benchmark-score curve (e.g. `mmlu`, `gsm8k`) the same way
465
+ you plot `loss`, without caring which table holds the series.
466
+
462
467
  ### Tracker integrations (--tracker mlflow / swanlab / trackio)
463
468
 
464
469
  ```bash
@@ -90,10 +90,12 @@ soup data download user/ds --samples 1000 Stream first 1000 samples
90
90
  soup data register --name my-ds --path d.jsonl --format alpaca Register dataset
91
91
  soup data unregister --name my-ds Remove from registry
92
92
  soup data push --input d.jsonl --hf-dataset user/name Upload local JSONL as HF dataset
93
+ soup data push --input d.jsonl --hf-dataset u/n --hub modelscope|modelers Upload to an alternative hub
93
94
  soup data registry List all registered datasets
94
95
  soup data demo List bundled demo JSONL fixtures
95
96
  soup data demo alpaca_demo --output ./d.jsonl Copy a bundled demo JSONL fixture
96
97
  soup data forge --docs ./docs --task sft --target-rows 1000 Synthetic data pipeline + provenance
98
+ soup data forge --docs ./docs --hub modelscope --teacher owner/name Pre-fetch the teacher from an alternative hub
97
99
  soup data score --input rows.jsonl Composite quality scorecard (PII + toxicity + lang + edu)
98
100
  soup data decontaminate --input rows.jsonl --benchmarks mmlu,gsm8k Drop benchmark-overlap rows
99
101
  soup data toxicity --input rows.jsonl -o tox.jsonl Flag toxic rows (keyword baseline)
@@ -137,7 +139,7 @@ soup can publish r.can --hf-hub user/name Publish .can to HF Hub as dataset
137
139
  soup runs List training runs
138
140
  soup runs show <run_id> Run details + loss graph + cost
139
141
  soup runs compare <run_1> <run_2> Compare two runs
140
- soup runs replay <run_id> Replay summary + loss curve from history
142
+ soup runs replay <run_id> Replay summary + loss curve from history (also plots a benchmark-score curve when the metric lives in eval_results)
141
143
  soup why [run_id] Explain training anomalies (heuristic)
142
144
  soup tui Full-screen Textual dashboard (requires [tui] extra)
143
145
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
@@ -169,8 +171,10 @@ soup edit set --base <m> --method rome|memit|alphaedit --subject "..." --target
169
171
  soup edit diff <before-run> <after-run> --probes p.jsonl Knowledge-injection diff visualizer
170
172
  soup ingest --source langfuse|langsmith|helicone|openpipe|otel|openai-stored --logs <jsonl> Universal trace importer (6 SaaS adapters → normalised JSONL)
171
173
  soup prune-prompt --input <jsonl> --output <jsonl> --min-frequency 0.95 Detect + strip shared system-prompt prefix
174
+ soup prune-prompt ... --tokenizer <id-or-path> Tokenizer-aware prefix detection (decodes remaining ids, boundary-safe)
172
175
  soup data active-sample --input <jsonl> --output <jsonl> --budget N Top-N uncertain prod traces for human review
173
176
  soup ab --input <jsonl> --metric latency|judge_score|retry_rate mSPRT sequential A/B (decision: continue / reject_h0 / accept_h0)
177
+ soup ingest|prune-prompt|ab|data active-sample ... --slack-url <https> | --discord-url <https> Shared SSRF-validated webhook on completion
174
178
  soup drift-alarm --reference <jsonl> --live <jsonl> --threshold 0.2 Rolling-KL drift alarm (exit 3 on drift)
175
179
  soup drift-alarm ... --slack-url <https> | --discord-url <https> Optional SSRF-validated webhook on drift detected
176
180
  soup tunability --list List built-in candidate-base catalogue
@@ -94,6 +94,14 @@ soup prune-prompt --input traces.jsonl --output pruned.jsonl --min-frequency 0.9
94
94
 
95
95
  Binary-search over up-to-32 candidate templates finds the longest qualifying prefix (a longer threshold-meeting prefix may exist beyond the universal one — Soup does not early-exit on the 100% match). Two-pass file read with a 100 000-row DoS cap.
96
96
 
97
+ **Tokenizer-aware mode (v0.71.5).** Pass `--tokenizer <id-or-path>` (a HuggingFace repo id, a local path, or anything `AutoTokenizer.from_pretrained` accepts) to detect the shared prefix in *token* space and decode only the remaining ids:
98
+
99
+ ```bash
100
+ soup prune-prompt --input traces.jsonl --output pruned.jsonl --tokenizer Qwen/Qwen2.5-0.5B
101
+ ```
102
+
103
+ Char-level stripping can cut a BPE multi-byte sequence in half when the shared prefix ends mid-token; token-aware pruning finds the longest shared *token-id* prefix and decodes the remainder, so the boundary always lands on a real token. Per-row encoding is capped at 50 000 tokens. Omit `--tokenizer` to keep the original character-level behaviour.
104
+
97
105
 
98
106
  ## Active-Learning Sampler (`soup data active-sample`)
99
107
 
@@ -108,6 +116,8 @@ soup data active-sample --input traces.jsonl --output for-review.jsonl --budget
108
116
 
109
117
  The output JSONL is a drop-in prompt set for `soup eval human` (v0.19). Budget is bounded `[1, 100 000]`.
110
118
 
119
+ **Webhooks (v0.71.5).** `soup ingest`, `soup prune-prompt`, `soup ab`, and `soup data active-sample` all accept `--slack-url` / `--discord-url` and POST a one-line summary on completion through the same SSRF-hardened validator as `soup drift-alarm` (scheme allowlist, loopback-only HTTP, RFC1918 / link-local / reserved / multicast rejected; the post never raises, so a flaky webhook can't fail the command). `soup ab` only fires when the sequential test actually decides (`reject_h0` / `accept_h0`), not while it's still `continue`-ing.
120
+
111
121
 
112
122
  ## Synthetic Data Generation
113
123
 
@@ -479,6 +489,8 @@ Three tasks supported: `sft` (Q&A pairs), `preference` (chosen/rejected), `tool`
479
489
 
480
490
  Document discovery is one level deep over `.txt` / `.md` / `.json` / `.jsonl`; dotfiles + symlinked directories are skipped. All paths are cwd-contained, all writes are atomic via staged-tempfile + `os.replace`, and write targets are rejected if they're symlinks. **Judge providers are live**: `--judge-provider ollama` (localhost-only), `--judge-provider anthropic` (env-only API key), `--judge-provider vllm` (scheme-validated). Per-call judge exceptions logged at DEBUG.
481
491
 
492
+ **Alternative teacher hubs (v0.71.5).** `--hub modelscope|modelers` pre-fetches the `--teacher` from that hub when the teacher is a routable repo id (`owner/name`); `--hub hf` (default) is a no-op and leaves the teacher as a provenance label. If `--hub` is non-HF but `--teacher` is not a repo id (e.g. the default `local-judge`), Soup prints a loud yellow warning rather than silently dropping the flag.
493
+
482
494
 
483
495
  ## Data Quality Scorecard
484
496
 
@@ -82,6 +82,8 @@ soup advise compare
82
82
  4. Task is `factual_lookup` with high output variance → **RAG**.
83
83
  5. Otherwise → **SFT**.
84
84
 
85
+ **Cross-project confidence bias (v0.71.5).** When `~/.soup/advise_history.jsonl` holds ≥3 prior verdicts for the *same choice* in the *same project*, `soup advise` nudges its confidence (not its decision) toward what worked before: a net-positive precedent record (you accepted it AND its recorded outcome was good) bumps confidence up by a small constant; a net-negative one bumps it down. The rubric verdict itself never changes — only how sure Soup is. Verdicts must be `--record`ed for the bias to kick in.
86
+
85
87
  **Why this command exists.** "Choose fine-tuning vs RAG vs prompt-engineering" is the most-mis-made decision in the space. Reddit, HN, IBM, and Google Cloud all converge on the same advice (start with prompts, escalate to RAG, fine-tune as last resort) and almost everyone ignores it because nobody has the data to prove their case is the exception. Soup `autopilot` picks hyperparameters AFTER you've decided to train; `soup advise` owns the layer above. No trainer library has an incentive to tell users *not to train* — Unsloth's funnel, Axolotl's hosted business, LLaMA-Factory's Alibaba alignment all monetise the training event.
86
88
 
87
89
 
@@ -213,6 +215,8 @@ soup ab --input ab.jsonl --metric judge_score --alpha 0.01 --beta 0.10 --effect-
213
215
 
214
216
  Input rows look like `{"arm": "control", "latency": 1.23}` or `{"arm": "treatment", "judge_score": 0.91}`. Decision is one of `continue` (keep collecting samples), `reject_h0` (real difference detected), `accept_h0` (no significant difference). Composes with `soup loop canary` (v0.58) — promote or roll back as soon as the LLR clears a decision boundary.
215
217
 
218
+ `soup ab` accepts `--slack-url` / `--discord-url` (v0.71.5) and pings the webhook **only when the test actually decides** (`reject_h0` / `accept_h0`) — a still-running `continue` stays quiet so you're not paged on every peek. Same SSRF-hardened validator as `soup drift-alarm`.
219
+
216
220
 
217
221
  ## Drift Alarm (`soup drift-alarm`)
218
222
 
@@ -907,12 +907,15 @@ Layer dynamic re-weighting on top of the static `curriculum` bucketer. Every N s
907
907
  training:
908
908
  curriculum: true # static bucketer (v0.23.0)
909
909
  curriculum_buckets: 4
910
+ curriculum_metric: perplexity # length (default) | loss | perplexity
910
911
  curriculum_dynamic: true # NEW — dynamic re-weighting
911
912
  curriculum_dynamic_recompute_steps: 50 # refresh every 50 global steps
912
913
  curriculum_dynamic_floor: 0.05 # min weight per bucket
913
914
  curriculum_dynamic_temperature: 1.0 # softmax temp on uncertainty
914
915
  ```
915
916
 
917
+ **Bucketing by difficulty percentile (v0.71.5).** When `curriculum_metric` is `loss` or `perplexity`, the dynamic callback assigns each step's sample to a bucket by its *rank* within a rolling 512-step window of the difficulty signal (perplexity = `exp(min(loss, 50))`), instead of the round-robin fallback used for `length`. This keeps the buckets calibrated to the live loss distribution rather than a static length sort. `length` (the default) keeps the round-robin assignment.
918
+
916
919
  Visualise the recorded bucket-weight evolution with `soup runs curriculum-curve <run_id>`.
917
920
 
918
921
  DDP / grad-accum safety: multi-rank launches must wire an `all_reduce` hook on per-bucket stats (a cross-validator rejects un-coordinated multi-rank runs upfront). Multi-trainer expansion beyond `sft` / `pretrain` is tracked for v0.48.1.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.4"
7
+ version = "0.71.5"
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.4"
3
+ __version__ = "0.71.5"
@@ -0,0 +1,71 @@
1
+ """Shared CLI glue for the --slack-url / --discord-url webhook flags (v0.71.5 #207).
2
+
3
+ Keeps Typer + Rich Console concerns in the commands layer (``utils/webhooks``
4
+ stays import-light + framework-free). Used by ``ingest`` / ``prune-prompt`` /
5
+ ``ab`` / ``data active-sample`` so the validate-then-deliver pattern is defined
6
+ once.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import Optional, Tuple
12
+
13
+ import typer
14
+ from rich.console import Console
15
+ from rich.markup import escape
16
+
17
+
18
+ def validate_webhook_flags(
19
+ slack_url: Optional[str],
20
+ discord_url: Optional[str],
21
+ *,
22
+ console: Console,
23
+ ) -> Tuple[Optional[str], Optional[str]]:
24
+ """Validate webhook URLs at the CLI boundary (``typer.Exit(2)`` on bad).
25
+
26
+ Returns the (canonical) URLs. Mirrors the v0.63.0 ``drift-alarm``
27
+ early-rejection pattern so a typo'd / SSRF-y URL fails fast with a
28
+ friendly message instead of being silently swallowed at delivery time.
29
+ """
30
+ from soup_cli.utils.webhooks import validate_webhook_url
31
+
32
+ out = []
33
+ for label, value in (("--slack-url", slack_url), ("--discord-url", discord_url)):
34
+ if value is None:
35
+ out.append(None)
36
+ continue
37
+ try:
38
+ out.append(validate_webhook_url(value))
39
+ except (TypeError, ValueError) as exc:
40
+ console.print(f"[red]{label}: {escape(str(exc))}[/]")
41
+ raise typer.Exit(2) from exc
42
+ return out[0], out[1]
43
+
44
+
45
+ def emit_webhooks(
46
+ slack_url: Optional[str],
47
+ discord_url: Optional[str],
48
+ *,
49
+ payload: dict,
50
+ console: Console,
51
+ ) -> None:
52
+ """POST the completion payload to any configured webhooks (best-effort).
53
+
54
+ Never raises (delegates to the never-raising
55
+ :func:`soup_cli.utils.webhooks.send_webhooks`). Prints a per-target
56
+ delivered/failed line so the operator sees whether the alert landed.
57
+ """
58
+ if slack_url is None and discord_url is None:
59
+ return
60
+ from soup_cli.utils.webhooks import send_webhooks
61
+
62
+ for label, ok in send_webhooks(
63
+ payload, slack_url=slack_url, discord_url=discord_url
64
+ ):
65
+ colour = "green" if ok else "yellow"
66
+ console.print(
67
+ f"[{colour}]{label} webhook: {'delivered' if ok else 'failed'}[/]"
68
+ )
69
+
70
+
71
+ __all__ = ["emit_webhooks", "validate_webhook_flags"]
@@ -2,12 +2,15 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from typing import Optional
6
+
5
7
  import typer
6
8
  from rich.console import Console
7
9
  from rich.markup import escape
8
10
  from rich.panel import Panel
9
11
  from rich.table import Table
10
12
 
13
+ from soup_cli.commands._webhook_cli import emit_webhooks, validate_webhook_flags
11
14
  from soup_cli.utils.ab_test import (
12
15
  MsprtConfig,
13
16
  run_msprt,
@@ -35,6 +38,20 @@ def ab(
35
38
  0.1, "--effect-size",
36
39
  help="Minimum detectable difference in means.",
37
40
  ),
41
+ slack_url: Optional[str] = typer.Option(
42
+ None, "--slack-url",
43
+ help=(
44
+ "Optional Slack webhook URL — POSTed on a reject_h0 / accept_h0 "
45
+ "decision (not on continue). SSRF-validated."
46
+ ),
47
+ ),
48
+ discord_url: Optional[str] = typer.Option(
49
+ None, "--discord-url",
50
+ help=(
51
+ "Optional Discord webhook URL — POSTed on a reject_h0 / accept_h0 "
52
+ "decision (not on continue). SSRF-validated."
53
+ ),
54
+ ),
38
55
  ) -> None:
39
56
  """Sequential A/B test with early-stop guarantees (mSPRT)."""
40
57
  try:
@@ -43,6 +60,10 @@ def ab(
43
60
  console.print(f"[red]{escape(str(exc))}[/]")
44
61
  raise typer.Exit(2) from exc
45
62
 
63
+ slack_url, discord_url = validate_webhook_flags(
64
+ slack_url, discord_url, console=console
65
+ )
66
+
46
67
  try:
47
68
  cfg = MsprtConfig(
48
69
  metric=canonical, alpha=alpha, beta=beta, effect_size=effect_size,
@@ -101,5 +122,24 @@ def ab(
101
122
  )
102
123
  )
103
124
 
125
+ # Webhook only fires on a terminal decision (reject_h0 / accept_h0) —
126
+ # a `continue` verdict carries no actionable signal (issue #207).
127
+ if verdict.decision != "continue":
128
+ emit_webhooks(
129
+ slack_url,
130
+ discord_url,
131
+ payload={
132
+ "command": "ab",
133
+ "metric": canonical,
134
+ "decision": verdict.decision,
135
+ "log_likelihood_ratio": verdict.log_likelihood_ratio,
136
+ "n_control": verdict.n_control,
137
+ "n_treatment": verdict.n_treatment,
138
+ "mean_control": verdict.mean_control,
139
+ "mean_treatment": verdict.mean_treatment,
140
+ },
141
+ console=console,
142
+ )
143
+
104
144
 
105
145
  __all__ = ["ab"]
@@ -2,11 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from typing import Optional
6
+
5
7
  import typer
6
8
  from rich.console import Console
7
9
  from rich.markup import escape
8
10
  from rich.panel import Panel
9
11
 
12
+ from soup_cli.commands._webhook_cli import emit_webhooks, validate_webhook_flags
10
13
  from soup_cli.utils.active_sampler import sample_uncertain_rows, validate_budget
11
14
 
12
15
  console = Console()
@@ -24,6 +27,14 @@ def active_sample(
24
27
  100, "--budget",
25
28
  help="Max rows to surface for human review (1 - 100_000).",
26
29
  ),
30
+ slack_url: Optional[str] = typer.Option(
31
+ None, "--slack-url",
32
+ help="Optional Slack webhook URL — POSTed on completion. SSRF-validated.",
33
+ ),
34
+ discord_url: Optional[str] = typer.Option(
35
+ None, "--discord-url",
36
+ help="Optional Discord webhook URL — POSTed on completion. SSRF-validated.",
37
+ ),
27
38
  ) -> None:
28
39
  """Surface the most uncertain prod traces for human review."""
29
40
  try:
@@ -32,6 +43,10 @@ def active_sample(
32
43
  console.print(f"[red]{escape(str(exc))}[/]")
33
44
  raise typer.Exit(2) from exc
34
45
 
46
+ slack_url, discord_url = validate_webhook_flags(
47
+ slack_url, discord_url, console=console
48
+ )
49
+
35
50
  try:
36
51
  plan = sample_uncertain_rows(
37
52
  input_path,
@@ -55,5 +70,18 @@ def active_sample(
55
70
  )
56
71
  )
57
72
 
73
+ emit_webhooks(
74
+ slack_url,
75
+ discord_url,
76
+ payload={
77
+ "command": "active-sample",
78
+ "rows_selected": plan.rows_selected,
79
+ "rows_in": plan.rows_in,
80
+ "mean_uncertainty": plan.mean_uncertainty,
81
+ "budget": plan.budget,
82
+ },
83
+ console=console,
84
+ )
85
+
58
86
 
59
87
  __all__ = ["active_sample"]
@@ -39,6 +39,7 @@ from soup_cli.utils.advise import (
39
39
  synth_probe_lora_delta,
40
40
  )
41
41
  from soup_cli.utils.advise_history import (
42
+ current_project_name,
42
43
  history_path,
43
44
  load_history,
44
45
  record_verdict,
@@ -269,8 +270,27 @@ def advise_run(
269
270
  sft_wall_clock_secs=wall_clock,
270
271
  )
271
272
 
273
+ # v0.71.5 #163 — bias the rubric by this project's past accepted-verdict
274
+ # outcomes. Best-effort: a missing / unreadable history must never block
275
+ # a verdict, so any failure falls back to the un-biased rubric.
276
+ history = None
277
+ project = None
272
278
  try:
273
- verdict = build_verdict(profile, task_category, goal=goal, roi=roi)
279
+ history = load_history(limit=20)
280
+ project = current_project_name()
281
+ except (TypeError, ValueError, OSError):
282
+ history = None
283
+ project = None
284
+
285
+ try:
286
+ verdict = build_verdict(
287
+ profile,
288
+ task_category,
289
+ goal=goal,
290
+ roi=roi,
291
+ history=history,
292
+ project=project,
293
+ )
274
294
  except (TypeError, ValueError) as exc:
275
295
  console.print(f"[red]Verdict build failed:[/] {escape(str(exc))}")
276
296
  raise typer.Exit(1) from exc
@@ -1914,16 +1914,32 @@ def push_dataset_cmd(
1914
1914
  "--message",
1915
1915
  help="Commit message for the dataset upload",
1916
1916
  ),
1917
+ hub: str = typer.Option(
1918
+ "hf",
1919
+ "--hub",
1920
+ help=(
1921
+ "Target hub: hf (default) / modelscope / modelers. Non-HF hubs "
1922
+ "upload via the matching SDK (v0.71.5 #157) — repo_type=dataset, "
1923
+ "commit message sanitised to first line + 200 chars."
1924
+ ),
1925
+ ),
1917
1926
  ):
1918
- """Upload a local JSONL dataset to HuggingFace Hub as a dataset repo."""
1927
+ """Upload a local JSONL dataset to a model hub as a dataset repo."""
1919
1928
  from soup_cli.utils.hf import (
1920
1929
  get_hf_api,
1921
1930
  resolve_endpoint,
1922
1931
  resolve_token,
1923
1932
  validate_repo_id,
1924
1933
  )
1934
+ from soup_cli.utils.hubs import validate_hub_name
1925
1935
  from soup_cli.utils.paths import is_under_cwd
1926
1936
 
1937
+ try:
1938
+ hub_canonical = validate_hub_name(hub)
1939
+ except (TypeError, ValueError) as exc:
1940
+ console.print(f"[red]{exc}[/]")
1941
+ raise typer.Exit(2) from exc
1942
+
1927
1943
  file_path = Path(input_path)
1928
1944
  if not file_path.exists():
1929
1945
  console.print(f"[red]Dataset file not found: {file_path}[/]")
@@ -1940,9 +1956,18 @@ def push_dataset_cmd(
1940
1956
  try:
1941
1957
  validate_repo_id(hf_dataset)
1942
1958
  except ValueError as exc:
1943
- console.print(f"[red]Invalid --hf-dataset repo id:[/] {exc}")
1959
+ console.print(f"[red]Invalid --{hub_canonical}-dataset repo id:[/] {exc}")
1944
1960
  raise typer.Exit(1) from exc
1945
1961
 
1962
+ # v0.71.5 #157 — non-HF hubs route through the shared upload_repo adapter.
1963
+ # ModelScope / Modelers SDKs upload a folder, so the single JSONL is
1964
+ # staged into a temp dir and uploaded as a dataset repo.
1965
+ if hub_canonical != "hf":
1966
+ _push_dataset_non_hf(
1967
+ hub_canonical, hf_dataset, file_path, commit_message
1968
+ )
1969
+ return
1970
+
1946
1971
  token = resolve_token()
1947
1972
  if token is None:
1948
1973
  console.print(
@@ -1987,6 +2012,53 @@ def push_dataset_cmd(
1987
2012
  )
1988
2013
 
1989
2014
 
2015
+ def _push_dataset_non_hf(
2016
+ hub: str, repo_id: str, file_path: Path, commit_message: str
2017
+ ) -> None:
2018
+ """Upload a single JSONL to a non-HF hub as a dataset (v0.71.5 #157).
2019
+
2020
+ ``upload_repo`` uploads a folder, so the file is staged into a temp dir
2021
+ first. ``upload_repo`` already sanitises the commit message (first line +
2022
+ 200 chars) and validates the repo id shape.
2023
+ """
2024
+ import shutil
2025
+ import tempfile
2026
+
2027
+ from rich.markup import escape
2028
+
2029
+ from soup_cli.utils.hubs import upload_repo
2030
+
2031
+ # Stage UNDER cwd — `upload_repo` enforces cwd-containment on folder_path
2032
+ # (the system tempdir would be rejected).
2033
+ staging = tempfile.mkdtemp(prefix=".soup_dataset_push.", dir=os.getcwd())
2034
+ try:
2035
+ shutil.copy2(str(file_path), os.path.join(staging, file_path.name))
2036
+ try:
2037
+ upload_repo(
2038
+ hub,
2039
+ repo_id,
2040
+ folder_path=staging,
2041
+ commit_message=commit_message,
2042
+ repo_type="dataset",
2043
+ )
2044
+ except ImportError as exc:
2045
+ console.print(f"[red]{exc}[/]")
2046
+ raise typer.Exit(1) from exc
2047
+ except (TypeError, ValueError) as exc:
2048
+ console.print(f"[red]Upload failed:[/] {exc}")
2049
+ raise typer.Exit(1) from exc
2050
+ except Exception as exc: # noqa: BLE001 — surface SDK errors generically
2051
+ console.print(f"[red]Upload failed:[/] {exc}")
2052
+ raise typer.Exit(1) from exc
2053
+ finally:
2054
+ shutil.rmtree(staging, ignore_errors=True)
2055
+
2056
+ console.print(
2057
+ f"[green]Uploaded[/] {escape(file_path.name)} to {escape(hub)} "
2058
+ f"dataset [bold]{escape(repo_id)}[/]"
2059
+ )
2060
+
2061
+
1990
2062
  # --- v0.42.0 Part C / F: AOT preprocess + document ingestion ---------------
1991
2063
 
1992
2064
  @app.command(name="preprocess")