soup-cli 0.71.32__tar.gz → 0.71.34__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 (874) hide show
  1. {soup_cli-0.71.32 → soup_cli-0.71.34}/CHANGELOG.md +115 -0
  2. {soup_cli-0.71.32 → soup_cli-0.71.34}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.32 → soup_cli-0.71.34}/CONTRIBUTORS.md +2 -0
  4. {soup_cli-0.71.32 → soup_cli-0.71.34}/PKG-INFO +35 -28
  5. {soup_cli-0.71.32 → soup_cli-0.71.34}/README.md +34 -27
  6. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/README.md +1 -1
  7. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/adapters-and-governance.md +8 -0
  8. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/commands.md +8 -1
  9. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/peft-and-efficiency.md +19 -0
  10. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/serving-and-export.md +47 -4
  11. {soup_cli-0.71.32 → soup_cli-0.71.34}/pyproject.toml +1 -1
  12. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/__init__.py +1 -1
  13. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cli.py +12 -0
  14. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/adapters.py +225 -0
  15. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/data.py +27 -11
  16. soup_cli-0.71.34/src/soup_cli/commands/draft.py +658 -0
  17. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/infer.py +59 -8
  18. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/runs.py +17 -12
  19. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/serve.py +189 -41
  20. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/shrink.py +2 -52
  21. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/train.py +38 -17
  22. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/config/loader.py +7 -0
  23. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/config/schema.py +135 -0
  24. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/loader.py +20 -4
  25. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/asr.py +45 -1
  26. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/distill.py +15 -0
  27. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/mlx_sft.py +8 -1
  28. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/sft.py +18 -0
  29. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/app.py +8 -2
  30. soup_cli-0.71.34/src/soup_cli/utils/adapter_arithmetic.py +288 -0
  31. soup_cli-0.71.34/src/soup_cli/utils/adapter_fuse.py +128 -0
  32. soup_cli-0.71.34/src/soup_cli/utils/draft.py +551 -0
  33. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/gpu.py +18 -2
  34. soup_cli-0.71.34/src/soup_cli/utils/lisa.py +213 -0
  35. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/lr_finder.py +7 -7
  36. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/paths.py +11 -0
  37. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/peft_wiring.py +26 -0
  38. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/prm_reward.py +73 -4
  39. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/spec_pairing.py +22 -0
  40. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/strict_safetensors.py +66 -0
  41. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/vllm.py +7 -2
  42. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/vscode_setup.py +12 -22
  43. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_code_review_high.py +24 -9
  44. soup_cli-0.71.34/tests/test_review_fixes_v07133.py +662 -0
  45. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07130.py +21 -5
  46. soup_cli-0.71.34/tests/test_v07133.py +1858 -0
  47. soup_cli-0.71.34/tests/test_v07134.py +1041 -0
  48. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_vision.py +27 -9
  49. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_vllm_serve.py +1 -0
  50. {soup_cli-0.71.32 → soup_cli-0.71.34}/.dockerignore +0 -0
  51. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/FUNDING.yml +0 -0
  52. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  53. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  54. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  55. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/pull_request_template.md +0 -0
  56. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/workflows/ci.yml +0 -0
  57. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/workflows/docker.yml +0 -0
  58. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/workflows/publish.yml +0 -0
  59. {soup_cli-0.71.32 → soup_cli-0.71.34}/.github/workflows/recipe-validation.yml +0 -0
  60. {soup_cli-0.71.32 → soup_cli-0.71.34}/.gitignore +0 -0
  61. {soup_cli-0.71.32 → soup_cli-0.71.34}/.mailmap +0 -0
  62. {soup_cli-0.71.32 → soup_cli-0.71.34}/.pre-commit-config.yaml +0 -0
  63. {soup_cli-0.71.32 → soup_cli-0.71.34}/AGENTS.md +0 -0
  64. {soup_cli-0.71.32 → soup_cli-0.71.34}/CODEOWNERS +0 -0
  65. {soup_cli-0.71.32 → soup_cli-0.71.34}/CODE_OF_CONDUCT.md +0 -0
  66. {soup_cli-0.71.32 → soup_cli-0.71.34}/Dockerfile +0 -0
  67. {soup_cli-0.71.32 → soup_cli-0.71.34}/LICENSE +0 -0
  68. {soup_cli-0.71.32 → soup_cli-0.71.34}/NOTICE +0 -0
  69. {soup_cli-0.71.32 → soup_cli-0.71.34}/SECURITY.md +0 -0
  70. {soup_cli-0.71.32 → soup_cli-0.71.34}/docker-compose.yml +0 -0
  71. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/backends-and-ops.md +0 -0
  72. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/data.md +0 -0
  73. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/evaluation.md +0 -0
  74. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/models.md +0 -0
  75. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/performance-and-quantization.md +0 -0
  76. {soup_cli-0.71.32 → soup_cli-0.71.34}/docs/training.md +0 -0
  77. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/README.md +0 -0
  78. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/dpo_chat.yaml +0 -0
  79. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/dpo_example.yaml +0 -0
  80. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/grpo_reasoning.yaml +0 -0
  81. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/rlhf_step1_sft.yaml +0 -0
  82. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/rlhf_step2_reward.yaml +0 -0
  83. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  84. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/sft_basic.yaml +0 -0
  85. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/configs/vision_llama.yaml +0 -0
  86. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/data/alpaca_tiny.jsonl +0 -0
  87. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/data/chat_preferences.jsonl +0 -0
  88. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/data/dpo_sample.jsonl +0 -0
  89. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/data/reasoning_math.jsonl +0 -0
  90. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/reward_hacking/rewards.py +0 -0
  91. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/synthetic_workflow.md +0 -0
  92. {soup_cli-0.71.32 → soup_cli-0.71.34}/examples/synthetic_workflow.yaml +0 -0
  93. {soup_cli-0.71.32 → soup_cli-0.71.34}/soup.png +0 -0
  94. {soup_cli-0.71.32 → soup_cli-0.71.34}/soup_logo_svg.svg +0 -0
  95. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/__main__.py +0 -0
  96. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/autopilot/__init__.py +0 -0
  97. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/autopilot/analyzer.py +0 -0
  98. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/autopilot/decisions.py +0 -0
  99. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/autopilot/generate_config.py +0 -0
  100. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/__init__.py +0 -0
  101. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/pack.py +0 -0
  102. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/publish.py +0 -0
  103. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/run.py +0 -0
  104. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/schema.py +0 -0
  105. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/unpack.py +0 -0
  106. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cans/verify.py +0 -0
  107. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cloud/__init__.py +0 -0
  108. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/cloud/modal.py +0 -0
  109. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/__init__.py +0 -0
  110. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/_eval_v0550.py +0 -0
  111. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/_eval_v0610.py +0 -0
  112. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/_eval_v0650.py +0 -0
  113. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/_eval_v07110.py +0 -0
  114. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/_webhook_cli.py +0 -0
  115. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/ab.py +0 -0
  116. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/active_sample.py +0 -0
  117. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/advise.py +0 -0
  118. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/agent.py +0 -0
  119. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/airgap.py +0 -0
  120. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/apple_adapter.py +0 -0
  121. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/attest.py +0 -0
  122. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/audit_log.py +0 -0
  123. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/autopilot.py +0 -0
  124. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/bench.py +0 -0
  125. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/bom.py +0 -0
  126. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/build.py +0 -0
  127. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/can.py +0 -0
  128. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/chat.py +0 -0
  129. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/compile_cmd.py +0 -0
  130. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/compile_tools.py +0 -0
  131. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/completions.py +0 -0
  132. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/cost.py +0 -0
  133. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/data_doctor.py +0 -0
  134. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/data_forge.py +0 -0
  135. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/data_mix.py +0 -0
  136. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/data_score.py +0 -0
  137. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  138. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/deploy.py +0 -0
  139. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/diagnose.py +0 -0
  140. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/diff.py +0 -0
  141. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/distill_prompt.py +0 -0
  142. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/doctor.py +0 -0
  143. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/drift_alarm.py +0 -0
  144. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/edit.py +0 -0
  145. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/env.py +0 -0
  146. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/eval.py +0 -0
  147. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/expect.py +0 -0
  148. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/export.py +0 -0
  149. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/fetch.py +0 -0
  150. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/generate.py +0 -0
  151. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/history.py +0 -0
  152. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/ingest.py +0 -0
  153. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/init.py +0 -0
  154. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/iterative_dpo.py +0 -0
  155. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/license_advisor.py +0 -0
  156. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/llama.py +0 -0
  157. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/local_rl.py +0 -0
  158. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/lock.py +0 -0
  159. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/loop.py +0 -0
  160. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/mcp.py +0 -0
  161. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/merge.py +0 -0
  162. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  163. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/migrate.py +0 -0
  164. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/monitor.py +0 -0
  165. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/plan.py +0 -0
  166. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/plugins.py +0 -0
  167. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/probe.py +0 -0
  168. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/profile.py +0 -0
  169. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/prune_prompt.py +0 -0
  170. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/push.py +0 -0
  171. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/quantize.py +0 -0
  172. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/quickstart.py +0 -0
  173. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/ra_dit.py +0 -0
  174. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/recipes.py +0 -0
  175. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/registry.py +0 -0
  176. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/ship.py +0 -0
  177. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/spectrum.py +0 -0
  178. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/steer.py +0 -0
  179. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/sweep.py +0 -0
  180. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/tokenizer.py +0 -0
  181. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/tui.py +0 -0
  182. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/tunability.py +0 -0
  183. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/ui.py +0 -0
  184. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/commands/why.py +0 -0
  185. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/config/__init__.py +0 -0
  186. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/__init__.py +0 -0
  187. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  188. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  189. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  190. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  191. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  192. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  193. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  194. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  195. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  196. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  197. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  198. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  199. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/augment.py +0 -0
  200. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/chat_templates.py +0 -0
  201. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/collators.py +0 -0
  202. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/formats.py +0 -0
  203. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/loss_mask.py +0 -0
  204. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/providers/__init__.py +0 -0
  205. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/providers/_utils.py +0 -0
  206. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/providers/anthropic.py +0 -0
  207. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/providers/ollama.py +0 -0
  208. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/providers/vllm.py +0 -0
  209. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/sft_format.py +0 -0
  210. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/__init__.py +0 -0
  211. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/code.py +0 -0
  212. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/conversation.py +0 -0
  213. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/preference.py +0 -0
  214. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/qa.py +0 -0
  215. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/reasoning.py +0 -0
  216. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/tool_calling.py +0 -0
  217. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/templates/verifiable.py +0 -0
  218. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/traces/__init__.py +0 -0
  219. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/traces/pair_builder.py +0 -0
  220. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/traces/parsers.py +0 -0
  221. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/traces/quality.py +0 -0
  222. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/data/validator.py +0 -0
  223. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/envs/__init__.py +0 -0
  224. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/envs/_common.py +0 -0
  225. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/envs/calculator.py +0 -0
  226. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/envs/guess_number.py +0 -0
  227. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/envs/retrieval_qa.py +0 -0
  228. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/__init__.py +0 -0
  229. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/arena.py +0 -0
  230. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  231. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/calibrate.py +0 -0
  232. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  233. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/custom.py +0 -0
  234. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/forgetting.py +0 -0
  235. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/gate.py +0 -0
  236. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/human.py +0 -0
  237. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/judge.py +0 -0
  238. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/leaderboard.py +0 -0
  239. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/eval/quant_check.py +0 -0
  240. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/experiment/__init__.py +0 -0
  241. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/experiment/tracker.py +0 -0
  242. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/mcp_server/__init__.py +0 -0
  243. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/mcp_server/registry.py +0 -0
  244. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/mcp_server/server.py +0 -0
  245. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/migrate/__init__.py +0 -0
  246. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/migrate/axolotl.py +0 -0
  247. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/migrate/common.py +0 -0
  248. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/migrate/llamafactory.py +0 -0
  249. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/migrate/unsloth.py +0 -0
  250. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/__init__.py +0 -0
  251. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/callback.py +0 -0
  252. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  253. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/display.py +0 -0
  254. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  255. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/hf_push.py +0 -0
  256. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  257. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/monitoring/trace_logger.py +0 -0
  258. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/plugins/__init__.py +0 -0
  259. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/py.typed +0 -0
  260. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/recipes/__init__.py +0 -0
  261. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/recipes/catalog.py +0 -0
  262. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/registry/__init__.py +0 -0
  263. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/registry/attach.py +0 -0
  264. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/registry/diff.py +0 -0
  265. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/registry/hashing.py +0 -0
  266. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/registry/store.py +0 -0
  267. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/__init__.py +0 -0
  268. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/audio.yaml +0 -0
  269. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/bco.yaml +0 -0
  270. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/chat.yaml +0 -0
  271. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/code.yaml +0 -0
  272. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/embedding.yaml +0 -0
  273. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  274. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  275. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  276. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/ipo.yaml +0 -0
  277. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/kto.yaml +0 -0
  278. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/longcontext.yaml +0 -0
  279. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/manifest.json +0 -0
  280. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/medical.yaml +0 -0
  281. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/moe.yaml +0 -0
  282. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/orpo.yaml +0 -0
  283. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/pretrain.yaml +0 -0
  284. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/reasoning.yaml +0 -0
  285. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/rlhf.yaml +0 -0
  286. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/simpo.yaml +0 -0
  287. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/tool-calling.yaml +0 -0
  288. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/templates/vision.yaml +0 -0
  289. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/__init__.py +0 -0
  290. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/bco.py +0 -0
  291. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/bitnet.py +0 -0
  292. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/classifier.py +0 -0
  293. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/dpo.py +0 -0
  294. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/embedding.py +0 -0
  295. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/grpo.py +0 -0
  296. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/ipo.py +0 -0
  297. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/kto.py +0 -0
  298. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  299. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  300. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/mlx_routing.py +0 -0
  301. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/mole_routing.py +0 -0
  302. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/online_dpo.py +0 -0
  303. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/orpo.py +0 -0
  304. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/ppo.py +0 -0
  305. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/preference.py +0 -0
  306. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/pretrain.py +0 -0
  307. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/prm.py +0 -0
  308. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/raft.py +0 -0
  309. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/reward_model.py +0 -0
  310. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/rewards.py +0 -0
  311. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/simpo.py +0 -0
  312. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/tts.py +0 -0
  313. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/trainer/unlearn.py +0 -0
  314. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/tui_app.py +0 -0
  315. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/__init__.py +0 -0
  316. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/plugins/__init__.py +0 -0
  317. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/static/app.js +0 -0
  318. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/static/index.html +0 -0
  319. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/static/logo.png +0 -0
  320. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/static/logo.svg +0 -0
  321. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/ui/static/style.css +0 -0
  322. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/__init__.py +0 -0
  323. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/_eval_text.py +0 -0
  324. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ab_test.py +0 -0
  325. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/activation_offload.py +0 -0
  326. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/active_sampler.py +0 -0
  327. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_bisect.py +0 -0
  328. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_branch.py +0 -0
  329. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_diff.py +0 -0
  330. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_merge.py +0 -0
  331. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_pr.py +0 -0
  332. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_scan.py +0 -0
  333. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/adapter_sign.py +0 -0
  334. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/advanced_precision.py +0 -0
  335. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/advise.py +0 -0
  336. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/advise_history.py +0 -0
  337. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/agent_forge.py +0 -0
  338. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/agent_rollout.py +0 -0
  339. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/agent_sandbox.py +0 -0
  340. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/airgap_bundle.py +0 -0
  341. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/annex_xi.py +0 -0
  342. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/anthropic_messages.py +0 -0
  343. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/apple_adapter.py +0 -0
  344. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/asr_metrics.py +0 -0
  345. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/attest.py +0 -0
  346. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/audit_log.py +0 -0
  347. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/auto_quant.py +0 -0
  348. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/backend_detect.py +0 -0
  349. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/batch_probe.py +0 -0
  350. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/behavior_battery.py +0 -0
  351. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/best_of_n.py +0 -0
  352. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/bitnet.py +0 -0
  353. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/blame.py +0 -0
  354. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/block_expansion.py +0 -0
  355. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/bom.py +0 -0
  356. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/brain_rot.py +0 -0
  357. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  358. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/build_dag.py +0 -0
  359. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/canary_discovery.py +0 -0
  360. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/canary_router.py +0 -0
  361. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/capability_suite.py +0 -0
  362. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/checklist_dsl.py +0 -0
  363. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  364. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/citation_faithful.py +0 -0
  365. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/classifier.py +0 -0
  366. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/cmaes_merge.py +0 -0
  367. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/compile_tools.py +0 -0
  368. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/completions.py +0 -0
  369. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/constants.py +0 -0
  370. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/convergence.py +0 -0
  371. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/crash.py +0 -0
  372. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  373. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/curriculum.py +0 -0
  374. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  375. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/cut_ce.py +0 -0
  376. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_doctor.py +0 -0
  377. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_forge.py +0 -0
  378. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_lint.py +0 -0
  379. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_mix.py +0 -0
  380. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_pipeline.py +0 -0
  381. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/data_score.py +0 -0
  382. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/deepspeed.py +0 -0
  383. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  384. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/demo_bundles.py +0 -0
  385. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  386. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/deploy_measure.py +0 -0
  387. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  388. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/_common.py +0 -0
  389. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/badge.py +0 -0
  390. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/citation.py +0 -0
  391. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  392. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  393. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/format.py +0 -0
  394. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/live.py +0 -0
  395. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  396. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  397. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  398. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/report.py +0 -0
  399. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/diagnose/runner.py +0 -0
  400. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/distill.py +0 -0
  401. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/dpo_variants.py +0 -0
  402. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/drift_alarm.py +0 -0
  403. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  404. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/echo_trap.py +0 -0
  405. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/edit_diff.py +0 -0
  406. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/edit_governor.py +0 -0
  407. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/edit_kernels.py +0 -0
  408. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/encoding.py +0 -0
  409. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/energy.py +0 -0
  410. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/env_lock.py +0 -0
  411. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/errors.py +0 -0
  412. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/eval_design.py +0 -0
  413. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  414. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  415. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/evolve.py +0 -0
  416. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/expectations.py +0 -0
  417. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/fetch_examples.py +0 -0
  418. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/flash_attn.py +0 -0
  419. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/fp8.py +0 -0
  420. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/freeze.py +0 -0
  421. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/fsdp.py +0 -0
  422. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  423. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/galore.py +0 -0
  424. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/gguf_quant.py +0 -0
  425. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/gpu_monitor.py +0 -0
  426. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/grace_codebook.py +0 -0
  427. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/graceful_save.py +0 -0
  428. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/grad_accum.py +0 -0
  429. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  430. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/grpo_long_context.py +0 -0
  431. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/grpo_variants.py +0 -0
  432. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/hardware_fit.py +0 -0
  433. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/harm_probe.py +0 -0
  434. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/hf.py +0 -0
  435. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/hf_space.py +0 -0
  436. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/hubs.py +0 -0
  437. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ingest_sources.py +0 -0
  438. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/integrations.py +0 -0
  439. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/interference.py +0 -0
  440. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/interference_live.py +0 -0
  441. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/irt.py +0 -0
  442. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/iterative_dpo.py +0 -0
  443. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  444. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/kernel_picker.py +0 -0
  445. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/knowledge_edit.py +0 -0
  446. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/kv_cache.py +0 -0
  447. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/launcher.py +0 -0
  448. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/license_advisor.py +0 -0
  449. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/license_matrix.py +0 -0
  450. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/liger.py +0 -0
  451. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/live_eval.py +0 -0
  452. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/llama_proxy.py +0 -0
  453. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/llama_server_timings.py +0 -0
  454. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/local_rl.py +0 -0
  455. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  456. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loftq_init.py +0 -0
  457. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/log_level.py +0 -0
  458. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/long_context.py +0 -0
  459. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/longlora.py +0 -0
  460. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loop_budget.py +0 -0
  461. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loop_daemon.py +0 -0
  462. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loop_iteration.py +0 -0
  463. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loop_stages.py +0 -0
  464. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/loop_state.py +0 -0
  465. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/lr_groups.py +0 -0
  466. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/magpie.py +0 -0
  467. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/metrics.py +0 -0
  468. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mii.py +0 -0
  469. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/minillm.py +0 -0
  470. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mix_proxy.py +0 -0
  471. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mixed_precision.py +0 -0
  472. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mlx.py +0 -0
  473. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mod.py +0 -0
  474. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/moe.py +0 -0
  475. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/moe_quant.py +0 -0
  476. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/mole_routing.py +0 -0
  477. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/multipack.py +0 -0
  478. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/multipack_sampler.py +0 -0
  479. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/multipack_trainer.py +0 -0
  480. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/namespace_pin.py +0 -0
  481. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/neat_packing.py +0 -0
  482. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ngram_spec.py +0 -0
  483. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/nlg_metrics.py +0 -0
  484. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ollama.py +0 -0
  485. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/onboarding.py +0 -0
  486. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  487. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/peft_builder.py +0 -0
  488. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/peft_patches.py +0 -0
  489. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/persona_hub.py +0 -0
  490. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/pipeline.py +0 -0
  491. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/preference_combine.py +0 -0
  492. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/prm.py +0 -0
  493. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/probe_kernel.py +0 -0
  494. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/probe_pack.py +0 -0
  495. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/profiler.py +0 -0
  496. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/profiling.py +0 -0
  497. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  498. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/prompt_compile.py +0 -0
  499. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/prompt_distill.py +0 -0
  500. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/prune_prompt.py +0 -0
  501. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/qat.py +0 -0
  502. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/qr_url.py +0 -0
  503. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/quality.py +0 -0
  504. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/quant_menu.py +0 -0
  505. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ra_dit.py +0 -0
  506. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ra_dit_run.py +0 -0
  507. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/raft.py +0 -0
  508. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/reasoning_effort.py +0 -0
  509. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/reasoning_parser.py +0 -0
  510. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/recipe_dag.py +0 -0
  511. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/recipe_run.py +0 -0
  512. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/registry.py +0 -0
  513. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/relora.py +0 -0
  514. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/replay.py +0 -0
  515. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/repro_receipt.py +0 -0
  516. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/reward_hack_control.py +0 -0
  517. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/reward_hacking.py +0 -0
  518. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ring_attention.py +0 -0
  519. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  520. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  521. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/run_cost.py +0 -0
  522. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/sae_diff.py +0 -0
  523. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/save_formats.py +0 -0
  524. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/server_tools.py +0 -0
  525. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/sglang.py +0 -0
  526. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ship_verdict.py +0 -0
  527. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/shortcuts.py +0 -0
  528. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/shrink.py +0 -0
  529. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/signing.py +0 -0
  530. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/sleeper_probe.py +0 -0
  531. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/soup_lock.py +0 -0
  532. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/spectrum_scan.py +0 -0
  533. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/spike_recovery.py +0 -0
  534. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/sse_train_stream.py +0 -0
  535. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/steering.py +0 -0
  536. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/structured_output.py +0 -0
  537. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/sweep_config.py +0 -0
  538. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tail_latency.py +0 -0
  539. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/terraform_plan.py +0 -0
  540. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tool_outputs.py +0 -0
  541. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/topology.py +0 -0
  542. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tracing.py +0 -0
  543. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/trackers.py +0 -0
  544. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/train_event_buffer.py +0 -0
  545. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/trainer_plugins.py +0 -0
  546. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/trust_remote.py +0 -0
  547. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/truth_probe.py +0 -0
  548. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tts.py +0 -0
  549. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tts_codec.py +0 -0
  550. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/tunability.py +0 -0
  551. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/ui_env.py +0 -0
  552. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/uld.py +0 -0
  553. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  554. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/unlearning.py +0 -0
  555. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/unlearning_eval.py +0 -0
  556. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/unsloth.py +0 -0
  557. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/v028_features.py +0 -0
  558. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/vector_bank.py +0 -0
  559. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/warmup.py +0 -0
  560. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/webhooks.py +0 -0
  561. {soup_cli-0.71.32 → soup_cli-0.71.34}/src/soup_cli/utils/why.py +0 -0
  562. {soup_cli-0.71.32 → soup_cli-0.71.34}/templates/chat.yaml +0 -0
  563. {soup_cli-0.71.32 → soup_cli-0.71.34}/templates/code.yaml +0 -0
  564. {soup_cli-0.71.32 → soup_cli-0.71.34}/templates/medical.yaml +0 -0
  565. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/__init__.py +0 -0
  566. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/conftest.py +0 -0
  567. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/qa/v053_qa.md +0 -0
  568. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/qa/v07114_qa.md +0 -0
  569. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/qa/v0716_qa.md +0 -0
  570. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_adapters.py +0 -0
  571. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_advanced_peft.py +0 -0
  572. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_assistant_mask.py +0 -0
  573. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_audio.py +0 -0
  574. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_auto_tuning.py +0 -0
  575. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_autopilot.py +0 -0
  576. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_awq_gptq_export.py +0 -0
  577. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_batch_probe.py +0 -0
  578. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_bco.py +0 -0
  579. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_bench.py +0 -0
  580. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_brain_rot_multilingual.py +0 -0
  581. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_bugfixes.py +0 -0
  582. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_build_dag.py +0 -0
  583. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_callback.py +0 -0
  584. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_cans.py +0 -0
  585. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_chat.py +0 -0
  586. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_chat_template.py +0 -0
  587. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_cli.py +0 -0
  588. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_cli_subprocess.py +0 -0
  589. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_code_review_critical.py +0 -0
  590. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_code_review_deferred.py +0 -0
  591. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_code_review_medium_low.py +0 -0
  592. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_code_review_recurring.py +0 -0
  593. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_config.py +0 -0
  594. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_cost.py +0 -0
  595. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_crash_reporter.py +0 -0
  596. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_curriculum.py +0 -0
  597. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_data.py +0 -0
  598. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_data_augment.py +0 -0
  599. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_data_sample.py +0 -0
  600. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_data_split.py +0 -0
  601. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_data_tools.py +0 -0
  602. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_dataset_hub.py +0 -0
  603. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_dataset_registry.py +0 -0
  604. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_deepspeed.py +0 -0
  605. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_deploy_ollama.py +0 -0
  606. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_diff.py +0 -0
  607. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_display.py +0 -0
  608. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_doctor.py +0 -0
  609. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_dpo_example.py +0 -0
  610. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_dpo_variants.py +0 -0
  611. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_embedding.py +0 -0
  612. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_errors.py +0 -0
  613. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_eval.py +0 -0
  614. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_eval_gate.py +0 -0
  615. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_eval_platform.py +0 -0
  616. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_export.py +0 -0
  617. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_formats.py +0 -0
  618. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_fp8_recipe.py +0 -0
  619. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_freeze_training.py +0 -0
  620. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_generate.py +0 -0
  621. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_gpu.py +0 -0
  622. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_grpo.py +0 -0
  623. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_hf_integration.py +0 -0
  624. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_infer.py +0 -0
  625. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_inference_advanced.py +0 -0
  626. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_init.py +0 -0
  627. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ipo.py +0 -0
  628. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_jinja_analyzer.py +0 -0
  629. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_kto.py +0 -0
  630. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_loader.py +0 -0
  631. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_log_level.py +0 -0
  632. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_loss_watchdog.py +0 -0
  633. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_merge.py +0 -0
  634. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_migrate.py +0 -0
  635. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_mlx_backend.py +0 -0
  636. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_moe.py +0 -0
  637. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_multi_adapter.py +0 -0
  638. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_multi_gpu.py +0 -0
  639. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_multipack_config.py +0 -0
  640. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_multipack_invariants.py +0 -0
  641. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_multipack_sampler.py +0 -0
  642. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_neat_packing.py +0 -0
  643. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_neftune_rslora.py +0 -0
  644. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_onnx_tensorrt_export.py +0 -0
  645. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_orpo.py +0 -0
  646. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_packing.py +0 -0
  647. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_a_wave1.py +0 -0
  648. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_a_wave2.py +0 -0
  649. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_b.py +0 -0
  650. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_c.py +0 -0
  651. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_d.py +0 -0
  652. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_e.py +0 -0
  653. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_part_f_hardening.py +0 -0
  654. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_peft_methods.py +0 -0
  655. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_peft_patches.py +0 -0
  656. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_performance.py +0 -0
  657. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_pissa_init.py +0 -0
  658. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ppo.py +0 -0
  659. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_preference_dispatcher.py +0 -0
  660. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_preference_multi.py +0 -0
  661. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_preference_multi_runtime.py +0 -0
  662. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_pretrain.py +0 -0
  663. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_profile.py +0 -0
  664. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_profiling.py +0 -0
  665. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_progress.py +0 -0
  666. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_push.py +0 -0
  667. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_qat.py +0 -0
  668. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_quality_filter.py +0 -0
  669. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_quant_check.py +0 -0
  670. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_quant_menu.py +0 -0
  671. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_quickstart.py +0 -0
  672. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_rank_pattern.py +0 -0
  673. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_recipes.py +0 -0
  674. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_recipes_v031.py +0 -0
  675. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_refusal_multilingual.py +0 -0
  676. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_registry.py +0 -0
  677. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_relora.py +0 -0
  678. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_replay.py +0 -0
  679. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_resume.py +0 -0
  680. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_rlvr.py +0 -0
  681. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_run_cost.py +0 -0
  682. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_runs.py +0 -0
  683. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_serve.py +0 -0
  684. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_server_generate.py +0 -0
  685. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_sglang_serve.py +0 -0
  686. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_simpo.py +0 -0
  687. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_smoke_train.py +0 -0
  688. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_speculative_decoding.py +0 -0
  689. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_sweep.py +0 -0
  690. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_synth_data_pro.py +0 -0
  691. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_templates_yaml.py +0 -0
  692. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_tensorboard.py +0 -0
  693. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_tool_calling.py +0 -0
  694. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_trace_to_pref.py +0 -0
  695. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_tracker.py +0 -0
  696. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_trainer_coverage_v035.py +0 -0
  697. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_trainer_init.py +0 -0
  698. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_training_intelligence.py +0 -0
  699. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_training_speed.py +0 -0
  700. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_trust_remote_code.py +0 -0
  701. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_tui.py +0 -0
  702. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ui.py +0 -0
  703. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ui_chat.py +0 -0
  704. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ui_config_builder.py +0 -0
  705. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ui_live_monitor.py +0 -0
  706. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_ui_metrics.py +0 -0
  707. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_unsloth.py +0 -0
  708. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0401_part_c.py +0 -0
  709. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0401_part_d.py +0 -0
  710. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0401_part_e.py +0 -0
  711. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0402_part_a.py +0 -0
  712. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0402_part_b.py +0 -0
  713. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0403_part_a.py +0 -0
  714. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0403_part_b.py +0 -0
  715. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0403_part_c.py +0 -0
  716. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0404_part_a.py +0 -0
  717. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0404_part_b.py +0 -0
  718. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0405_part_a.py +0 -0
  719. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0406_part_a.py +0 -0
  720. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0410_part_a.py +0 -0
  721. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0410_part_b.py +0 -0
  722. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0410_part_c.py +0 -0
  723. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0420.py +0 -0
  724. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0430_part_a.py +0 -0
  725. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0430_part_b.py +0 -0
  726. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0430_part_c.py +0 -0
  727. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0430_part_d.py +0 -0
  728. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0440_part_a.py +0 -0
  729. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0440_part_b.py +0 -0
  730. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0440_part_c.py +0 -0
  731. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0440_part_d.py +0 -0
  732. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0440_review_followups.py +0 -0
  733. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0450.py +0 -0
  734. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0460_part_a.py +0 -0
  735. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0460_part_b.py +0 -0
  736. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0470_part_a.py +0 -0
  737. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0470_part_b.py +0 -0
  738. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0480_part_a.py +0 -0
  739. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0480_part_b.py +0 -0
  740. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0490.py +0 -0
  741. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0500_part_a.py +0 -0
  742. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0500_part_b.py +0 -0
  743. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0500_part_c.py +0 -0
  744. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0500_part_d.py +0 -0
  745. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0500_part_e.py +0 -0
  746. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0510.py +0 -0
  747. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0520.py +0 -0
  748. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0530.py +0 -0
  749. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v05310.py +0 -0
  750. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v05311.py +0 -0
  751. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0531_109.py +0 -0
  752. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0531_139.py +0 -0
  753. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0531_142.py +0 -0
  754. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0531_82.py +0 -0
  755. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0532.py +0 -0
  756. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0533.py +0 -0
  757. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0534.py +0 -0
  758. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0535.py +0 -0
  759. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0536.py +0 -0
  760. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0537.py +0 -0
  761. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0538.py +0 -0
  762. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0539.py +0 -0
  763. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0540.py +0 -0
  764. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0550.py +0 -0
  765. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0550_followups.py +0 -0
  766. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0560.py +0 -0
  767. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0570_part_a.py +0 -0
  768. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0570_part_b.py +0 -0
  769. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0570_part_c.py +0 -0
  770. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0570_part_d.py +0 -0
  771. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0580.py +0 -0
  772. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0590.py +0 -0
  773. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_a.py +0 -0
  774. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_b.py +0 -0
  775. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_c.py +0 -0
  776. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_d.py +0 -0
  777. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_e.py +0 -0
  778. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0600_part_f.py +0 -0
  779. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0610_part_a.py +0 -0
  780. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0610_part_b.py +0 -0
  781. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0610_part_c.py +0 -0
  782. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0610_part_d.py +0 -0
  783. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0610_part_e.py +0 -0
  784. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_followups.py +0 -0
  785. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_part_a.py +0 -0
  786. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_part_b.py +0 -0
  787. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_part_c.py +0 -0
  788. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_part_d.py +0 -0
  789. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0620_part_e.py +0 -0
  790. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_followups.py +0 -0
  791. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_part_a.py +0 -0
  792. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_part_b.py +0 -0
  793. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_part_c.py +0 -0
  794. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_part_d.py +0 -0
  795. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0630_part_e.py +0 -0
  796. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0631_206.py +0 -0
  797. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_followups.py +0 -0
  798. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_a.py +0 -0
  799. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_b.py +0 -0
  800. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_c.py +0 -0
  801. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_d.py +0 -0
  802. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_e.py +0 -0
  803. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0640_part_f.py +0 -0
  804. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_followups.py +0 -0
  805. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_part_a.py +0 -0
  806. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_part_b.py +0 -0
  807. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_part_c.py +0 -0
  808. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_part_d.py +0 -0
  809. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0650_part_e.py +0 -0
  810. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_cli.py +0 -0
  811. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_followups.py +0 -0
  812. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_part_a.py +0 -0
  813. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_part_b.py +0 -0
  814. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_part_c.py +0 -0
  815. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_part_d.py +0 -0
  816. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0660_part_e.py +0 -0
  817. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_followups.py +0 -0
  818. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_a.py +0 -0
  819. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_b.py +0 -0
  820. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_c.py +0 -0
  821. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_d.py +0 -0
  822. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_e.py +0 -0
  823. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0670_part_f.py +0 -0
  824. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_followups.py +0 -0
  825. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_part_a.py +0 -0
  826. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_part_b.py +0 -0
  827. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_part_c.py +0 -0
  828. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_part_d.py +0 -0
  829. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0680_part_e.py +0 -0
  830. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0690_part_a.py +0 -0
  831. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0690_part_b.py +0 -0
  832. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0690_part_c.py +0 -0
  833. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0690_part_d.py +0 -0
  834. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0690_part_e.py +0 -0
  835. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_a.py +0 -0
  836. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_b.py +0 -0
  837. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_c.py +0 -0
  838. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_d.py +0 -0
  839. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_e.py +0 -0
  840. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0700_part_f.py +0 -0
  841. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07110.py +0 -0
  842. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07111.py +0 -0
  843. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07112.py +0 -0
  844. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07113.py +0 -0
  845. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07114.py +0 -0
  846. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07115.py +0 -0
  847. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07116.py +0 -0
  848. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07117.py +0 -0
  849. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07118.py +0 -0
  850. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07119.py +0 -0
  851. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0712.py +0 -0
  852. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07120.py +0 -0
  853. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07121.py +0 -0
  854. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07122.py +0 -0
  855. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07123.py +0 -0
  856. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07124.py +0 -0
  857. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07125.py +0 -0
  858. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07126.py +0 -0
  859. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07127.py +0 -0
  860. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07128.py +0 -0
  861. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07129.py +0 -0
  862. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0713.py +0 -0
  863. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07131.py +0 -0
  864. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v07132.py +0 -0
  865. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0714.py +0 -0
  866. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0715.py +0 -0
  867. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0716.py +0 -0
  868. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0717.py +0 -0
  869. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0718.py +0 -0
  870. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_v0719.py +0 -0
  871. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_validator.py +0 -0
  872. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_warmup.py +0 -0
  873. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_why.py +0 -0
  874. {soup_cli-0.71.32 → soup_cli-0.71.34}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,121 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.34] - 2026-07-15
