soup-cli 0.71.32__tar.gz → 0.71.33__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 (871) hide show
  1. {soup_cli-0.71.32 → soup_cli-0.71.33}/CHANGELOG.md +94 -0
  2. {soup_cli-0.71.32 → soup_cli-0.71.33}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.32 → soup_cli-0.71.33}/CONTRIBUTORS.md +2 -0
  4. {soup_cli-0.71.32 → soup_cli-0.71.33}/PKG-INFO +32 -18
  5. {soup_cli-0.71.32 → soup_cli-0.71.33}/README.md +31 -17
  6. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/commands.md +6 -1
  7. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/serving-and-export.md +47 -4
  8. {soup_cli-0.71.32 → soup_cli-0.71.33}/pyproject.toml +1 -1
  9. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/__init__.py +1 -1
  10. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cli.py +12 -0
  11. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/data.py +27 -11
  12. soup_cli-0.71.33/src/soup_cli/commands/draft.py +658 -0
  13. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/infer.py +59 -8
  14. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/runs.py +17 -12
  15. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/serve.py +189 -41
  16. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/shrink.py +2 -52
  17. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/train.py +38 -17
  18. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/config/loader.py +7 -0
  19. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/loader.py +20 -4
  20. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/asr.py +45 -1
  21. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/distill.py +15 -0
  22. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/mlx_sft.py +8 -1
  23. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/app.py +8 -2
  24. soup_cli-0.71.33/src/soup_cli/utils/adapter_fuse.py +128 -0
  25. soup_cli-0.71.33/src/soup_cli/utils/draft.py +551 -0
  26. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/gpu.py +18 -2
  27. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/lr_finder.py +7 -7
  28. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/paths.py +11 -0
  29. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/prm_reward.py +73 -4
  30. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/spec_pairing.py +22 -0
  31. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/strict_safetensors.py +66 -0
  32. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/vllm.py +7 -2
  33. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/vscode_setup.py +12 -22
  34. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_code_review_high.py +24 -9
  35. soup_cli-0.71.33/tests/test_review_fixes_v07133.py +662 -0
  36. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07130.py +21 -5
  37. soup_cli-0.71.33/tests/test_v07133.py +1858 -0
  38. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_vision.py +27 -9
  39. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_vllm_serve.py +1 -0
  40. {soup_cli-0.71.32 → soup_cli-0.71.33}/.dockerignore +0 -0
  41. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/FUNDING.yml +0 -0
  42. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  43. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  44. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  45. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/pull_request_template.md +0 -0
  46. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/workflows/ci.yml +0 -0
  47. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/workflows/docker.yml +0 -0
  48. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/workflows/publish.yml +0 -0
  49. {soup_cli-0.71.32 → soup_cli-0.71.33}/.github/workflows/recipe-validation.yml +0 -0
  50. {soup_cli-0.71.32 → soup_cli-0.71.33}/.gitignore +0 -0
  51. {soup_cli-0.71.32 → soup_cli-0.71.33}/.mailmap +0 -0
  52. {soup_cli-0.71.32 → soup_cli-0.71.33}/.pre-commit-config.yaml +0 -0
  53. {soup_cli-0.71.32 → soup_cli-0.71.33}/AGENTS.md +0 -0
  54. {soup_cli-0.71.32 → soup_cli-0.71.33}/CODEOWNERS +0 -0
  55. {soup_cli-0.71.32 → soup_cli-0.71.33}/CODE_OF_CONDUCT.md +0 -0
  56. {soup_cli-0.71.32 → soup_cli-0.71.33}/Dockerfile +0 -0
  57. {soup_cli-0.71.32 → soup_cli-0.71.33}/LICENSE +0 -0
  58. {soup_cli-0.71.32 → soup_cli-0.71.33}/NOTICE +0 -0
  59. {soup_cli-0.71.32 → soup_cli-0.71.33}/SECURITY.md +0 -0
  60. {soup_cli-0.71.32 → soup_cli-0.71.33}/docker-compose.yml +0 -0
  61. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/README.md +0 -0
  62. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/adapters-and-governance.md +0 -0
  63. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/backends-and-ops.md +0 -0
  64. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/data.md +0 -0
  65. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/evaluation.md +0 -0
  66. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/models.md +0 -0
  67. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/peft-and-efficiency.md +0 -0
  68. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/performance-and-quantization.md +0 -0
  69. {soup_cli-0.71.32 → soup_cli-0.71.33}/docs/training.md +0 -0
  70. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/README.md +0 -0
  71. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/dpo_chat.yaml +0 -0
  72. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/dpo_example.yaml +0 -0
  73. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/grpo_reasoning.yaml +0 -0
  74. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/rlhf_step1_sft.yaml +0 -0
  75. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/rlhf_step2_reward.yaml +0 -0
  76. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  77. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/sft_basic.yaml +0 -0
  78. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/configs/vision_llama.yaml +0 -0
  79. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/data/alpaca_tiny.jsonl +0 -0
  80. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/data/chat_preferences.jsonl +0 -0
  81. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/data/dpo_sample.jsonl +0 -0
  82. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/data/reasoning_math.jsonl +0 -0
  83. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/reward_hacking/rewards.py +0 -0
  84. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/synthetic_workflow.md +0 -0
  85. {soup_cli-0.71.32 → soup_cli-0.71.33}/examples/synthetic_workflow.yaml +0 -0
  86. {soup_cli-0.71.32 → soup_cli-0.71.33}/soup.png +0 -0
  87. {soup_cli-0.71.32 → soup_cli-0.71.33}/soup_logo_svg.svg +0 -0
  88. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/__main__.py +0 -0
  89. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/autopilot/__init__.py +0 -0
  90. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/autopilot/analyzer.py +0 -0
  91. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/autopilot/decisions.py +0 -0
  92. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/autopilot/generate_config.py +0 -0
  93. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/__init__.py +0 -0
  94. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/pack.py +0 -0
  95. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/publish.py +0 -0
  96. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/run.py +0 -0
  97. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/schema.py +0 -0
  98. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/unpack.py +0 -0
  99. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cans/verify.py +0 -0
  100. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cloud/__init__.py +0 -0
  101. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/cloud/modal.py +0 -0
  102. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/__init__.py +0 -0
  103. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/_eval_v0550.py +0 -0
  104. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/_eval_v0610.py +0 -0
  105. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/_eval_v0650.py +0 -0
  106. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/_eval_v07110.py +0 -0
  107. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/_webhook_cli.py +0 -0
  108. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/ab.py +0 -0
  109. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/active_sample.py +0 -0
  110. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/adapters.py +0 -0
  111. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/advise.py +0 -0
  112. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/agent.py +0 -0
  113. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/airgap.py +0 -0
  114. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/apple_adapter.py +0 -0
  115. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/attest.py +0 -0
  116. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/audit_log.py +0 -0
  117. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/autopilot.py +0 -0
  118. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/bench.py +0 -0
  119. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/bom.py +0 -0
  120. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/build.py +0 -0
  121. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/can.py +0 -0
  122. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/chat.py +0 -0
  123. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/compile_cmd.py +0 -0
  124. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/compile_tools.py +0 -0
  125. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/completions.py +0 -0
  126. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/cost.py +0 -0
  127. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/data_doctor.py +0 -0
  128. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/data_forge.py +0 -0
  129. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/data_mix.py +0 -0
  130. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/data_score.py +0 -0
  131. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  132. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/deploy.py +0 -0
  133. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/diagnose.py +0 -0
  134. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/diff.py +0 -0
  135. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/distill_prompt.py +0 -0
  136. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/doctor.py +0 -0
  137. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/drift_alarm.py +0 -0
  138. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/edit.py +0 -0
  139. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/env.py +0 -0
  140. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/eval.py +0 -0
  141. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/expect.py +0 -0
  142. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/export.py +0 -0
  143. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/fetch.py +0 -0
  144. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/generate.py +0 -0
  145. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/history.py +0 -0
  146. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/ingest.py +0 -0
  147. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/init.py +0 -0
  148. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/iterative_dpo.py +0 -0
  149. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/license_advisor.py +0 -0
  150. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/llama.py +0 -0
  151. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/local_rl.py +0 -0
  152. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/lock.py +0 -0
  153. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/loop.py +0 -0
  154. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/mcp.py +0 -0
  155. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/merge.py +0 -0
  156. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  157. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/migrate.py +0 -0
  158. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/monitor.py +0 -0
  159. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/plan.py +0 -0
  160. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/plugins.py +0 -0
  161. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/probe.py +0 -0
  162. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/profile.py +0 -0
  163. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/prune_prompt.py +0 -0
  164. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/push.py +0 -0
  165. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/quantize.py +0 -0
  166. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/quickstart.py +0 -0
  167. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/ra_dit.py +0 -0
  168. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/recipes.py +0 -0
  169. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/registry.py +0 -0
  170. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/ship.py +0 -0
  171. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/spectrum.py +0 -0
  172. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/steer.py +0 -0
  173. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/sweep.py +0 -0
  174. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/tokenizer.py +0 -0
  175. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/tui.py +0 -0
  176. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/tunability.py +0 -0
  177. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/ui.py +0 -0
  178. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/commands/why.py +0 -0
  179. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/config/__init__.py +0 -0
  180. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/config/schema.py +0 -0
  181. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/__init__.py +0 -0
  182. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  183. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  184. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  185. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  186. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  187. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  188. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  189. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  190. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  191. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  192. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  193. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  194. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/augment.py +0 -0
  195. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/chat_templates.py +0 -0
  196. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/collators.py +0 -0
  197. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/formats.py +0 -0
  198. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/loss_mask.py +0 -0
  199. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/providers/__init__.py +0 -0
  200. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/providers/_utils.py +0 -0
  201. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/providers/anthropic.py +0 -0
  202. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/providers/ollama.py +0 -0
  203. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/providers/vllm.py +0 -0
  204. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/sft_format.py +0 -0
  205. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/__init__.py +0 -0
  206. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/code.py +0 -0
  207. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/conversation.py +0 -0
  208. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/preference.py +0 -0
  209. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/qa.py +0 -0
  210. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/reasoning.py +0 -0
  211. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/tool_calling.py +0 -0
  212. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/templates/verifiable.py +0 -0
  213. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/traces/__init__.py +0 -0
  214. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/traces/pair_builder.py +0 -0
  215. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/traces/parsers.py +0 -0
  216. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/traces/quality.py +0 -0
  217. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/data/validator.py +0 -0
  218. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/envs/__init__.py +0 -0
  219. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/envs/_common.py +0 -0
  220. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/envs/calculator.py +0 -0
  221. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/envs/guess_number.py +0 -0
  222. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/envs/retrieval_qa.py +0 -0
  223. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/__init__.py +0 -0
  224. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/arena.py +0 -0
  225. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  226. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/calibrate.py +0 -0
  227. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  228. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/custom.py +0 -0
  229. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/forgetting.py +0 -0
  230. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/gate.py +0 -0
  231. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/human.py +0 -0
  232. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/judge.py +0 -0
  233. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/leaderboard.py +0 -0
  234. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/eval/quant_check.py +0 -0
  235. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/experiment/__init__.py +0 -0
  236. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/experiment/tracker.py +0 -0
  237. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/mcp_server/__init__.py +0 -0
  238. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/mcp_server/registry.py +0 -0
  239. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/mcp_server/server.py +0 -0
  240. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/migrate/__init__.py +0 -0
  241. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/migrate/axolotl.py +0 -0
  242. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/migrate/common.py +0 -0
  243. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/migrate/llamafactory.py +0 -0
  244. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/migrate/unsloth.py +0 -0
  245. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/__init__.py +0 -0
  246. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/callback.py +0 -0
  247. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  248. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/display.py +0 -0
  249. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  250. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/hf_push.py +0 -0
  251. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  252. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/monitoring/trace_logger.py +0 -0
  253. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/plugins/__init__.py +0 -0
  254. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/py.typed +0 -0
  255. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/recipes/__init__.py +0 -0
  256. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/recipes/catalog.py +0 -0
  257. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/registry/__init__.py +0 -0
  258. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/registry/attach.py +0 -0
  259. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/registry/diff.py +0 -0
  260. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/registry/hashing.py +0 -0
  261. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/registry/store.py +0 -0
  262. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/__init__.py +0 -0
  263. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/audio.yaml +0 -0
  264. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/bco.yaml +0 -0
  265. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/chat.yaml +0 -0
  266. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/code.yaml +0 -0
  267. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/embedding.yaml +0 -0
  268. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  269. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  270. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  271. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/ipo.yaml +0 -0
  272. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/kto.yaml +0 -0
  273. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/longcontext.yaml +0 -0
  274. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/manifest.json +0 -0
  275. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/medical.yaml +0 -0
  276. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/moe.yaml +0 -0
  277. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/orpo.yaml +0 -0
  278. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/pretrain.yaml +0 -0
  279. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/reasoning.yaml +0 -0
  280. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/rlhf.yaml +0 -0
  281. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/simpo.yaml +0 -0
  282. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/tool-calling.yaml +0 -0
  283. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/templates/vision.yaml +0 -0
  284. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/__init__.py +0 -0
  285. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/bco.py +0 -0
  286. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/bitnet.py +0 -0
  287. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/classifier.py +0 -0
  288. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/dpo.py +0 -0
  289. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/embedding.py +0 -0
  290. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/grpo.py +0 -0
  291. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/ipo.py +0 -0
  292. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/kto.py +0 -0
  293. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  294. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  295. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/mlx_routing.py +0 -0
  296. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/mole_routing.py +0 -0
  297. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/online_dpo.py +0 -0
  298. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/orpo.py +0 -0
  299. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/ppo.py +0 -0
  300. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/preference.py +0 -0
  301. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/pretrain.py +0 -0
  302. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/prm.py +0 -0
  303. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/raft.py +0 -0
  304. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/reward_model.py +0 -0
  305. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/rewards.py +0 -0
  306. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/sft.py +0 -0
  307. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/simpo.py +0 -0
  308. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/tts.py +0 -0
  309. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/trainer/unlearn.py +0 -0
  310. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/tui_app.py +0 -0
  311. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/__init__.py +0 -0
  312. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/plugins/__init__.py +0 -0
  313. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/static/app.js +0 -0
  314. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/static/index.html +0 -0
  315. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/static/logo.png +0 -0
  316. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/static/logo.svg +0 -0
  317. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/ui/static/style.css +0 -0
  318. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/__init__.py +0 -0
  319. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/_eval_text.py +0 -0
  320. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ab_test.py +0 -0
  321. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/activation_offload.py +0 -0
  322. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/active_sampler.py +0 -0
  323. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_bisect.py +0 -0
  324. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_branch.py +0 -0
  325. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_diff.py +0 -0
  326. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_merge.py +0 -0
  327. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_pr.py +0 -0
  328. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_scan.py +0 -0
  329. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/adapter_sign.py +0 -0
  330. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/advanced_precision.py +0 -0
  331. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/advise.py +0 -0
  332. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/advise_history.py +0 -0
  333. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/agent_forge.py +0 -0
  334. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/agent_rollout.py +0 -0
  335. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/agent_sandbox.py +0 -0
  336. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/airgap_bundle.py +0 -0
  337. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/annex_xi.py +0 -0
  338. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/anthropic_messages.py +0 -0
  339. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/apple_adapter.py +0 -0
  340. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/asr_metrics.py +0 -0
  341. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/attest.py +0 -0
  342. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/audit_log.py +0 -0
  343. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/auto_quant.py +0 -0
  344. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/backend_detect.py +0 -0
  345. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/batch_probe.py +0 -0
  346. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/behavior_battery.py +0 -0
  347. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/best_of_n.py +0 -0
  348. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/bitnet.py +0 -0
  349. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/blame.py +0 -0
  350. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/block_expansion.py +0 -0
  351. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/bom.py +0 -0
  352. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/brain_rot.py +0 -0
  353. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  354. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/build_dag.py +0 -0
  355. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/canary_discovery.py +0 -0
  356. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/canary_router.py +0 -0
  357. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/capability_suite.py +0 -0
  358. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/checklist_dsl.py +0 -0
  359. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  360. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/citation_faithful.py +0 -0
  361. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/classifier.py +0 -0
  362. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/cmaes_merge.py +0 -0
  363. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/compile_tools.py +0 -0
  364. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/completions.py +0 -0
  365. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/constants.py +0 -0
  366. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/convergence.py +0 -0
  367. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/crash.py +0 -0
  368. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  369. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/curriculum.py +0 -0
  370. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  371. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/cut_ce.py +0 -0
  372. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_doctor.py +0 -0
  373. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_forge.py +0 -0
  374. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_lint.py +0 -0
  375. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_mix.py +0 -0
  376. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_pipeline.py +0 -0
  377. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/data_score.py +0 -0
  378. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/deepspeed.py +0 -0
  379. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  380. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/demo_bundles.py +0 -0
  381. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  382. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/deploy_measure.py +0 -0
  383. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  384. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/_common.py +0 -0
  385. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/badge.py +0 -0
  386. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/citation.py +0 -0
  387. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  388. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  389. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/format.py +0 -0
  390. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/live.py +0 -0
  391. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  392. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  393. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  394. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/report.py +0 -0
  395. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/diagnose/runner.py +0 -0
  396. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/distill.py +0 -0
  397. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/dpo_variants.py +0 -0
  398. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/drift_alarm.py +0 -0
  399. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  400. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/echo_trap.py +0 -0
  401. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/edit_diff.py +0 -0
  402. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/edit_governor.py +0 -0
  403. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/edit_kernels.py +0 -0
  404. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/encoding.py +0 -0
  405. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/energy.py +0 -0
  406. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/env_lock.py +0 -0
  407. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/errors.py +0 -0
  408. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/eval_design.py +0 -0
  409. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  410. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  411. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/evolve.py +0 -0
  412. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/expectations.py +0 -0
  413. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/fetch_examples.py +0 -0
  414. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/flash_attn.py +0 -0
  415. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/fp8.py +0 -0
  416. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/freeze.py +0 -0
  417. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/fsdp.py +0 -0
  418. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  419. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/galore.py +0 -0
  420. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/gguf_quant.py +0 -0
  421. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/gpu_monitor.py +0 -0
  422. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/grace_codebook.py +0 -0
  423. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/graceful_save.py +0 -0
  424. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/grad_accum.py +0 -0
  425. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  426. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/grpo_long_context.py +0 -0
  427. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/grpo_variants.py +0 -0
  428. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/hardware_fit.py +0 -0
  429. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/harm_probe.py +0 -0
  430. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/hf.py +0 -0
  431. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/hf_space.py +0 -0
  432. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/hubs.py +0 -0
  433. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ingest_sources.py +0 -0
  434. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/integrations.py +0 -0
  435. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/interference.py +0 -0
  436. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/interference_live.py +0 -0
  437. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/irt.py +0 -0
  438. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/iterative_dpo.py +0 -0
  439. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  440. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/kernel_picker.py +0 -0
  441. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/knowledge_edit.py +0 -0
  442. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/kv_cache.py +0 -0
  443. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/launcher.py +0 -0
  444. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/license_advisor.py +0 -0
  445. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/license_matrix.py +0 -0
  446. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/liger.py +0 -0
  447. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/live_eval.py +0 -0
  448. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/llama_proxy.py +0 -0
  449. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/llama_server_timings.py +0 -0
  450. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/local_rl.py +0 -0
  451. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  452. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loftq_init.py +0 -0
  453. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/log_level.py +0 -0
  454. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/long_context.py +0 -0
  455. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/longlora.py +0 -0
  456. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loop_budget.py +0 -0
  457. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loop_daemon.py +0 -0
  458. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loop_iteration.py +0 -0
  459. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loop_stages.py +0 -0
  460. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/loop_state.py +0 -0
  461. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/lr_groups.py +0 -0
  462. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/magpie.py +0 -0
  463. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/metrics.py +0 -0
  464. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mii.py +0 -0
  465. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/minillm.py +0 -0
  466. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mix_proxy.py +0 -0
  467. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mixed_precision.py +0 -0
  468. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mlx.py +0 -0
  469. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mod.py +0 -0
  470. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/moe.py +0 -0
  471. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/moe_quant.py +0 -0
  472. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/mole_routing.py +0 -0
  473. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/multipack.py +0 -0
  474. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/multipack_sampler.py +0 -0
  475. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/multipack_trainer.py +0 -0
  476. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/namespace_pin.py +0 -0
  477. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/neat_packing.py +0 -0
  478. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ngram_spec.py +0 -0
  479. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/nlg_metrics.py +0 -0
  480. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ollama.py +0 -0
  481. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/onboarding.py +0 -0
  482. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  483. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/peft_builder.py +0 -0
  484. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/peft_patches.py +0 -0
  485. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/peft_wiring.py +0 -0
  486. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/persona_hub.py +0 -0
  487. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/pipeline.py +0 -0
  488. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/preference_combine.py +0 -0
  489. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/prm.py +0 -0
  490. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/probe_kernel.py +0 -0
  491. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/probe_pack.py +0 -0
  492. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/profiler.py +0 -0
  493. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/profiling.py +0 -0
  494. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  495. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/prompt_compile.py +0 -0
  496. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/prompt_distill.py +0 -0
  497. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/prune_prompt.py +0 -0
  498. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/qat.py +0 -0
  499. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/qr_url.py +0 -0
  500. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/quality.py +0 -0
  501. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/quant_menu.py +0 -0
  502. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ra_dit.py +0 -0
  503. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ra_dit_run.py +0 -0
  504. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/raft.py +0 -0
  505. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/reasoning_effort.py +0 -0
  506. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/reasoning_parser.py +0 -0
  507. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/recipe_dag.py +0 -0
  508. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/recipe_run.py +0 -0
  509. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/registry.py +0 -0
  510. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/relora.py +0 -0
  511. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/replay.py +0 -0
  512. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/repro_receipt.py +0 -0
  513. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/reward_hack_control.py +0 -0
  514. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/reward_hacking.py +0 -0
  515. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ring_attention.py +0 -0
  516. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  517. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  518. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/run_cost.py +0 -0
  519. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/sae_diff.py +0 -0
  520. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/save_formats.py +0 -0
  521. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/server_tools.py +0 -0
  522. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/sglang.py +0 -0
  523. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ship_verdict.py +0 -0
  524. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/shortcuts.py +0 -0
  525. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/shrink.py +0 -0
  526. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/signing.py +0 -0
  527. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/sleeper_probe.py +0 -0
  528. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/soup_lock.py +0 -0
  529. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/spectrum_scan.py +0 -0
  530. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/spike_recovery.py +0 -0
  531. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/sse_train_stream.py +0 -0
  532. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/steering.py +0 -0
  533. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/structured_output.py +0 -0
  534. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/sweep_config.py +0 -0
  535. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tail_latency.py +0 -0
  536. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/terraform_plan.py +0 -0
  537. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tool_outputs.py +0 -0
  538. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/topology.py +0 -0
  539. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tracing.py +0 -0
  540. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/trackers.py +0 -0
  541. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/train_event_buffer.py +0 -0
  542. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/trainer_plugins.py +0 -0
  543. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/trust_remote.py +0 -0
  544. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/truth_probe.py +0 -0
  545. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tts.py +0 -0
  546. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tts_codec.py +0 -0
  547. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/tunability.py +0 -0
  548. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/ui_env.py +0 -0
  549. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/uld.py +0 -0
  550. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  551. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/unlearning.py +0 -0
  552. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/unlearning_eval.py +0 -0
  553. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/unsloth.py +0 -0
  554. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/v028_features.py +0 -0
  555. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/vector_bank.py +0 -0
  556. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/warmup.py +0 -0
  557. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/webhooks.py +0 -0
  558. {soup_cli-0.71.32 → soup_cli-0.71.33}/src/soup_cli/utils/why.py +0 -0
  559. {soup_cli-0.71.32 → soup_cli-0.71.33}/templates/chat.yaml +0 -0
  560. {soup_cli-0.71.32 → soup_cli-0.71.33}/templates/code.yaml +0 -0
  561. {soup_cli-0.71.32 → soup_cli-0.71.33}/templates/medical.yaml +0 -0
  562. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/__init__.py +0 -0
  563. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/conftest.py +0 -0
  564. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/qa/v053_qa.md +0 -0
  565. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/qa/v07114_qa.md +0 -0
  566. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/qa/v0716_qa.md +0 -0
  567. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_adapters.py +0 -0
  568. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_advanced_peft.py +0 -0
  569. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_assistant_mask.py +0 -0
  570. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_audio.py +0 -0
  571. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_auto_tuning.py +0 -0
  572. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_autopilot.py +0 -0
  573. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_awq_gptq_export.py +0 -0
  574. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_batch_probe.py +0 -0
  575. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_bco.py +0 -0
  576. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_bench.py +0 -0
  577. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_brain_rot_multilingual.py +0 -0
  578. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_bugfixes.py +0 -0
  579. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_build_dag.py +0 -0
  580. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_callback.py +0 -0
  581. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_cans.py +0 -0
  582. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_chat.py +0 -0
  583. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_chat_template.py +0 -0
  584. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_cli.py +0 -0
  585. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_cli_subprocess.py +0 -0
  586. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_code_review_critical.py +0 -0
  587. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_code_review_deferred.py +0 -0
  588. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_code_review_medium_low.py +0 -0
  589. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_code_review_recurring.py +0 -0
  590. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_config.py +0 -0
  591. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_cost.py +0 -0
  592. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_crash_reporter.py +0 -0
  593. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_curriculum.py +0 -0
  594. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_data.py +0 -0
  595. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_data_augment.py +0 -0
  596. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_data_sample.py +0 -0
  597. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_data_split.py +0 -0
  598. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_data_tools.py +0 -0
  599. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_dataset_hub.py +0 -0
  600. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_dataset_registry.py +0 -0
  601. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_deepspeed.py +0 -0
  602. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_deploy_ollama.py +0 -0
  603. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_diff.py +0 -0
  604. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_display.py +0 -0
  605. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_doctor.py +0 -0
  606. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_dpo_example.py +0 -0
  607. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_dpo_variants.py +0 -0
  608. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_embedding.py +0 -0
  609. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_errors.py +0 -0
  610. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_eval.py +0 -0
  611. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_eval_gate.py +0 -0
  612. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_eval_platform.py +0 -0
  613. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_export.py +0 -0
  614. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_formats.py +0 -0
  615. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_fp8_recipe.py +0 -0
  616. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_freeze_training.py +0 -0
  617. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_generate.py +0 -0
  618. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_gpu.py +0 -0
  619. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_grpo.py +0 -0
  620. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_hf_integration.py +0 -0
  621. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_infer.py +0 -0
  622. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_inference_advanced.py +0 -0
  623. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_init.py +0 -0
  624. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ipo.py +0 -0
  625. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_jinja_analyzer.py +0 -0
  626. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_kto.py +0 -0
  627. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_loader.py +0 -0
  628. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_log_level.py +0 -0
  629. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_loss_watchdog.py +0 -0
  630. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_merge.py +0 -0
  631. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_migrate.py +0 -0
  632. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_mlx_backend.py +0 -0
  633. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_moe.py +0 -0
  634. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_multi_adapter.py +0 -0
  635. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_multi_gpu.py +0 -0
  636. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_multipack_config.py +0 -0
  637. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_multipack_invariants.py +0 -0
  638. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_multipack_sampler.py +0 -0
  639. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_neat_packing.py +0 -0
  640. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_neftune_rslora.py +0 -0
  641. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_onnx_tensorrt_export.py +0 -0
  642. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_orpo.py +0 -0
  643. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_packing.py +0 -0
  644. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_a_wave1.py +0 -0
  645. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_a_wave2.py +0 -0
  646. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_b.py +0 -0
  647. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_c.py +0 -0
  648. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_d.py +0 -0
  649. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_e.py +0 -0
  650. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_part_f_hardening.py +0 -0
  651. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_peft_methods.py +0 -0
  652. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_peft_patches.py +0 -0
  653. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_performance.py +0 -0
  654. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_pissa_init.py +0 -0
  655. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ppo.py +0 -0
  656. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_preference_dispatcher.py +0 -0
  657. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_preference_multi.py +0 -0
  658. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_preference_multi_runtime.py +0 -0
  659. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_pretrain.py +0 -0
  660. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_profile.py +0 -0
  661. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_profiling.py +0 -0
  662. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_progress.py +0 -0
  663. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_push.py +0 -0
  664. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_qat.py +0 -0
  665. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_quality_filter.py +0 -0
  666. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_quant_check.py +0 -0
  667. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_quant_menu.py +0 -0
  668. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_quickstart.py +0 -0
  669. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_rank_pattern.py +0 -0
  670. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_recipes.py +0 -0
  671. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_recipes_v031.py +0 -0
  672. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_refusal_multilingual.py +0 -0
  673. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_registry.py +0 -0
  674. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_relora.py +0 -0
  675. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_replay.py +0 -0
  676. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_resume.py +0 -0
  677. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_rlvr.py +0 -0
  678. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_run_cost.py +0 -0
  679. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_runs.py +0 -0
  680. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_serve.py +0 -0
  681. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_server_generate.py +0 -0
  682. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_sglang_serve.py +0 -0
  683. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_simpo.py +0 -0
  684. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_smoke_train.py +0 -0
  685. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_speculative_decoding.py +0 -0
  686. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_sweep.py +0 -0
  687. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_synth_data_pro.py +0 -0
  688. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_templates_yaml.py +0 -0
  689. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_tensorboard.py +0 -0
  690. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_tool_calling.py +0 -0
  691. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_trace_to_pref.py +0 -0
  692. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_tracker.py +0 -0
  693. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_trainer_coverage_v035.py +0 -0
  694. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_trainer_init.py +0 -0
  695. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_training_intelligence.py +0 -0
  696. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_training_speed.py +0 -0
  697. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_trust_remote_code.py +0 -0
  698. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_tui.py +0 -0
  699. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ui.py +0 -0
  700. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ui_chat.py +0 -0
  701. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ui_config_builder.py +0 -0
  702. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ui_live_monitor.py +0 -0
  703. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_ui_metrics.py +0 -0
  704. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_unsloth.py +0 -0
  705. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0401_part_c.py +0 -0
  706. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0401_part_d.py +0 -0
  707. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0401_part_e.py +0 -0
  708. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0402_part_a.py +0 -0
  709. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0402_part_b.py +0 -0
  710. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0403_part_a.py +0 -0
  711. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0403_part_b.py +0 -0
  712. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0403_part_c.py +0 -0
  713. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0404_part_a.py +0 -0
  714. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0404_part_b.py +0 -0
  715. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0405_part_a.py +0 -0
  716. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0406_part_a.py +0 -0
  717. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0410_part_a.py +0 -0
  718. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0410_part_b.py +0 -0
  719. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0410_part_c.py +0 -0
  720. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0420.py +0 -0
  721. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0430_part_a.py +0 -0
  722. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0430_part_b.py +0 -0
  723. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0430_part_c.py +0 -0
  724. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0430_part_d.py +0 -0
  725. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0440_part_a.py +0 -0
  726. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0440_part_b.py +0 -0
  727. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0440_part_c.py +0 -0
  728. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0440_part_d.py +0 -0
  729. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0440_review_followups.py +0 -0
  730. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0450.py +0 -0
  731. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0460_part_a.py +0 -0
  732. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0460_part_b.py +0 -0
  733. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0470_part_a.py +0 -0
  734. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0470_part_b.py +0 -0
  735. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0480_part_a.py +0 -0
  736. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0480_part_b.py +0 -0
  737. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0490.py +0 -0
  738. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0500_part_a.py +0 -0
  739. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0500_part_b.py +0 -0
  740. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0500_part_c.py +0 -0
  741. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0500_part_d.py +0 -0
  742. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0500_part_e.py +0 -0
  743. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0510.py +0 -0
  744. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0520.py +0 -0
  745. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0530.py +0 -0
  746. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v05310.py +0 -0
  747. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v05311.py +0 -0
  748. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0531_109.py +0 -0
  749. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0531_139.py +0 -0
  750. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0531_142.py +0 -0
  751. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0531_82.py +0 -0
  752. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0532.py +0 -0
  753. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0533.py +0 -0
  754. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0534.py +0 -0
  755. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0535.py +0 -0
  756. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0536.py +0 -0
  757. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0537.py +0 -0
  758. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0538.py +0 -0
  759. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0539.py +0 -0
  760. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0540.py +0 -0
  761. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0550.py +0 -0
  762. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0550_followups.py +0 -0
  763. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0560.py +0 -0
  764. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0570_part_a.py +0 -0
  765. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0570_part_b.py +0 -0
  766. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0570_part_c.py +0 -0
  767. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0570_part_d.py +0 -0
  768. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0580.py +0 -0
  769. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0590.py +0 -0
  770. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_a.py +0 -0
  771. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_b.py +0 -0
  772. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_c.py +0 -0
  773. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_d.py +0 -0
  774. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_e.py +0 -0
  775. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0600_part_f.py +0 -0
  776. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0610_part_a.py +0 -0
  777. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0610_part_b.py +0 -0
  778. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0610_part_c.py +0 -0
  779. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0610_part_d.py +0 -0
  780. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0610_part_e.py +0 -0
  781. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_followups.py +0 -0
  782. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_part_a.py +0 -0
  783. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_part_b.py +0 -0
  784. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_part_c.py +0 -0
  785. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_part_d.py +0 -0
  786. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0620_part_e.py +0 -0
  787. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_followups.py +0 -0
  788. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_part_a.py +0 -0
  789. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_part_b.py +0 -0
  790. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_part_c.py +0 -0
  791. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_part_d.py +0 -0
  792. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0630_part_e.py +0 -0
  793. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0631_206.py +0 -0
  794. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_followups.py +0 -0
  795. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_a.py +0 -0
  796. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_b.py +0 -0
  797. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_c.py +0 -0
  798. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_d.py +0 -0
  799. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_e.py +0 -0
  800. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0640_part_f.py +0 -0
  801. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_followups.py +0 -0
  802. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_part_a.py +0 -0
  803. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_part_b.py +0 -0
  804. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_part_c.py +0 -0
  805. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_part_d.py +0 -0
  806. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0650_part_e.py +0 -0
  807. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_cli.py +0 -0
  808. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_followups.py +0 -0
  809. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_part_a.py +0 -0
  810. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_part_b.py +0 -0
  811. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_part_c.py +0 -0
  812. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_part_d.py +0 -0
  813. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0660_part_e.py +0 -0
  814. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_followups.py +0 -0
  815. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_a.py +0 -0
  816. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_b.py +0 -0
  817. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_c.py +0 -0
  818. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_d.py +0 -0
  819. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_e.py +0 -0
  820. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0670_part_f.py +0 -0
  821. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_followups.py +0 -0
  822. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_part_a.py +0 -0
  823. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_part_b.py +0 -0
  824. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_part_c.py +0 -0
  825. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_part_d.py +0 -0
  826. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0680_part_e.py +0 -0
  827. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0690_part_a.py +0 -0
  828. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0690_part_b.py +0 -0
  829. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0690_part_c.py +0 -0
  830. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0690_part_d.py +0 -0
  831. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0690_part_e.py +0 -0
  832. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_a.py +0 -0
  833. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_b.py +0 -0
  834. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_c.py +0 -0
  835. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_d.py +0 -0
  836. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_e.py +0 -0
  837. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0700_part_f.py +0 -0
  838. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07110.py +0 -0
  839. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07111.py +0 -0
  840. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07112.py +0 -0
  841. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07113.py +0 -0
  842. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07114.py +0 -0
  843. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07115.py +0 -0
  844. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07116.py +0 -0
  845. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07117.py +0 -0
  846. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07118.py +0 -0
  847. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07119.py +0 -0
  848. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0712.py +0 -0
  849. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07120.py +0 -0
  850. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07121.py +0 -0
  851. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07122.py +0 -0
  852. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07123.py +0 -0
  853. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07124.py +0 -0
  854. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07125.py +0 -0
  855. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07126.py +0 -0
  856. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07127.py +0 -0
  857. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07128.py +0 -0
  858. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07129.py +0 -0
  859. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0713.py +0 -0
  860. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07131.py +0 -0
  861. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v07132.py +0 -0
  862. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0714.py +0 -0
  863. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0715.py +0 -0
  864. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0716.py +0 -0
  865. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0717.py +0 -0
  866. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0718.py +0 -0
  867. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_v0719.py +0 -0
  868. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_validator.py +0 -0
  869. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_warmup.py +0 -0
  870. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_why.py +0 -0
  871. {soup_cli-0.71.32 → soup_cli-0.71.33}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,100 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.33] - 2026-07-13