16
+
17
+ ### Added
18
+ - **`soup adapters arithmetic` — task-vector algebra over LoRA adapters (add / scale / negate).**
19
+ Apply task arithmetic (arXiv:2212.04089) to LoRA deltas via an expression such as
20
+ `"coder + 0.5*math - toxic"`, mapping names to adapter dirs with repeatable
21
+ `--adapter name=path`. Produces one merged adapter you can serve or merge.
22
+ - Signed, un-normalized element-wise combine over same-rank adapters; the effective
23
+ delta `ΔW = B @ A` scales **linearly** with each coefficient (negation flips the
24
+ delta, `0.5·` halves it) via a √|c| factor split — not the `c²` a naive sum gives.
25
+ Mixed-rank inputs are refused with a clear "harmonize rank" message.
26
+ - Reuses the backdoor-scan gate (refuses a FAIL-scanned input unless `--allow-unscanned`)
27
+ and a same-base-model check (`--allow-cross-base` to override). Hand-written expression
28
+ parser (no `eval`), cwd-contained/symlink-rejecting paths, exit 0 = ok / 1 = refusal.
29
+ - **LISA — Layerwise Importance Sampled AdamW (arXiv:2403.17919).** Full-fine-tuning
30
+ quality at LoRA-like memory: every N steps LISA freezes all decoder layers except a
31
+ small random set (embeddings + head always trainable). Enable with
32
+ `training.lisa_enabled: true` (+ `lisa_num_layers`, `lisa_interval_steps`) on a
33
+ `task: sft`, transformers, text, `quantization: none` run; mutually exclusive with
34
+ LoRA features and the other freeze mechanisms. Live on a 4 GB GPU for small models.
35
+
36
+ ## [0.71.33] - 2026-07-13
37
+
38
+ ### Added
39
+ - **`soup draft` — train and, above all, MEASURE a speculative-decoding draft model.**
40
+ - `soup draft measure --target <m> --draft <d> --prompts p.jsonl` reports a draft's
41
+ **acceptance rate** (the fraction of the target's own greedy tokens the draft
42
+ would have proposed correctly) plus **real plain-vs-assisted throughput**. This is
43
+ the honest gate: it tells you whether speculative decoding is worth enabling
44
+ *before* you ship it. Exit 0 / 2 (below `--min-acceptance`, for CI) / 1.
45
+ - `soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/`
46
+ distils your target into the tiny base (logit KD via the existing `task: distill`
47
+ trainer) and emits a **dense** draft model, ready to load as an `assistant_model`.
48
+ - `soup draft list`, plus a local draft registry (`~/.soup/drafts.json`) that
49
+ `soup serve --auto-spec` consults **before** the built-in pairing table — so a
50
+ draft you trained yourself is picked up automatically.
51
+ - Draft and target must share a tokenizer; a mismatched pair is refused up front
52
+ (speculative decoding proposes draft token ids into the target's vocabulary, so a
53
+ mismatch silently produces garbage rather than failing).
54
+
55
+ **Read the measured results before you use this** — see *Known limitations* below.
56
+ On the validated pair, distillation did **not** improve acceptance, and speculative
57
+ decoding was a net **slowdown**. `soup draft measure` is what tells you that.
58
+
59
+ ### Known limitations
60
+ - **Distilling a draft did not improve its acceptance rate on the validated pair.**
61
+ Measured on `SmolLM2-360M-Instruct` (target) with a `SmolLM2-135M-Instruct` draft:
62
+ the *stock* draft already scored **69.3%**, and distilling it moved that to 69.7%
63
+ after 2 epochs and back to **69.3%** after 10 epochs — i.e. no gain beyond noise.
64
+ A small same-family draft is already near its capacity ceiling for agreeing with
65
+ the target, and logit KD cannot buy capacity it does not have. Whether distillation
66
+ materially raises acceptance for a genuinely diverged fine-tune, or a larger
67
+ target/draft pair, is **unproven** on a 4 GB box — tracked as a scale issue.
68
+ - **Speculative decoding was a net slowdown on that pair** (measured 0.55–0.64×): the
69
+ draft's forward pass costs more than the tokens it saves at this size.
70
+ `soup draft measure` reports this truthfully rather than assuming a speedup — which
71
+ is precisely the point of shipping the measurement.
72
+ - **Acceptance is teacher-forced greedy agreement**, the metric the Medusa/EAGLE
73
+ papers report. It is exact and deterministic, and it is the right number for
74
+ comparing drafts — but it is not the accepted-token count of a *sampling* run, which
75
+ also depends on the rejection-resample cascade.
76
+ - **Same-tokenizer only.** Cross-tokenizer drafts (ULD-aligned + universal assisted
77
+ decoding) are deferred.
78
+
79
+ ### Changed
80
+ - **PRM-guided GRPO scores completions in a single batched forward.**
81
+ `PRMScorer.__call__` now right-pads all completions into one `[B, T]` tensor
82
+ (+ attention mask) and runs one `output_hidden_states` pass instead of one
83
+ forward per completion, cutting per-step reward latency on non-tiny models.
84
+ Numerically identical to the per-completion path (parity + mixed-length tests).
85
+ Closes #298
86
+ ([#301](https://github.com/MakazhanAlpamys/Soup/pull/301) by [@Ekaanksh-dev](https://github.com/Ekaanksh-dev)).
87
+
88
+ ### Fixed
89
+ - **The hardware-fit gate no longer refuses to train small models.**
90
+ `model_size_from_name` did not understand an `M` (millions) suffix, so
91
+ `SmolLM2-135M` fell through to the 7B default, was predicted to need ~14 GB of
92
+ weights, and was blocked. Every draft-sized model hit this. `1.7B` was also being
93
+ read as `7B` (the `7b` marker matched inside `1.7b`), while `Qwen2.5-7B-Instruct-1M`
94
+ correctly stays 7B (1M is the *context*, not the parameter count).
95
+ - **`soup serve --backend vllm` no longer force-enables `trust_remote_code`.** The
96
+ vLLM path now goes through the same `--trust-remote-code` default-deny gate (and
97
+ warning panel) as the transformers backend, so serving an untrusted repo never
98
+ executes its code silently.
99
+ - **Multi-adapter serving (`soup serve --adapters name=path`) now actually switches
100
+ adapters.** The named adapters are loaded into the model and selected per request
101
+ (via `POST /v1/adapters/activate/{name}` or the request `adapter` field);
102
+ previously every request silently ran the startup model. The base model is served
103
+ when no adapter is selected.
104
+ - **Vision datasets reject out-of-directory image paths.** `llava` / `sharegpt4v`
105
+ rows are containment-checked against `image_dir` (mirroring the audio loader), so a
106
+ crafted `{"image": "/etc/passwd"}` row can no longer read arbitrary local files.
107
+ - **`soup train --dry-run --gpus N` no longer launches a real multi-GPU run.** The
108
+ accelerate re-exec is skipped under `--dry-run`. The re-exec also now forwards
109
+ `--minillm-on-policy`, `--capture-activations`, and `--capture-prompts` (previously
110
+ dropped on multi-GPU runs).
111
+ - **MLX SFT now builds a real optimizer** (`AdamW` from the configured LR) instead of
112
+ passing `optimizer=None`, which left the model untrained.
113
+ - **`soup data inspect` / `preview` / `search` escape dataset- and Hub-derived text**
114
+ so a stray `[/]` no longer crashes the command and a crafted `[link=…]` tag can't
115
+ render a phishing hyperlink. `soup runs` list/show escape config-derived fields too.
116
+ - **`soup infer --task asr` hardening** — an oversized reference no longer crashes the
117
+ whole batch after transcription (that row's metric is skipped); an all-skipped run
118
+ exits non-zero instead of reporting success; `--asr-task` is validated upfront; and
119
+ dataset-derived filenames are control-stripped before printing. ASR training now
120
+ caps transcript labels to Whisper's decoder limit, warns on >30 s audio, and picks
121
+ fp16 on pre-Ampere GPUs instead of hardcoding bf16.
122
+ - **Knowledge-distillation KD term aligns with the CE term.** The token-level
123
+ divergence is now computed over causal-shifted positions, so the distillation signal
124
+ covers exactly the trained tokens (previously off by one).
125
+ - **Miscellaneous robustness** — `load_config_from_string` raises `ValueError` (not
126
+ `TypeError`) on a non-mapping YAML document; the Web UI Bearer-token check is
127
+ constant-time; and `soup doctor --vscode` / the LR-finder report use the centralised
128
+ atomic, symlink-rejecting writer.
129
+
15
130
  ## [0.71.32] - 2026-07-07
16
131
 
17
132
  ### 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 (309 files, 15663 tests)
123
+ tests/ - Test suite (312 files, 15906 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -50,6 +50,8 @@ Listed by first contribution. PR numbers link the work.
50
50
  - Reuse the shared vocab-expansion helper in the vision + audio SFT paths ([#291](https://github.com/MakazhanAlpamys/Soup/pull/291))
51
51
  - Honor configured vocab expansion in the DPO / IPO / KTO / BCO trainers ([#293](https://github.com/MakazhanAlpamys/Soup/pull/293))
52
52
  - Honor configured vocab expansion in the ORPO / SimPO / GRPO trainers ([#295](https://github.com/MakazhanAlpamys/Soup/pull/295))
53
+ - **Ekaanksh Patil** ([@Ekaanksh-dev](https://github.com/Ekaanksh-dev))
54
+ - Batch the PRM reward forward pass in `PRMScorer.__call__` (single `[B, T]` forward) ([#301](https://github.com/MakazhanAlpamys/Soup/pull/301))
53
55
 
54
56
  ---
55
57
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.32
3
+ Version: 0.71.34
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,35 +193,42 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.32ASR fine-tuning (Whisper).** Fine-tune Whisper on your accent or domain, locally. whisper-tiny (39M) and base (74M) train on a 4 GB GPU — a new modality that actually runs on a laptop card.
197
-
198
- - **`task='asr'`.** A new `AsrTrainerWrapper` (HF `Seq2SeqTrainer` + `WhisperProcessor`). Data rows
199
- are `{"audio": <path>, "text": <transcript>}` under `data.format='asr'`; audio decodes to 16 kHz
200
- mono through the hardened loader (soundfile pre-probe + symlink/size guards). Opt-in LoRA on q/v
201
- via `training.asr_lora: true` (default full fine-tune); `training.asr_language` / `asr_task`
202
- (`transcribe`|`translate`) set — and persist — the decoder prefix for inference.
203
- - **`soup infer --task asr`.** Transcribe an `{"audio"[, "text"]}` JSONL and get per-row + corpus
204
- **WER / CER** when references are present. Loads a full model or a LoRA adapter dir; audio paths
205
- are containment-checked (traversal / UNC rejected).
206
- - **Pure-python metrics.** New `soup_cli.utils.asr_metrics` (WER / CER / `word_accuracy` /
207
- `corpus_wer`) — no new dependency, reusable as a higher-is-better ship metric leg.
208
- - **Recipes.** `whisper-tiny-asr` / `whisper-base-asr` (live-trainable), `whisper-large-v3-asr`
209
- (parse-only). Catalog 138 → 142.
210
- - **Proof-of-mechanism, honestly.** Live-validated on an RTX 3050: a memorization task drove
211
- WER 1.000 → 0.000 (loss 7.2 → 0.0005 at 0.4/4 GB). Real accent/domain gains need real audio;
212
- WER/CER use a light normalizer, not the full Whisper text normalizer.
196
+ **v0.71.34adapter algebra + LISA.** Compose fine-tunes like vectors, and train big-model quality on a small-model memory budget.
213
197
 
214
- ```yaml
215
- base: openai/whisper-tiny
216
- task: asr
217
- data:
218
- format: asr # rows: {"audio": "clip.wav", "text": "hello world"}
219
- audio_dir: ./data/audio
220
- training:
221
- asr_language: en
222
- asr_lora: true # optional; default = full fine-tune
198
+ - **`soup adapters arithmetic "coder + 0.5*math - toxic"`.** Task-vector algebra over LoRA
199
+ adapters (arXiv:2212.04089) — **add, scale, and NEGATE** trained behaviours into one merged
200
+ adapter. The math is done right: a LoRA's effective delta `ΔW = B·A` scales *linearly* with
201
+ each coefficient (subtracting an adapter actually removes its behaviour), not quadratically.
202
+ Same-base + backdoor-scan gated; mixed ranks refused with a clear message.
203
+ - **LISA — layerwise importance sampling (`training.lisa_enabled`).** Full-fine-tuning quality
204
+ at LoRA-like memory (arXiv:2403.17919): every N steps LISA re-activates a small random set of
205
+ decoder layers (embeddings + head always on) and freezes the rest. Live on a 4 GB GPU.
206
+ - **Verified on real models (RTX 3050).** LISA trains SmolLM2-135M end-to-end; `2·a` produces an
207
+ adapter whose ΔW is *exactly* 2× the original's — the merged adapter loads and serves.
208
+
209
+ ```bash
210
+ soup adapters arithmetic "coder - toxic" \
211
+ --adapter coder=./coder-lora --adapter toxic=./toxic-lora -o ./cleaned
212
+
213
+ soup train --config sft.yaml # with training.lisa_enabled: true, lisa_num_layers: 2
223
214
  ```
224
215
 
216
+ <details>
217
+ <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
218
+
219
+ `soup draft measure` reports a draft model's **acceptance rate** + real plain-vs-assisted tok/s
220
+ (exit 0/2/1 for CI); `soup draft distill` distils your target into a dense tiny draft, auto-wired
221
+ into `soup serve --auto-spec`. The honest result on a small same-family pair: distillation didn't
222
+ move acceptance (69.3% → 69.3%) and assisted decoding was a net slowdown — which is exactly the
223
+ number you want *before* shipping speculative decoding.
224
+
225
+ ```bash
226
+ soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \
227
+ --prompts prod-prompts.jsonl # -> acceptance %, real tok/s, ship-or-not
228
+ ```
229
+
230
+ </details>
231
+
225
232
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
226
233
 
227
234
  ## Quick Start
@@ -301,7 +308,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
301
308
  | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
302
309
  | [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
303
310
  | [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
304
- | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding, deploy autopilot, Web UI, Agent Forge |
311
+ | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
305
312
  | [Adapters, registry & governance](docs/adapters-and-governance.md) | Adapter lifecycle/management, model registry, Soup Cans, the data flywheel (`soup loop`), knowledge editing, steering, supply-chain controls (scan/sign/BOM/attest/audit/airgap) |
306
313
  | [Backends, platform & ops](docs/backends-and-ops.md) | MLX/Unsloth backends, alternative hubs, HF Hub integration, autopilot, experiment tracking, plan/apply, env lockfiles, hardware-fit, completions, plugins, utility commands |
307
314
  | [Command reference](docs/commands.md) | The full `soup` command list |
@@ -49,35 +49,42 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.32ASR fine-tuning (Whisper).** Fine-tune Whisper on your accent or domain, locally. whisper-tiny (39M) and base (74M) train on a 4 GB GPU — a new modality that actually runs on a laptop card.
53
-
54
- - **`task='asr'`.** A new `AsrTrainerWrapper` (HF `Seq2SeqTrainer` + `WhisperProcessor`). Data rows
55
- are `{"audio": <path>, "text": <transcript>}` under `data.format='asr'`; audio decodes to 16 kHz
56
- mono through the hardened loader (soundfile pre-probe + symlink/size guards). Opt-in LoRA on q/v
57
- via `training.asr_lora: true` (default full fine-tune); `training.asr_language` / `asr_task`
58
- (`transcribe`|`translate`) set and persist the decoder prefix for inference.
59
- - **`soup infer --task asr`.** Transcribe an `{"audio"[, "text"]}` JSONL and get per-row + corpus
60
- **WER / CER** when references are present. Loads a full model or a LoRA adapter dir; audio paths
61
- are containment-checked (traversal / UNC rejected).
62
- - **Pure-python metrics.** New `soup_cli.utils.asr_metrics` (WER / CER / `word_accuracy` /
63
- `corpus_wer`) no new dependency, reusable as a higher-is-better ship metric leg.
64
- - **Recipes.** `whisper-tiny-asr` / `whisper-base-asr` (live-trainable), `whisper-large-v3-asr`
65
- (parse-only). Catalog 138 → 142.
66
- - **Proof-of-mechanism, honestly.** Live-validated on an RTX 3050: a memorization task drove
67
- WER 1.000 → 0.000 (loss 7.2 → 0.0005 at 0.4/4 GB). Real accent/domain gains need real audio;
68
- WER/CER use a light normalizer, not the full Whisper text normalizer.
52
+ **v0.71.34adapter algebra + LISA.** Compose fine-tunes like vectors, and train big-model quality on a small-model memory budget.
53
+
54
+ - **`soup adapters arithmetic "coder + 0.5*math - toxic"`.** Task-vector algebra over LoRA
55
+ adapters (arXiv:2212.04089) **add, scale, and NEGATE** trained behaviours into one merged
56
+ adapter. The math is done right: a LoRA's effective delta `ΔW = B·A` scales *linearly* with
57
+ each coefficient (subtracting an adapter actually removes its behaviour), not quadratically.
58
+ Same-base + backdoor-scan gated; mixed ranks refused with a clear message.
59
+ - **LISA layerwise importance sampling (`training.lisa_enabled`).** Full-fine-tuning quality
60
+ at LoRA-like memory (arXiv:2403.17919): every N steps LISA re-activates a small random set of
61
+ decoder layers (embeddings + head always on) and freezes the rest. Live on a 4 GB GPU.
62
+ - **Verified on real models (RTX 3050).** LISA trains SmolLM2-135M end-to-end; `2·a` produces an
63
+ adapter whose ΔW is *exactly* the original's the merged adapter loads and serves.
69
64
 
70
- ```yaml
71
- base: openai/whisper-tiny
72
- task: asr
73
- data:
74
- format: asr # rows: {"audio": "clip.wav", "text": "hello world"}
75
- audio_dir: ./data/audio
76
- training:
77
- asr_language: en
78
- asr_lora: true # optional; default = full fine-tune
65
+ ```bash
66
+ soup adapters arithmetic "coder - toxic" \
67
+ --adapter coder=./coder-lora --adapter toxic=./toxic-lora -o ./cleaned
68
+
69
+ soup train --config sft.yaml # with training.lisa_enabled: true, lisa_num_layers: 2
79
70
  ```
80
71
 
72
+ <details>
73
+ <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
74
+
75
+ `soup draft measure` reports a draft model's **acceptance rate** + real plain-vs-assisted tok/s
76
+ (exit 0/2/1 for CI); `soup draft distill` distils your target into a dense tiny draft, auto-wired
77
+ into `soup serve --auto-spec`. The honest result on a small same-family pair: distillation didn't
78
+ move acceptance (69.3% → 69.3%) and assisted decoding was a net slowdown — which is exactly the
79
+ number you want *before* shipping speculative decoding.
80
+
81
+ ```bash
82
+ soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \
83
+ --prompts prod-prompts.jsonl # -> acceptance %, real tok/s, ship-or-not
84
+ ```
85
+
86
+ </details>
87
+
81
88
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
82
89
 
83
90
  ## Quick Start
@@ -157,7 +164,7 @@ The full feature reference lives in [`docs/`](docs/). Start here:
157
164
  | [Performance & quantization](docs/performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
158
165
  | [Data engineering](docs/data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
159
166
  | [Evaluation & probes](docs/evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
160
- | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding, deploy autopilot, Web UI, Agent Forge |
167
+ | [Serving & export](docs/serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
161
168
  | [Adapters, registry & governance](docs/adapters-and-governance.md) | Adapter lifecycle/management, model registry, Soup Cans, the data flywheel (`soup loop`), knowledge editing, steering, supply-chain controls (scan/sign/BOM/attest/audit/airgap) |
162
169
  | [Backends, platform & ops](docs/backends-and-ops.md) | MLX/Unsloth backends, alternative hubs, HF Hub integration, autopilot, experiment tracking, plan/apply, env lockfiles, hardware-fit, completions, plugins, utility commands |
163
170
  | [Command reference](docs/commands.md) | The full `soup` command list |
@@ -12,7 +12,7 @@ feature reference — every `soup` capability, grouped by area.
12
12
  | [Performance & quantization](performance-and-quantization.md) | QAT, FP8, Quant Menu (I + II), KV-cache, NVFP4, save formats, Cut Cross-Entropy, gradient checkpointing, kernels, activation offloading, multi-GPU / DeepSpeed / FSDP |
13
13
  | [Data engineering](data.md) | Formats, the Axolotl/LF-parity pipeline, data tools, synthetic generation & forge, quality scorecards, trace tooling, remote datasets, mixing, recipe DAGs |
14
14
  | [Evaluation & probes](evaluation.md) | Eval design/gate, eval-gated training, benchmarks, NLG metrics, calibration, Elo arena, diagnose, `soup ship` verdict, post-train X-ray probes, A/B, drift, tunability, `soup advise` |
15
- | [Serving & export](serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding, deploy autopilot, Web UI, Agent Forge |
15
+ | [Serving & export](serving-and-export.md) | OpenAI-compatible server, batch inference, benchmarking, merge/export, Anthropic Messages endpoint, speculative decoding (train + measure your own draft), deploy autopilot, Web UI, Agent Forge |
16
16
  | [Adapters, registry & governance](adapters-and-governance.md) | Adapter lifecycle/management, model registry, Soup Cans, the data flywheel (`soup loop`), knowledge editing, steering, supply-chain controls |
17
17
  | [Backends, platform & ops](backends-and-ops.md) | MLX/Unsloth backends, Modal cloud GPU training, alternative hubs, HF Hub integration, autopilot, experiment tracking, plan/apply, env lockfiles, hardware-fit, completions, plugins, utility commands |
18
18
  | [Command reference](commands.md) | The full `soup` command list |
@@ -270,6 +270,12 @@ soup adapters merge ./run-v17 ./run-v18 ./run-v19 -o ./merged --strategy ties \
270
270
  soup adapters merge ./run-v17 ./run-v18 -o ./merged --strategy dare \
271
271
  --density 0.5 --seed 42
272
272
 
273
+ # Task-vector arithmetic (v0.71.34) — add / scale / NEGATE trained behaviours
274
+ # into one adapter (arXiv:2212.04089). Names map to dirs via --adapter name=path.
275
+ soup adapters arithmetic "coder + 0.5*math - toxic" \
276
+ --adapter coder=./coder-lora --adapter math=./math-lora \
277
+ --adapter toxic=./toxic-lora -o ./blended
278
+
273
279
  # Leave-one-out ablation plan against a 4-hour wall-clock budget
274
280
  soup adapters blame ./run-v18 --dataset train.jsonl --layer q_proj.7 \
275
281
  --budget 4h --shards 10 --plan-only
@@ -314,6 +320,8 @@ soup adapters branches
314
320
 
315
321
  **v0.71.4:** the merge verdict is now LIVE — `soup adapters merge … --canary suite.json` lifts the `MergeReport.verdict` `UNKNOWN` stub. A pre-scored `{"baseline_scores","candidate_scores"}` suite classifies the blend OK / MINOR / MAJOR with no model load; a `{"tasks":[...]}` suite uses an injectable scorer. `--strict-verdict` exits 2 on MAJOR. The backdoor-scan and license-conflict gates now run for **every** strategy, including `cmaes`. `soup adapters branch <name> --from-registry <id>` / `--attach-to-registry <id>` link training-env snapshots into the Registry lineage DAG (shown as a `branches` node in `soup history`).
316
322
 
323
+ **v0.71.34 — task-vector arithmetic.** `soup adapters arithmetic "<expr>"` applies task arithmetic (arXiv:2212.04089) to LoRA deltas: **add** (blend two skills), **scale** (`2*coder`), and — the differentiator — **negate** (`- toxic` removes a behaviour). Names in the expression map to adapter dirs via repeatable `--adapter name=path`. The math is done at the effective-delta level: a LoRA contributes `ΔW = B·A`, so the coefficient is applied so that `ΔW` scales **linearly** (subtracting an adapter actually negates its delta — a naïve element-wise sum would scale by `c²`, making negation a no-op). Adapters must share the base model (`--allow-cross-base` to override) and rank (mixed ranks are refused, not silently approximated). Each input passes the v0.71.2 backdoor-scan gate (`--allow-unscanned` to skip). Output is a single loadable adapter; exit 0 = ok, 1 = refusal.
324
+
317
325
 
318
326
  ## Soup Cans (Shareable Recipes)
319
327
 
@@ -27,6 +27,7 @@ soup merge --adapter ./output Merge LoRA with base model
27
27
  soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP shards into one safetensors (v0.71.14; --plan-only previews)
28
28
  soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
29
29
  soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
30
+ soup train --config sft.yaml # training.lisa_enabled: true [lisa_num_layers lisa_interval_steps] LISA layerwise importance sampling — full-FT quality at LoRA-like memory (sft/transformers/text/quantization=none) (v0.71.34)
30
31
  soup export --model ./output --format gguf Export to GGUF (Ollama)
31
32
  soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
32
33
  soup export --model ./output --format onnx Export to ONNX
@@ -134,7 +135,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
134
135
  soup migrate --from axolotl config.yml Import config from Axolotl
135
136
  soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
136
137
  soup migrate --from llamafactory c.yaml --dry-run Preview without writing
137
- soup recipes list List all 138 ready-made recipes
138
+ soup recipes list List all 142 ready-made recipes
138
139
  soup recipes show llama3.1-8b-sft Print recipe YAML
139
140
  soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
140
141
  soup recipes search "reasoning" Search by keyword/task/size
@@ -163,6 +164,11 @@ soup mcp serve --allow-mutating Also expose plan-only train_start
163
164
  soup shrink --model <id|path> --drop-ratio 0.25 --calib c.jsonl -o shrunk Depth-prune least-important layer block + SHIP/DON'T-SHIP ppl verdict (exit 0/2/1) (v0.71.29)
164
165
  soup shrink ... --drop-layers N --heal h.jsonl --heal-steps 200 --device cpu Drop N layers + distill-heal (fuse LoRA back to one dense model)
165
166
  soup shrink ... --tolerance 0.10 --plan-only [--attach-to-registry <id>] Ppl-regression tolerance / print importance table only / registry attach
167
+ soup draft measure --target <m> --draft <d> --prompts p.jsonl Draft acceptance rate + real plain-vs-assisted tok/s (exit 0/2/1) (v0.71.33)
168
+ soup draft measure ... --min-acceptance 0.6 -o report.json Exit 2 below the floor (CI gate) / write the JSON report
169
+ soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/ Distil a DENSE speculative-decoding draft + register it (v0.71.33)
170
+ soup draft distill ... --steps N --device cpu --force --plan-only Training budget / device / overwrite -o / render the config only
171
+ soup draft list List local drafts that `soup serve --auto-spec` will pick up (v0.71.33)
166
172
  soup tui Full-screen Textual dashboard (requires [tui] extra)
167
173
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
168
174
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -179,6 +185,7 @@ soup adapters sign <adapter> [--backend unsigned|ed25519] [--key <pem>|--generat
179
185
  soup adapters verify <adapter> [--strict] [--public-key <pem>] Verify manifest + ed25519 signature
180
186
  soup adapters check-safetensors <adapter> [--strict] Refuse pickle / PyTorch-classic weights
181
187
  soup adapters merge ... [--license <id>] [--license-override <reason>] [--allow-unscanned] License + backdoor-scan gates (auto-detect license; scan FAIL refused)
188
+ soup adapters arithmetic "coder + 0.5*math - toxic" --adapter coder=<p> --adapter math=<p> --adapter toxic=<p> -o <out> [--allow-unscanned --allow-cross-base] Task-vector algebra over LoRA adapters (add/scale/negate; same-rank; scan + same-base gated) (v0.71.34)
182
189
  soup attest emit ... [--sign ed25519 --key <pem>] [-o att.json] in-toto/SLSA-3 attestation (+ .sig sidecar)
183
190
  soup attest verify <statement> --signature <sig> [--public-key <pem>] Verify ed25519 attestation signature
184
191
  soup airgap-bundle --model <m> --output <out.tar> [--repro-receipt <r.json>] Signed tarball for data-diode transfer (embeds repro-receipt)
@@ -380,6 +380,25 @@ training:
380
380
 
381
381
  Works with and without LoRA. When used with LoRA, LoRA is applied only to unfrozen layers.
382
382
 
383
+ ## LISA — Layerwise Importance Sampling (v0.71.34)
384
+
385
+ LISA (Layerwise Importance Sampled AdamW, [arXiv:2403.17919](https://arxiv.org/abs/2403.17919)) targets full-fine-tuning quality at LoRA-like memory. Instead of picking layers once (that's Spectrum's static `unfrozen_parameters`), LISA re-samples a small random set of decoder layers **every N steps** and freezes the rest; the input embeddings, the LM head, and the final norm stay trainable throughout.
386
+
387
+ ```yaml
388
+ task: sft
389
+ backend: transformers
390
+ modality: text
391
+ training:
392
+ quantization: none # LISA is full-FT of the active layers
393
+ lisa_enabled: true
394
+ lisa_num_layers: 2 # decoder layers active per interval (clamped to model depth)
395
+ lisa_interval_steps: 20 # re-sample cadence, in global steps
396
+ ```
397
+
398
+ Because only a handful of layers train at any moment (and their optimizer state is cleared when they're re-frozen), peak optimizer memory is roughly `embeddings + head + lisa_num_layers` — far below a full fine-tune, while every layer still gets updated over the course of training. LISA is `sft` + `transformers` + `text` + `quantization: none` only, and is mutually exclusive with LoRA features, `freeze_layers`/`freeze_ratio`, and Spectrum's `unfrozen_parameters` (each independently decides what trains).
399
+
400
+ Implementation note: the model is left fully trainable at trainer-setup time so HF's optimizer (built before the first callback fires) contains every decoder parameter; the LISA callback then toggles `requires_grad` per interval — frozen parameters produce no gradient and the optimizer skips them.
401
+
383
402
 
384
403
  ## Loss Watchdog
385
404
 
@@ -23,6 +23,7 @@
23
23
  - [Anthropic Messages API Converter](#anthropic-messages-api-converter)
24
24
  - [Server-Side Tools](#server-side-tools)
25
25
  - [Anthropic Messages Endpoint](#anthropic-messages-endpoint)
26
+ - [Train + measure your own draft (`soup draft`)](#train--measure-your-own-draft-soup-draft)
26
27
  - [N-gram Speculative Decoding](#n-gram-speculative-decoding)
27
28
  - [Server-Side Tool Endpoints](#server-side-tool-endpoints)
28
29
 
@@ -254,7 +255,10 @@ soup serve --model ./output --backend sglang --tensor-parallel 2
254
255
 
255
256
  ### Speculative Decoding
256
257
 
257
- Use a smaller draft model to speed up generation (2-3x faster):
258
+ Use a smaller draft model to speed up generation. **Measure before you trust it** — see
259
+ [Train + measure your own draft](#train--measure-your-own-draft-soup-draft) below. Speculative
260
+ decoding is only a win when the draft agrees with the target often enough to pay for its own
261
+ forward pass; on a small target it is frequently a *slowdown*.
258
262
 
259
263
  ```bash
260
264
  # Transformers backend — uses HF assisted generation
@@ -268,7 +272,46 @@ soup serve --model meta-llama/Llama-3.1-70B-Instruct --backend vllm --auto-spec
268
272
  # → auto-paired: meta-llama/Llama-3.2-1B-Instruct (target: Llama-3.1-70B-Instruct)
269
273
  ```
270
274
 
271
- `--auto-spec` handles Llama 3.1/3.3/4, Qwen 2.5/3, Mistral Large, Mixtral, DeepSeek V3/R1, and Gemma 2/3. Models without a known draft pairing (e.g. 8B-or-smaller targets where draft+target overhead outweighs the gain) print a yellow "no draft" note and fall back to standard decoding.
275
+ `--auto-spec` handles Llama 3.1/3.3/4, Qwen 2.5/3, Mistral Large, Mixtral, DeepSeek V3/R1, and Gemma 2/3. Models without a known draft pairing (e.g. 8B-or-smaller targets where draft+target overhead outweighs the gain) print a yellow "no draft" note and fall back to standard decoding. A draft you trained yourself with `soup draft distill` is picked up **before** this built-in table.
276
+
277
+ ### Train + measure your own draft (`soup draft`)
278
+
279
+ The question nobody answers before enabling speculative decoding: *would the draft actually
280
+ propose the tokens my model is going to emit?* `soup draft measure` answers it.
281
+
282
+ ```bash
283
+ # Would this draft pay off? Acceptance rate + REAL plain-vs-assisted throughput.
284
+ soup draft measure --target ./my-tuned-model \
285
+ --draft HuggingFaceTB/SmolLM2-135M-Instruct \
286
+ --prompts prod-prompts.jsonl
287
+
288
+ # Distil a draft from your own target, then serve it automatically.
289
+ soup draft distill --target ./my-tuned-model \
290
+ --draft-base HuggingFaceTB/SmolLM2-135M-Instruct \
291
+ --data traffic.jsonl -o draft/
292
+ soup serve --model ./my-tuned-model --auto-spec # picks up ./draft
293
+ soup draft list
294
+ ```
295
+
296
+ **Acceptance rate** is the fraction of the target's own greedy tokens the draft would have
297
+ proposed correctly (teacher-forced argmax agreement — the metric the Medusa/EAGLE papers report).
298
+ Higher is better; roughly, ≥70% is where speculative decoding starts paying for the draft's
299
+ forward pass on realistic hardware. `--min-acceptance 0.6` exits **2** below the floor, so CI can
300
+ gate on it (exit 0 = ok, 2 = below floor, 1 = error).
301
+
302
+ `distill` runs logit KD through the existing `task: distill` trainer and emits a **dense** model
303
+ (a PEFT adapter directory cannot be loaded as an `assistant_model`). Draft and target must share a
304
+ tokenizer — a mismatch is refused up front, because speculative decoding proposes *draft* token ids
305
+ into the *target's* vocabulary and a mismatched pair silently produces garbage instead of failing.
306
+ A `soup shrink` output makes a good draft base: same tokenizer by construction.
307
+
308
+ **Measured reality check (be sceptical of speedup claims, including ours).** On
309
+ `SmolLM2-360M-Instruct` with a `SmolLM2-135M-Instruct` draft, the *stock* draft already scored
310
+ **69.3%** acceptance, distilling it changed nothing (69.7% after 2 epochs, 69.3% after 10), and
311
+ assisted decoding came out **0.55–0.64×** — a net slowdown. A small same-family draft is already
312
+ near its ceiling for agreeing with the target, and the draft's forward pass costs more than the
313
+ tokens it saves. Whether distillation pays off on a larger or genuinely diverged target/draft pair
314
+ is unproven on a 4 GB box. Run `soup draft measure` on *your* pair rather than assuming.
272
315
 
273
316
  ### Prefix Caching
274
317
 
@@ -418,7 +461,7 @@ soup ui
418
461
 
419
462
  **Pages:**
420
463
  - **Dashboard** — view all experiment runs, loss charts, system info, multi-run comparison
421
- - **New Training** — create configs from templates or 138 ready-made recipes, validate, start training with live SSE log streaming and progress bar
464
+ - **New Training** — create configs from templates or 142 ready-made recipes, validate, start training with live SSE log streaming and progress bar
422
465
  - **Data Explorer** — browse and inspect datasets (JSONL, JSON, CSV, Parquet)
423
466
  - **Model Chat** — chat with streaming responses, configurable temperature/top_p/max_tokens, system prompt, adapter selection, markdown rendering, chat export
424
467
 
@@ -427,7 +470,7 @@ soup ui
427
470
  - **Enhanced Metrics** — 2x2 chart grid (loss, LR, grad_norm, throughput) + GPU memory chart, eval results table
428
471
  - **Multi-Run Compare** — overlay loss curves from up to 5 runs side-by-side
429
472
  - **Chat Upgrade** — SSE streaming via proxy, typing indicator, cancel button, markdown renderer (bold, italic, code blocks), chat export as JSON
430
- - **Config Builder** — recipe dropdown (138 recipes), config schema API for dynamic form generation
473
+ - **Config Builder** — recipe dropdown (142 recipes), config schema API for dynamic form generation
431
474
 
432
475
  **Security:** The Web UI generates a random auth token at startup (printed to console). All mutating endpoints (start/stop training, delete runs, inspect data, validate config) require `Authorization: Bearer <token>` header. CORS is restricted to the served origin. Data inspection is sandboxed to the working directory.
433
476
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.32"
7
+ version = "0.71.34"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.32"
3
+ __version__ = "0.71.34"
@@ -538,6 +538,18 @@ app.command(
538
538
  ),
539
539
  )(_shrink_cmd.shrink)
540
540
 
541
+ # v0.71.33 — `soup draft` train-your-own speculative-decoding draft.
542
+ from soup_cli.commands import draft as _draft_cmd # noqa: E402
543
+
544
+ app.add_typer(
545
+ _draft_cmd.app,
546
+ name="draft",
547
+ help=(
548
+ "Train + measure a speculative-decoding draft model: distil your tuned "
549
+ "model into a tiny draft, then serve it with --auto-spec (v0.71.33)."
550
+ ),
551
+ )
552
+
541
553
 
542
554
  def _rewrite_advise_argv(argv: list) -> list:
543
555
  """Inject `run` between `advise` and a non-subcommand first argument.