16
+
17
+ ### Added
18
+ - **`soup draft` — train and, above all, MEASURE a speculative-decoding draft model.**
19
+ - `soup draft measure --target <m> --draft <d> --prompts p.jsonl` reports a draft's
20
+ **acceptance rate** (the fraction of the target's own greedy tokens the draft
21
+ would have proposed correctly) plus **real plain-vs-assisted throughput**. This is
22
+ the honest gate: it tells you whether speculative decoding is worth enabling
23
+ *before* you ship it. Exit 0 / 2 (below `--min-acceptance`, for CI) / 1.
24
+ - `soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/`
25
+ distils your target into the tiny base (logit KD via the existing `task: distill`
26
+ trainer) and emits a **dense** draft model, ready to load as an `assistant_model`.
27
+ - `soup draft list`, plus a local draft registry (`~/.soup/drafts.json`) that
28
+ `soup serve --auto-spec` consults **before** the built-in pairing table — so a
29
+ draft you trained yourself is picked up automatically.
30
+ - Draft and target must share a tokenizer; a mismatched pair is refused up front
31
+ (speculative decoding proposes draft token ids into the target's vocabulary, so a
32
+ mismatch silently produces garbage rather than failing).
33
+
34
+ **Read the measured results before you use this** — see *Known limitations* below.
35
+ On the validated pair, distillation did **not** improve acceptance, and speculative
36
+ decoding was a net **slowdown**. `soup draft measure` is what tells you that.
37
+
38
+ ### Known limitations
39
+ - **Distilling a draft did not improve its acceptance rate on the validated pair.**
40
+ Measured on `SmolLM2-360M-Instruct` (target) with a `SmolLM2-135M-Instruct` draft:
41
+ the *stock* draft already scored **69.3%**, and distilling it moved that to 69.7%
42
+ after 2 epochs and back to **69.3%** after 10 epochs — i.e. no gain beyond noise.
43
+ A small same-family draft is already near its capacity ceiling for agreeing with
44
+ the target, and logit KD cannot buy capacity it does not have. Whether distillation
45
+ materially raises acceptance for a genuinely diverged fine-tune, or a larger
46
+ target/draft pair, is **unproven** on a 4 GB box — tracked as a scale issue.
47
+ - **Speculative decoding was a net slowdown on that pair** (measured 0.55–0.64×): the
48
+ draft's forward pass costs more than the tokens it saves at this size.
49
+ `soup draft measure` reports this truthfully rather than assuming a speedup — which
50
+ is precisely the point of shipping the measurement.
51
+ - **Acceptance is teacher-forced greedy agreement**, the metric the Medusa/EAGLE
52
+ papers report. It is exact and deterministic, and it is the right number for
53
+ comparing drafts — but it is not the accepted-token count of a *sampling* run, which
54
+ also depends on the rejection-resample cascade.
55
+ - **Same-tokenizer only.** Cross-tokenizer drafts (ULD-aligned + universal assisted
56
+ decoding) are deferred.
57
+
58
+ ### Changed
59
+ - **PRM-guided GRPO scores completions in a single batched forward.**
60
+ `PRMScorer.__call__` now right-pads all completions into one `[B, T]` tensor
61
+ (+ attention mask) and runs one `output_hidden_states` pass instead of one
62
+ forward per completion, cutting per-step reward latency on non-tiny models.
63
+ Numerically identical to the per-completion path (parity + mixed-length tests).
64
+ Closes #298
65
+ ([#301](https://github.com/MakazhanAlpamys/Soup/pull/301) by [@Ekaanksh-dev](https://github.com/Ekaanksh-dev)).
66
+
67
+ ### Fixed
68
+ - **The hardware-fit gate no longer refuses to train small models.**
69
+ `model_size_from_name` did not understand an `M` (millions) suffix, so
70
+ `SmolLM2-135M` fell through to the 7B default, was predicted to need ~14 GB of
71
+ weights, and was blocked. Every draft-sized model hit this. `1.7B` was also being
72
+ read as `7B` (the `7b` marker matched inside `1.7b`), while `Qwen2.5-7B-Instruct-1M`
73
+ correctly stays 7B (1M is the *context*, not the parameter count).
74
+ - **`soup serve --backend vllm` no longer force-enables `trust_remote_code`.** The
75
+ vLLM path now goes through the same `--trust-remote-code` default-deny gate (and
76
+ warning panel) as the transformers backend, so serving an untrusted repo never
77
+ executes its code silently.
78
+ - **Multi-adapter serving (`soup serve --adapters name=path`) now actually switches
79
+ adapters.** The named adapters are loaded into the model and selected per request
80
+ (via `POST /v1/adapters/activate/{name}` or the request `adapter` field);
81
+ previously every request silently ran the startup model. The base model is served
82
+ when no adapter is selected.
83
+ - **Vision datasets reject out-of-directory image paths.** `llava` / `sharegpt4v`
84
+ rows are containment-checked against `image_dir` (mirroring the audio loader), so a
85
+ crafted `{"image": "/etc/passwd"}` row can no longer read arbitrary local files.
86
+ - **`soup train --dry-run --gpus N` no longer launches a real multi-GPU run.** The
87
+ accelerate re-exec is skipped under `--dry-run`. The re-exec also now forwards
88
+ `--minillm-on-policy`, `--capture-activations`, and `--capture-prompts` (previously
89
+ dropped on multi-GPU runs).
90
+ - **MLX SFT now builds a real optimizer** (`AdamW` from the configured LR) instead of
91
+ passing `optimizer=None`, which left the model untrained.
92
+ - **`soup data inspect` / `preview` / `search` escape dataset- and Hub-derived text**
93
+ so a stray `[/]` no longer crashes the command and a crafted `[link=…]` tag can't
94
+ render a phishing hyperlink. `soup runs` list/show escape config-derived fields too.
95
+ - **`soup infer --task asr` hardening** — an oversized reference no longer crashes the
96
+ whole batch after transcription (that row's metric is skipped); an all-skipped run
97
+ exits non-zero instead of reporting success; `--asr-task` is validated upfront; and
98
+ dataset-derived filenames are control-stripped before printing. ASR training now
99
+ caps transcript labels to Whisper's decoder limit, warns on >30 s audio, and picks
100
+ fp16 on pre-Ampere GPUs instead of hardcoding bf16.
101
+ - **Knowledge-distillation KD term aligns with the CE term.** The token-level
102
+ divergence is now computed over causal-shifted positions, so the distillation signal
103
+ covers exactly the trained tokens (previously off by one).
104
+ - **Miscellaneous robustness** — `load_config_from_string` raises `ValueError` (not
105
+ `TypeError`) on a non-mapping YAML document; the Web UI Bearer-token check is
106
+ constant-time; and `soup doctor --vscode` / the LR-finder report use the centralised
107
+ atomic, symlink-rejecting writer.
108
+
15
109
  ## [0.71.32] - 2026-07-07
16
110
 
17
111
  ### 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 (311 files, 15806 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.33
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,23 +193,35 @@ 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.33`soup draft`: know whether speculative decoding is actually worth it.** Everyone tells you to bolt a draft model onto your server for a free speedup. Nobody tells you to *measure* it first. Now you can.
197
+
198
+ - **`soup draft measure`.** Reports a draft's **acceptance rate** the fraction of your target's
199
+ own greedy tokens the draft would have proposed correctly plus **real plain-vs-assisted
200
+ tok/s**. Exit 0 / 2 (below `--min-acceptance`) / 1, so CI can gate on it.
201
+ - **`soup draft distill`.** Distils your tuned target into a tiny draft base (logit KD over the
202
+ existing `task: distill` trainer) and emits a **dense** model, loadable straight as an
203
+ `assistant_model`.
204
+ - **Auto-wired into serving.** Drafts land in a local registry that `soup serve --auto-spec`
205
+ consults *before* the built-in pairing table so a draft you trained yourself just gets used.
206
+ - **What the measurement actually told us (honestly).** On `SmolLM2-360M-Instruct`
207
+ `SmolLM2-135M-Instruct`: the stock draft already scored **69.3%**, and distilling it changed
208
+ nothing (69.7% at 2 epochs, 69.3% at 10). Assisted decoding was a **net slowdown** (0.55–0.64×).
209
+ A small same-family draft is already at its ceiling. **That negative result is the feature
210
+ working** it's the number you want *before* you ship speculative decoding, not after.
211
+ Whether distillation pays off on a larger or genuinely diverged pair is unproven on a 4 GB box.
212
+
213
+ ```bash
214
+ soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \
215
+ --prompts prod-prompts.jsonl # -> acceptance %, real tok/s, ship-or-not
216
+ ```
217
+
218
+ <details>
219
+ <summary>Previous release — v0.71.32, ASR fine-tuning (Whisper)</summary>
220
+
221
+ Fine-tune Whisper on your accent or domain, locally: `task='asr'` (`AsrTrainerWrapper` over HF
222
+ `Seq2SeqTrainer` + `WhisperProcessor`), `soup infer --task asr` with per-row + corpus **WER/CER**,
223
+ pure-python metrics in `soup_cli.utils.asr_metrics`, and 4 new recipes (catalog 138 → 142).
224
+ whisper-tiny (39M) / base (74M) train on a 4 GB GPU.
213
225
 
214
226
  ```yaml
215
227
  base: openai/whisper-tiny
@@ -222,6 +234,8 @@ training:
222
234
  asr_lora: true # optional; default = full fine-tune
223
235
  ```
224
236
 
237
+ </details>
238
+
225
239
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
226
240
 
227
241
  ## Quick Start
@@ -49,23 +49,35 @@ 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.33`soup draft`: know whether speculative decoding is actually worth it.** Everyone tells you to bolt a draft model onto your server for a free speedup. Nobody tells you to *measure* it first. Now you can.
53
+
54
+ - **`soup draft measure`.** Reports a draft's **acceptance rate** the fraction of your target's
55
+ own greedy tokens the draft would have proposed correctly plus **real plain-vs-assisted
56
+ tok/s**. Exit 0 / 2 (below `--min-acceptance`) / 1, so CI can gate on it.
57
+ - **`soup draft distill`.** Distils your tuned target into a tiny draft base (logit KD over the
58
+ existing `task: distill` trainer) and emits a **dense** model, loadable straight as an
59
+ `assistant_model`.
60
+ - **Auto-wired into serving.** Drafts land in a local registry that `soup serve --auto-spec`
61
+ consults *before* the built-in pairing table so a draft you trained yourself just gets used.
62
+ - **What the measurement actually told us (honestly).** On `SmolLM2-360M-Instruct`
63
+ `SmolLM2-135M-Instruct`: the stock draft already scored **69.3%**, and distilling it changed
64
+ nothing (69.7% at 2 epochs, 69.3% at 10). Assisted decoding was a **net slowdown** (0.55–0.64×).
65
+ A small same-family draft is already at its ceiling. **That negative result is the feature
66
+ working** it's the number you want *before* you ship speculative decoding, not after.
67
+ Whether distillation pays off on a larger or genuinely diverged pair is unproven on a 4 GB box.
68
+
69
+ ```bash
70
+ soup draft measure --target ./my-tuned-model --draft HuggingFaceTB/SmolLM2-135M-Instruct \
71
+ --prompts prod-prompts.jsonl # -> acceptance %, real tok/s, ship-or-not
72
+ ```
73
+
74
+ <details>
75
+ <summary>Previous release — v0.71.32, ASR fine-tuning (Whisper)</summary>
76
+
77
+ Fine-tune Whisper on your accent or domain, locally: `task='asr'` (`AsrTrainerWrapper` over HF
78
+ `Seq2SeqTrainer` + `WhisperProcessor`), `soup infer --task asr` with per-row + corpus **WER/CER**,
79
+ pure-python metrics in `soup_cli.utils.asr_metrics`, and 4 new recipes (catalog 138 → 142).
80
+ whisper-tiny (39M) / base (74M) train on a 4 GB GPU.
69
81
 
70
82
  ```yaml
71
83
  base: openai/whisper-tiny
@@ -78,6 +90,8 @@ training:
78
90
  asr_lora: true # optional; default = full fine-tune
79
91
  ```
80
92
 
93
+ </details>
94
+
81
95
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
82
96
 
83
97
  ## Quick Start
@@ -134,7 +134,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
134
134
  soup migrate --from axolotl config.yml Import config from Axolotl
135
135
  soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
136
136
  soup migrate --from llamafactory c.yaml --dry-run Preview without writing
137
- soup recipes list List all 138 ready-made recipes
137
+ soup recipes list List all 142 ready-made recipes
138
138
  soup recipes show llama3.1-8b-sft Print recipe YAML
139
139
  soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
140
140
  soup recipes search "reasoning" Search by keyword/task/size
@@ -163,6 +163,11 @@ soup mcp serve --allow-mutating Also expose plan-only train_start
163
163
  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
164
  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
165
  soup shrink ... --tolerance 0.10 --plan-only [--attach-to-registry <id>] Ppl-regression tolerance / print importance table only / registry attach
166
+ 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)
167
+ soup draft measure ... --min-acceptance 0.6 -o report.json Exit 2 below the floor (CI gate) / write the JSON report
168
+ soup draft distill --target <tuned> --draft-base <tiny> --data d.jsonl -o draft/ Distil a DENSE speculative-decoding draft + register it (v0.71.33)
169
+ soup draft distill ... --steps N --device cpu --force --plan-only Training budget / device / overwrite -o / render the config only
170
+ soup draft list List local drafts that `soup serve --auto-spec` will pick up (v0.71.33)
166
171
  soup tui Full-screen Textual dashboard (requires [tui] extra)
167
172
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
168
173
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -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.33"
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.33"
@@ -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.
@@ -53,12 +53,20 @@ def inspect(
53
53
 
54
54
  # Print sample rows
55
55
  if rows > 0 and len(data) > 0:
56
+ # Escape dataset-derived cell content + column names: a stray '[/]' in
57
+ # ordinary data crashes Rich with MarkupError; a crafted '[link=...]'
58
+ # renders a phishing hyperlink. Mirrors `soup data review`.
59
+ from rich.markup import escape as _escape
60
+
56
61
  console.print(f"\n[bold]Sample rows ({min(rows, len(data))}):[/]")
57
62
  sample_table = Table(show_lines=True)
58
63
  for col in result["columns"][:5]: # max 5 columns
59
- sample_table.add_column(col, max_width=60)
64
+ sample_table.add_column(_escape(str(col)), max_width=60)
60
65
  for row in data[: min(rows, len(data))]:
61
- values = [str(row.get(col, ""))[:60] for col in result["columns"][:5]]
66
+ values = [
67
+ _escape(str(row.get(col, ""))[:60])
68
+ for col in result["columns"][:5]
69
+ ]
62
70
  sample_table.add_row(*values)
63
71
  console.print(sample_table)
64
72
 
@@ -1102,16 +1110,20 @@ def search_datasets(
1102
1110
  table.add_column("Likes", justify="right")
1103
1111
  table.add_column("Tags", max_width=30)
1104
1112
 
1113
+ # HF-hub metadata (ids, tags) is attacker-authored — escape before it
1114
+ # reaches a Rich table (MarkupError crash / phishing-link injection).
1115
+ from rich.markup import escape as _escape
1116
+
1105
1117
  for ds_item in datasets[:limit]:
1106
1118
  ds_tags = getattr(ds_item, "tags", []) or []
1107
- tag_str = ", ".join(ds_tags[:5])
1119
+ tag_str = ", ".join(str(t) for t in ds_tags[:5])
1108
1120
  if len(ds_tags) > 5:
1109
1121
  tag_str += "..."
1110
1122
  table.add_row(
1111
- ds_item.id,
1123
+ _escape(str(ds_item.id)),
1112
1124
  _format_count(getattr(ds_item, "downloads", 0) or 0),
1113
1125
  _format_count(getattr(ds_item, "likes", 0) or 0),
1114
- tag_str,
1126
+ _escape(tag_str),
1115
1127
  )
1116
1128
 
1117
1129
  console.print(table)
@@ -1137,22 +1149,26 @@ def preview_dataset(
1137
1149
  )
1138
1150
  raise typer.Exit(1)
1139
1151
 
1140
- table = Table(title=f"Dataset: {info['id']}")
1152
+ # HF-hub metadata (id, description, tags, feature/split names) is
1153
+ # attacker-authored — escape before it reaches a Rich table.
1154
+ from rich.markup import escape as _escape
1155
+
1156
+ table = Table(title=f"Dataset: {_escape(str(info['id']))}")
1141
1157
  table.add_column("Field", style="bold")
1142
1158
  table.add_column("Value", max_width=80)
1143
1159
 
1144
- table.add_row("ID", info["id"])
1160
+ table.add_row("ID", _escape(str(info["id"])))
1145
1161
  desc = info["description"]
1146
1162
  if len(desc) > 200:
1147
1163
  desc = desc[:200] + "..."
1148
- table.add_row("Description", desc or "[dim]No description[/]")
1164
+ table.add_row("Description", _escape(desc) if desc else "[dim]No description[/]")
1149
1165
  table.add_row("Downloads", _format_count(info["downloads"]))
1150
1166
  table.add_row("Likes", _format_count(info["likes"]))
1151
1167
  table.add_row("Size", _format_size_bytes(info["size_bytes"]))
1152
1168
 
1153
1169
  if info["splits"]:
1154
1170
  splits_str = ", ".join(
1155
- f"{name} ({_format_count(count)})"
1171
+ f"{_escape(str(name))} ({_format_count(count)})"
1156
1172
  for name, count in info["splits"].items()
1157
1173
  )
1158
1174
  table.add_row("Splits", splits_str)
@@ -1160,10 +1176,10 @@ def preview_dataset(
1160
1176
  table.add_row("Splits", "[dim]Not available (use streaming to explore)[/]")
1161
1177
 
1162
1178
  if info["features"]:
1163
- table.add_row("Features", ", ".join(info["features"]))
1179
+ table.add_row("Features", ", ".join(_escape(str(f)) for f in info["features"]))
1164
1180
 
1165
1181
  if info["tags"]:
1166
- table.add_row("Tags", ", ".join(info["tags"][:10]))
1182
+ table.add_row("Tags", ", ".join(_escape(str(t)) for t in info["tags"][:10]))
1167
1183
 
1168
1184
  console.print(table)
1169
1185