soup-cli 0.71.26__tar.gz → 0.71.27__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 (846) hide show
  1. {soup_cli-0.71.26 → soup_cli-0.71.27}/CHANGELOG.md +76 -0
  2. {soup_cli-0.71.26 → soup_cli-0.71.27}/CONTRIBUTING.md +3 -3
  3. {soup_cli-0.71.26 → soup_cli-0.71.27}/CONTRIBUTORS.md +4 -0
  4. {soup_cli-0.71.26 → soup_cli-0.71.27}/PKG-INFO +18 -14
  5. {soup_cli-0.71.26 → soup_cli-0.71.27}/README.md +17 -13
  6. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/commands.md +5 -1
  7. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/data.md +46 -0
  8. {soup_cli-0.71.26 → soup_cli-0.71.27}/pyproject.toml +1 -1
  9. soup_cli-0.71.27/src/soup_cli/__init__.py +3 -0
  10. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/schema.py +4 -0
  11. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cli.py +7 -0
  12. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cloud/modal.py +6 -1
  13. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/_eval_v0550.py +31 -2
  14. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/bench.py +5 -0
  15. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/data.py +18 -12
  16. soup_cli-0.71.27/src/soup_cli/commands/data_doctor.py +337 -0
  17. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/diagnose.py +21 -6
  18. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/eval.py +31 -1
  19. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/export.py +8 -8
  20. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/fetch.py +4 -1
  21. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/generate.py +20 -5
  22. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/serve.py +38 -7
  23. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/train.py +177 -0
  24. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/formats.py +43 -9
  25. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/loader.py +6 -3
  26. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/traces/parsers.py +4 -1
  27. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/checkpoint_intelligence.py +6 -4
  28. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/custom.py +4 -1
  29. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/gate.py +41 -29
  30. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/migrate/common.py +8 -8
  31. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/callback.py +87 -3
  32. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/registry/store.py +39 -8
  33. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/bco.py +1 -0
  34. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/classifier.py +1 -0
  35. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/distill.py +36 -13
  36. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/dpo.py +1 -0
  37. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/embedding.py +1 -0
  38. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/grpo.py +4 -1
  39. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/ipo.py +5 -1
  40. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/kto.py +1 -0
  41. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/orpo.py +1 -0
  42. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/ppo.py +32 -12
  43. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/pretrain.py +1 -0
  44. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/reward_model.py +1 -0
  45. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/sft.py +44 -3
  46. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/simpo.py +1 -0
  47. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/app.py +12 -7
  48. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/active_sampler.py +7 -3
  49. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/block_expansion.py +15 -4
  50. soup_cli-0.71.27/src/soup_cli/utils/data_doctor.py +927 -0
  51. soup_cli-0.71.27/src/soup_cli/utils/data_lint.py +484 -0
  52. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/data_pipeline.py +47 -0
  53. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/deploy_measure.py +26 -1
  54. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/edit_kernels.py +4 -1
  55. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/eval_gate_hook.py +2 -1
  56. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/gguf_quant.py +9 -4
  57. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/license_matrix.py +5 -1
  58. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loop_stages.py +6 -1
  59. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mod.py +140 -16
  60. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/namespace_pin.py +24 -8
  61. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ollama.py +6 -6
  62. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/preference_combine.py +56 -5
  63. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/registry.py +4 -2
  64. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/reward_hack_control.py +13 -6
  65. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/rl_checkpoint.py +41 -1
  66. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/sglang.py +5 -2
  67. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/terraform_plan.py +17 -2
  68. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/webhooks.py +23 -7
  69. soup_cli-0.71.27/tests/test_code_review_critical.py +334 -0
  70. soup_cli-0.71.27/tests/test_code_review_deferred.py +177 -0
  71. soup_cli-0.71.27/tests/test_code_review_high.py +413 -0
  72. soup_cli-0.71.27/tests/test_code_review_medium_low.py +97 -0
  73. soup_cli-0.71.27/tests/test_code_review_recurring.py +110 -0
  74. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_eval_gate.py +12 -0
  75. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_a_wave1.py +7 -0
  76. soup_cli-0.71.27/tests/test_trainer_init.py +469 -0
  77. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0560.py +8 -3
  78. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07126.py +7 -2
  79. soup_cli-0.71.27/tests/test_v07127.py +2190 -0
  80. soup_cli-0.71.26/src/soup_cli/__init__.py +0 -3
  81. soup_cli-0.71.26/tests/test_trainer_init.py +0 -160
  82. {soup_cli-0.71.26 → soup_cli-0.71.27}/.dockerignore +0 -0
  83. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/FUNDING.yml +0 -0
  84. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  85. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  86. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  87. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/pull_request_template.md +0 -0
  88. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/workflows/ci.yml +0 -0
  89. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/workflows/docker.yml +0 -0
  90. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/workflows/publish.yml +0 -0
  91. {soup_cli-0.71.26 → soup_cli-0.71.27}/.github/workflows/recipe-validation.yml +0 -0
  92. {soup_cli-0.71.26 → soup_cli-0.71.27}/.gitignore +0 -0
  93. {soup_cli-0.71.26 → soup_cli-0.71.27}/.mailmap +0 -0
  94. {soup_cli-0.71.26 → soup_cli-0.71.27}/.pre-commit-config.yaml +0 -0
  95. {soup_cli-0.71.26 → soup_cli-0.71.27}/AGENTS.md +0 -0
  96. {soup_cli-0.71.26 → soup_cli-0.71.27}/CODEOWNERS +0 -0
  97. {soup_cli-0.71.26 → soup_cli-0.71.27}/CODE_OF_CONDUCT.md +0 -0
  98. {soup_cli-0.71.26 → soup_cli-0.71.27}/Dockerfile +0 -0
  99. {soup_cli-0.71.26 → soup_cli-0.71.27}/LICENSE +0 -0
  100. {soup_cli-0.71.26 → soup_cli-0.71.27}/NOTICE +0 -0
  101. {soup_cli-0.71.26 → soup_cli-0.71.27}/SECURITY.md +0 -0
  102. {soup_cli-0.71.26 → soup_cli-0.71.27}/docker-compose.yml +0 -0
  103. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/README.md +0 -0
  104. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/adapters-and-governance.md +0 -0
  105. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/backends-and-ops.md +0 -0
  106. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/evaluation.md +0 -0
  107. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/models.md +0 -0
  108. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/peft-and-efficiency.md +0 -0
  109. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/performance-and-quantization.md +0 -0
  110. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/serving-and-export.md +0 -0
  111. {soup_cli-0.71.26 → soup_cli-0.71.27}/docs/training.md +0 -0
  112. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/README.md +0 -0
  113. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/dpo_chat.yaml +0 -0
  114. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/dpo_example.yaml +0 -0
  115. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/grpo_reasoning.yaml +0 -0
  116. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/rlhf_step1_sft.yaml +0 -0
  117. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/rlhf_step2_reward.yaml +0 -0
  118. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  119. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/sft_basic.yaml +0 -0
  120. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/configs/vision_llama.yaml +0 -0
  121. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/data/alpaca_tiny.jsonl +0 -0
  122. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/data/chat_preferences.jsonl +0 -0
  123. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/data/dpo_sample.jsonl +0 -0
  124. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/data/reasoning_math.jsonl +0 -0
  125. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/reward_hacking/rewards.py +0 -0
  126. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/synthetic_workflow.md +0 -0
  127. {soup_cli-0.71.26 → soup_cli-0.71.27}/examples/synthetic_workflow.yaml +0 -0
  128. {soup_cli-0.71.26 → soup_cli-0.71.27}/soup.png +0 -0
  129. {soup_cli-0.71.26 → soup_cli-0.71.27}/soup_logo_svg.svg +0 -0
  130. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/__main__.py +0 -0
  131. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/autopilot/__init__.py +0 -0
  132. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/autopilot/analyzer.py +0 -0
  133. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/autopilot/decisions.py +0 -0
  134. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/autopilot/generate_config.py +0 -0
  135. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/__init__.py +0 -0
  136. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/pack.py +0 -0
  137. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/publish.py +0 -0
  138. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/run.py +0 -0
  139. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/unpack.py +0 -0
  140. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cans/verify.py +0 -0
  141. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/cloud/__init__.py +0 -0
  142. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/__init__.py +0 -0
  143. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/_eval_v0610.py +0 -0
  144. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/_eval_v0650.py +0 -0
  145. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/_eval_v07110.py +0 -0
  146. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/_webhook_cli.py +0 -0
  147. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/ab.py +0 -0
  148. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/active_sample.py +0 -0
  149. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/adapters.py +0 -0
  150. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/advise.py +0 -0
  151. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/agent.py +0 -0
  152. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/airgap.py +0 -0
  153. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/apple_adapter.py +0 -0
  154. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/attest.py +0 -0
  155. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/audit_log.py +0 -0
  156. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/autopilot.py +0 -0
  157. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/bom.py +0 -0
  158. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/build.py +0 -0
  159. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/can.py +0 -0
  160. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/chat.py +0 -0
  161. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/compile_cmd.py +0 -0
  162. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/compile_tools.py +0 -0
  163. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/completions.py +0 -0
  164. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/cost.py +0 -0
  165. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/data_forge.py +0 -0
  166. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/data_mix.py +0 -0
  167. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/data_score.py +0 -0
  168. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  169. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/deploy.py +0 -0
  170. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/diff.py +0 -0
  171. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/distill_prompt.py +0 -0
  172. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/doctor.py +0 -0
  173. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/drift_alarm.py +0 -0
  174. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/edit.py +0 -0
  175. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/env.py +0 -0
  176. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/expect.py +0 -0
  177. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/history.py +0 -0
  178. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/infer.py +0 -0
  179. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/ingest.py +0 -0
  180. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/init.py +0 -0
  181. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/iterative_dpo.py +0 -0
  182. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/license_advisor.py +0 -0
  183. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/llama.py +0 -0
  184. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/local_rl.py +0 -0
  185. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/lock.py +0 -0
  186. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/loop.py +0 -0
  187. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/merge.py +0 -0
  188. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  189. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/migrate.py +0 -0
  190. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/monitor.py +0 -0
  191. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/plan.py +0 -0
  192. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/plugins.py +0 -0
  193. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/probe.py +0 -0
  194. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/profile.py +0 -0
  195. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/prune_prompt.py +0 -0
  196. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/push.py +0 -0
  197. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/quantize.py +0 -0
  198. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/quickstart.py +0 -0
  199. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/ra_dit.py +0 -0
  200. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/recipes.py +0 -0
  201. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/registry.py +0 -0
  202. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/runs.py +0 -0
  203. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/ship.py +0 -0
  204. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/spectrum.py +0 -0
  205. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/steer.py +0 -0
  206. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/sweep.py +0 -0
  207. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/tokenizer.py +0 -0
  208. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/tui.py +0 -0
  209. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/tunability.py +0 -0
  210. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/ui.py +0 -0
  211. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/commands/why.py +0 -0
  212. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/config/__init__.py +0 -0
  213. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/config/loader.py +0 -0
  214. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/config/schema.py +0 -0
  215. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/__init__.py +0 -0
  216. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  217. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  218. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  219. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  220. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  221. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  222. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  223. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  224. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  225. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  226. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  227. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  228. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/augment.py +0 -0
  229. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/chat_templates.py +0 -0
  230. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/collators.py +0 -0
  231. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/loss_mask.py +0 -0
  232. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/providers/__init__.py +0 -0
  233. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/providers/_utils.py +0 -0
  234. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/providers/anthropic.py +0 -0
  235. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/providers/ollama.py +0 -0
  236. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/providers/vllm.py +0 -0
  237. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/sft_format.py +0 -0
  238. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/__init__.py +0 -0
  239. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/code.py +0 -0
  240. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/conversation.py +0 -0
  241. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/preference.py +0 -0
  242. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/qa.py +0 -0
  243. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/reasoning.py +0 -0
  244. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/tool_calling.py +0 -0
  245. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/templates/verifiable.py +0 -0
  246. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/traces/__init__.py +0 -0
  247. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/traces/pair_builder.py +0 -0
  248. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/traces/quality.py +0 -0
  249. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/data/validator.py +0 -0
  250. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/__init__.py +0 -0
  251. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/arena.py +0 -0
  252. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  253. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/calibrate.py +0 -0
  254. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/forgetting.py +0 -0
  255. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/human.py +0 -0
  256. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/judge.py +0 -0
  257. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/leaderboard.py +0 -0
  258. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/eval/quant_check.py +0 -0
  259. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/experiment/__init__.py +0 -0
  260. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/experiment/tracker.py +0 -0
  261. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/migrate/__init__.py +0 -0
  262. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/migrate/axolotl.py +0 -0
  263. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/migrate/llamafactory.py +0 -0
  264. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/migrate/unsloth.py +0 -0
  265. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/__init__.py +0 -0
  266. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  267. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/display.py +0 -0
  268. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  269. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/hf_push.py +0 -0
  270. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  271. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/monitoring/trace_logger.py +0 -0
  272. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/plugins/__init__.py +0 -0
  273. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/py.typed +0 -0
  274. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/recipes/__init__.py +0 -0
  275. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/recipes/catalog.py +0 -0
  276. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/registry/__init__.py +0 -0
  277. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/registry/attach.py +0 -0
  278. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/registry/diff.py +0 -0
  279. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/registry/hashing.py +0 -0
  280. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/__init__.py +0 -0
  281. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/audio.yaml +0 -0
  282. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/bco.yaml +0 -0
  283. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/chat.yaml +0 -0
  284. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/code.yaml +0 -0
  285. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/embedding.yaml +0 -0
  286. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  287. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  288. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  289. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/ipo.yaml +0 -0
  290. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/kto.yaml +0 -0
  291. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/longcontext.yaml +0 -0
  292. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/manifest.json +0 -0
  293. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/medical.yaml +0 -0
  294. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/moe.yaml +0 -0
  295. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/orpo.yaml +0 -0
  296. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/pretrain.yaml +0 -0
  297. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/reasoning.yaml +0 -0
  298. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/rlhf.yaml +0 -0
  299. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/simpo.yaml +0 -0
  300. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/tool-calling.yaml +0 -0
  301. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/templates/vision.yaml +0 -0
  302. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/__init__.py +0 -0
  303. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/bitnet.py +0 -0
  304. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  305. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  306. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/mlx_routing.py +0 -0
  307. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/mlx_sft.py +0 -0
  308. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/mole_routing.py +0 -0
  309. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/preference.py +0 -0
  310. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/prm.py +0 -0
  311. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/raft.py +0 -0
  312. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/rewards.py +0 -0
  313. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/tts.py +0 -0
  314. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/trainer/unlearn.py +0 -0
  315. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/tui_app.py +0 -0
  316. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/__init__.py +0 -0
  317. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/plugins/__init__.py +0 -0
  318. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/static/app.js +0 -0
  319. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/static/index.html +0 -0
  320. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/static/logo.png +0 -0
  321. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/static/logo.svg +0 -0
  322. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/ui/static/style.css +0 -0
  323. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/__init__.py +0 -0
  324. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/_eval_text.py +0 -0
  325. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ab_test.py +0 -0
  326. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/activation_offload.py +0 -0
  327. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_bisect.py +0 -0
  328. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_branch.py +0 -0
  329. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_diff.py +0 -0
  330. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_merge.py +0 -0
  331. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_pr.py +0 -0
  332. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_scan.py +0 -0
  333. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/adapter_sign.py +0 -0
  334. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/advanced_precision.py +0 -0
  335. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/advise.py +0 -0
  336. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/advise_history.py +0 -0
  337. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/agent_forge.py +0 -0
  338. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/agent_rollout.py +0 -0
  339. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/agent_sandbox.py +0 -0
  340. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/airgap_bundle.py +0 -0
  341. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/annex_xi.py +0 -0
  342. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/anthropic_messages.py +0 -0
  343. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/apple_adapter.py +0 -0
  344. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/attest.py +0 -0
  345. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/audit_log.py +0 -0
  346. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/auto_quant.py +0 -0
  347. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/backend_detect.py +0 -0
  348. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/batch_probe.py +0 -0
  349. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/behavior_battery.py +0 -0
  350. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/bitnet.py +0 -0
  351. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/blame.py +0 -0
  352. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/bom.py +0 -0
  353. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/brain_rot.py +0 -0
  354. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  355. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/build_dag.py +0 -0
  356. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/canary_discovery.py +0 -0
  357. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/canary_router.py +0 -0
  358. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/capability_suite.py +0 -0
  359. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/checklist_dsl.py +0 -0
  360. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  361. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/citation_faithful.py +0 -0
  362. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/classifier.py +0 -0
  363. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/cmaes_merge.py +0 -0
  364. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/compile_tools.py +0 -0
  365. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/completions.py +0 -0
  366. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/constants.py +0 -0
  367. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/convergence.py +0 -0
  368. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/crash.py +0 -0
  369. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  370. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/curriculum.py +0 -0
  371. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  372. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/cut_ce.py +0 -0
  373. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/data_forge.py +0 -0
  374. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/data_mix.py +0 -0
  375. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/data_score.py +0 -0
  376. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/deepspeed.py +0 -0
  377. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  378. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/demo_bundles.py +0 -0
  379. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  380. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  381. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/_common.py +0 -0
  382. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/badge.py +0 -0
  383. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/citation.py +0 -0
  384. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  385. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  386. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/format.py +0 -0
  387. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/live.py +0 -0
  388. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  389. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  390. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  391. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/report.py +0 -0
  392. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/diagnose/runner.py +0 -0
  393. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/distill.py +0 -0
  394. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/dpo_variants.py +0 -0
  395. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/drift_alarm.py +0 -0
  396. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  397. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/echo_trap.py +0 -0
  398. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/edit_diff.py +0 -0
  399. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/edit_governor.py +0 -0
  400. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/encoding.py +0 -0
  401. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/energy.py +0 -0
  402. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/env_lock.py +0 -0
  403. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/errors.py +0 -0
  404. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/eval_design.py +0 -0
  405. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  406. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/expectations.py +0 -0
  407. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/fetch_examples.py +0 -0
  408. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/flash_attn.py +0 -0
  409. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/fp8.py +0 -0
  410. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/freeze.py +0 -0
  411. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/fsdp.py +0 -0
  412. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  413. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/galore.py +0 -0
  414. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/gpu.py +0 -0
  415. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/gpu_monitor.py +0 -0
  416. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/grace_codebook.py +0 -0
  417. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/graceful_save.py +0 -0
  418. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/grad_accum.py +0 -0
  419. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  420. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/grpo_long_context.py +0 -0
  421. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/grpo_variants.py +0 -0
  422. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/hardware_fit.py +0 -0
  423. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/harm_probe.py +0 -0
  424. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/hf.py +0 -0
  425. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/hf_space.py +0 -0
  426. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/hubs.py +0 -0
  427. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ingest_sources.py +0 -0
  428. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/integrations.py +0 -0
  429. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/interference.py +0 -0
  430. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/interference_live.py +0 -0
  431. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/irt.py +0 -0
  432. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/iterative_dpo.py +0 -0
  433. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  434. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/kernel_picker.py +0 -0
  435. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/knowledge_edit.py +0 -0
  436. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/kv_cache.py +0 -0
  437. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/launcher.py +0 -0
  438. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/license_advisor.py +0 -0
  439. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/liger.py +0 -0
  440. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/live_eval.py +0 -0
  441. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/llama_proxy.py +0 -0
  442. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/llama_server_timings.py +0 -0
  443. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/local_rl.py +0 -0
  444. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  445. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loftq_init.py +0 -0
  446. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/log_level.py +0 -0
  447. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/long_context.py +0 -0
  448. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/longlora.py +0 -0
  449. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loop_budget.py +0 -0
  450. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loop_daemon.py +0 -0
  451. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loop_iteration.py +0 -0
  452. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/loop_state.py +0 -0
  453. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/lr_finder.py +0 -0
  454. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/lr_groups.py +0 -0
  455. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/magpie.py +0 -0
  456. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/metrics.py +0 -0
  457. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mii.py +0 -0
  458. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/minillm.py +0 -0
  459. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mix_proxy.py +0 -0
  460. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mixed_precision.py +0 -0
  461. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mlx.py +0 -0
  462. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/moe.py +0 -0
  463. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/moe_quant.py +0 -0
  464. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/mole_routing.py +0 -0
  465. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/multipack.py +0 -0
  466. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/multipack_sampler.py +0 -0
  467. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/multipack_trainer.py +0 -0
  468. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/neat_packing.py +0 -0
  469. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ngram_spec.py +0 -0
  470. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/nlg_metrics.py +0 -0
  471. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/onboarding.py +0 -0
  472. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  473. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/paths.py +0 -0
  474. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/peft_builder.py +0 -0
  475. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/peft_patches.py +0 -0
  476. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/peft_wiring.py +0 -0
  477. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/persona_hub.py +0 -0
  478. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/pipeline.py +0 -0
  479. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/prm.py +0 -0
  480. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/probe_kernel.py +0 -0
  481. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/probe_pack.py +0 -0
  482. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/profiler.py +0 -0
  483. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/profiling.py +0 -0
  484. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  485. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/prompt_compile.py +0 -0
  486. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/prompt_distill.py +0 -0
  487. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/prune_prompt.py +0 -0
  488. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/qat.py +0 -0
  489. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/qr_url.py +0 -0
  490. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/quality.py +0 -0
  491. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/quant_menu.py +0 -0
  492. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ra_dit.py +0 -0
  493. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ra_dit_run.py +0 -0
  494. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/raft.py +0 -0
  495. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/reasoning_effort.py +0 -0
  496. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/reasoning_parser.py +0 -0
  497. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/recipe_dag.py +0 -0
  498. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/recipe_run.py +0 -0
  499. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/relora.py +0 -0
  500. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/replay.py +0 -0
  501. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/repro_receipt.py +0 -0
  502. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/reward_hacking.py +0 -0
  503. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ring_attention.py +0 -0
  504. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  505. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/run_cost.py +0 -0
  506. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/sae_diff.py +0 -0
  507. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/save_formats.py +0 -0
  508. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/server_tools.py +0 -0
  509. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ship_verdict.py +0 -0
  510. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/shortcuts.py +0 -0
  511. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/signing.py +0 -0
  512. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/sleeper_probe.py +0 -0
  513. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/soup_lock.py +0 -0
  514. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/spec_pairing.py +0 -0
  515. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/spectrum_scan.py +0 -0
  516. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/spike_recovery.py +0 -0
  517. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/sse_train_stream.py +0 -0
  518. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/steering.py +0 -0
  519. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/strict_safetensors.py +0 -0
  520. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/structured_output.py +0 -0
  521. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/sweep_config.py +0 -0
  522. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tail_latency.py +0 -0
  523. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tool_outputs.py +0 -0
  524. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/topology.py +0 -0
  525. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tracing.py +0 -0
  526. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/trackers.py +0 -0
  527. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/train_event_buffer.py +0 -0
  528. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/trainer_plugins.py +0 -0
  529. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/trust_remote.py +0 -0
  530. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/truth_probe.py +0 -0
  531. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tts.py +0 -0
  532. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tts_codec.py +0 -0
  533. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/tunability.py +0 -0
  534. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/ui_env.py +0 -0
  535. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/uld.py +0 -0
  536. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  537. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/unlearning.py +0 -0
  538. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/unlearning_eval.py +0 -0
  539. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/unsloth.py +0 -0
  540. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/v028_features.py +0 -0
  541. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/vector_bank.py +0 -0
  542. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/vllm.py +0 -0
  543. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/vscode_setup.py +0 -0
  544. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/warmup.py +0 -0
  545. {soup_cli-0.71.26 → soup_cli-0.71.27}/src/soup_cli/utils/why.py +0 -0
  546. {soup_cli-0.71.26 → soup_cli-0.71.27}/templates/chat.yaml +0 -0
  547. {soup_cli-0.71.26 → soup_cli-0.71.27}/templates/code.yaml +0 -0
  548. {soup_cli-0.71.26 → soup_cli-0.71.27}/templates/medical.yaml +0 -0
  549. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/__init__.py +0 -0
  550. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/conftest.py +0 -0
  551. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/qa/v053_qa.md +0 -0
  552. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/qa/v07114_qa.md +0 -0
  553. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/qa/v0716_qa.md +0 -0
  554. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_adapters.py +0 -0
  555. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_advanced_peft.py +0 -0
  556. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_assistant_mask.py +0 -0
  557. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_audio.py +0 -0
  558. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_auto_tuning.py +0 -0
  559. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_autopilot.py +0 -0
  560. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_awq_gptq_export.py +0 -0
  561. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_batch_probe.py +0 -0
  562. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_bco.py +0 -0
  563. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_bench.py +0 -0
  564. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_brain_rot_multilingual.py +0 -0
  565. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_bugfixes.py +0 -0
  566. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_build_dag.py +0 -0
  567. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_callback.py +0 -0
  568. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_cans.py +0 -0
  569. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_chat.py +0 -0
  570. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_chat_template.py +0 -0
  571. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_cli.py +0 -0
  572. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_cli_subprocess.py +0 -0
  573. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_config.py +0 -0
  574. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_cost.py +0 -0
  575. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_crash_reporter.py +0 -0
  576. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_curriculum.py +0 -0
  577. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_data.py +0 -0
  578. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_data_augment.py +0 -0
  579. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_data_sample.py +0 -0
  580. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_data_split.py +0 -0
  581. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_data_tools.py +0 -0
  582. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_dataset_hub.py +0 -0
  583. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_dataset_registry.py +0 -0
  584. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_deepspeed.py +0 -0
  585. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_deploy_ollama.py +0 -0
  586. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_diff.py +0 -0
  587. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_display.py +0 -0
  588. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_doctor.py +0 -0
  589. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_dpo_example.py +0 -0
  590. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_dpo_variants.py +0 -0
  591. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_embedding.py +0 -0
  592. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_errors.py +0 -0
  593. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_eval.py +0 -0
  594. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_eval_platform.py +0 -0
  595. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_export.py +0 -0
  596. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_formats.py +0 -0
  597. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_fp8_recipe.py +0 -0
  598. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_freeze_training.py +0 -0
  599. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_generate.py +0 -0
  600. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_gpu.py +0 -0
  601. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_grpo.py +0 -0
  602. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_hf_integration.py +0 -0
  603. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_infer.py +0 -0
  604. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_inference_advanced.py +0 -0
  605. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_init.py +0 -0
  606. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ipo.py +0 -0
  607. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_jinja_analyzer.py +0 -0
  608. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_kto.py +0 -0
  609. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_loader.py +0 -0
  610. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_log_level.py +0 -0
  611. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_loss_watchdog.py +0 -0
  612. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_merge.py +0 -0
  613. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_migrate.py +0 -0
  614. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_mlx_backend.py +0 -0
  615. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_moe.py +0 -0
  616. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_multi_adapter.py +0 -0
  617. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_multi_gpu.py +0 -0
  618. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_multipack_config.py +0 -0
  619. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_multipack_invariants.py +0 -0
  620. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_multipack_sampler.py +0 -0
  621. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_neat_packing.py +0 -0
  622. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_neftune_rslora.py +0 -0
  623. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_onnx_tensorrt_export.py +0 -0
  624. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_orpo.py +0 -0
  625. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_packing.py +0 -0
  626. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_a_wave2.py +0 -0
  627. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_b.py +0 -0
  628. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_c.py +0 -0
  629. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_d.py +0 -0
  630. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_e.py +0 -0
  631. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_part_f_hardening.py +0 -0
  632. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_peft_methods.py +0 -0
  633. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_peft_patches.py +0 -0
  634. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_performance.py +0 -0
  635. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_pissa_init.py +0 -0
  636. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ppo.py +0 -0
  637. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_preference_dispatcher.py +0 -0
  638. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_preference_multi.py +0 -0
  639. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_preference_multi_runtime.py +0 -0
  640. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_pretrain.py +0 -0
  641. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_profile.py +0 -0
  642. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_profiling.py +0 -0
  643. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_progress.py +0 -0
  644. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_push.py +0 -0
  645. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_qat.py +0 -0
  646. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_quality_filter.py +0 -0
  647. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_quant_check.py +0 -0
  648. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_quant_menu.py +0 -0
  649. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_quickstart.py +0 -0
  650. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_rank_pattern.py +0 -0
  651. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_recipes.py +0 -0
  652. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_recipes_v031.py +0 -0
  653. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_refusal_multilingual.py +0 -0
  654. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_registry.py +0 -0
  655. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_relora.py +0 -0
  656. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_replay.py +0 -0
  657. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_resume.py +0 -0
  658. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_rlvr.py +0 -0
  659. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_run_cost.py +0 -0
  660. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_runs.py +0 -0
  661. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_serve.py +0 -0
  662. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_server_generate.py +0 -0
  663. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_sglang_serve.py +0 -0
  664. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_simpo.py +0 -0
  665. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_smoke_train.py +0 -0
  666. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_speculative_decoding.py +0 -0
  667. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_sweep.py +0 -0
  668. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_synth_data_pro.py +0 -0
  669. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_templates_yaml.py +0 -0
  670. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_tensorboard.py +0 -0
  671. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_tool_calling.py +0 -0
  672. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_trace_to_pref.py +0 -0
  673. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_tracker.py +0 -0
  674. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_trainer_coverage_v035.py +0 -0
  675. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_training_intelligence.py +0 -0
  676. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_training_speed.py +0 -0
  677. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_trust_remote_code.py +0 -0
  678. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_tui.py +0 -0
  679. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ui.py +0 -0
  680. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ui_chat.py +0 -0
  681. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ui_config_builder.py +0 -0
  682. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ui_live_monitor.py +0 -0
  683. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_ui_metrics.py +0 -0
  684. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_unsloth.py +0 -0
  685. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0401_part_c.py +0 -0
  686. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0401_part_d.py +0 -0
  687. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0401_part_e.py +0 -0
  688. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0402_part_a.py +0 -0
  689. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0402_part_b.py +0 -0
  690. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0403_part_a.py +0 -0
  691. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0403_part_b.py +0 -0
  692. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0403_part_c.py +0 -0
  693. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0404_part_a.py +0 -0
  694. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0404_part_b.py +0 -0
  695. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0405_part_a.py +0 -0
  696. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0406_part_a.py +0 -0
  697. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0410_part_a.py +0 -0
  698. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0410_part_b.py +0 -0
  699. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0410_part_c.py +0 -0
  700. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0420.py +0 -0
  701. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0430_part_a.py +0 -0
  702. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0430_part_b.py +0 -0
  703. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0430_part_c.py +0 -0
  704. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0430_part_d.py +0 -0
  705. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0440_part_a.py +0 -0
  706. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0440_part_b.py +0 -0
  707. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0440_part_c.py +0 -0
  708. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0440_part_d.py +0 -0
  709. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0440_review_followups.py +0 -0
  710. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0450.py +0 -0
  711. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0460_part_a.py +0 -0
  712. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0460_part_b.py +0 -0
  713. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0470_part_a.py +0 -0
  714. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0470_part_b.py +0 -0
  715. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0480_part_a.py +0 -0
  716. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0480_part_b.py +0 -0
  717. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0490.py +0 -0
  718. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0500_part_a.py +0 -0
  719. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0500_part_b.py +0 -0
  720. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0500_part_c.py +0 -0
  721. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0500_part_d.py +0 -0
  722. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0500_part_e.py +0 -0
  723. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0510.py +0 -0
  724. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0520.py +0 -0
  725. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0530.py +0 -0
  726. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v05310.py +0 -0
  727. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v05311.py +0 -0
  728. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0531_109.py +0 -0
  729. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0531_139.py +0 -0
  730. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0531_142.py +0 -0
  731. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0531_82.py +0 -0
  732. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0532.py +0 -0
  733. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0533.py +0 -0
  734. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0534.py +0 -0
  735. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0535.py +0 -0
  736. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0536.py +0 -0
  737. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0537.py +0 -0
  738. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0538.py +0 -0
  739. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0539.py +0 -0
  740. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0540.py +0 -0
  741. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0550.py +0 -0
  742. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0550_followups.py +0 -0
  743. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0570_part_a.py +0 -0
  744. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0570_part_b.py +0 -0
  745. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0570_part_c.py +0 -0
  746. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0570_part_d.py +0 -0
  747. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0580.py +0 -0
  748. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0590.py +0 -0
  749. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_a.py +0 -0
  750. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_b.py +0 -0
  751. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_c.py +0 -0
  752. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_d.py +0 -0
  753. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_e.py +0 -0
  754. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0600_part_f.py +0 -0
  755. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0610_part_a.py +0 -0
  756. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0610_part_b.py +0 -0
  757. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0610_part_c.py +0 -0
  758. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0610_part_d.py +0 -0
  759. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0610_part_e.py +0 -0
  760. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_followups.py +0 -0
  761. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_part_a.py +0 -0
  762. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_part_b.py +0 -0
  763. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_part_c.py +0 -0
  764. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_part_d.py +0 -0
  765. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0620_part_e.py +0 -0
  766. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_followups.py +0 -0
  767. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_part_a.py +0 -0
  768. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_part_b.py +0 -0
  769. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_part_c.py +0 -0
  770. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_part_d.py +0 -0
  771. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0630_part_e.py +0 -0
  772. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0631_206.py +0 -0
  773. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_followups.py +0 -0
  774. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_a.py +0 -0
  775. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_b.py +0 -0
  776. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_c.py +0 -0
  777. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_d.py +0 -0
  778. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_e.py +0 -0
  779. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0640_part_f.py +0 -0
  780. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_followups.py +0 -0
  781. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_part_a.py +0 -0
  782. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_part_b.py +0 -0
  783. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_part_c.py +0 -0
  784. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_part_d.py +0 -0
  785. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0650_part_e.py +0 -0
  786. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_cli.py +0 -0
  787. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_followups.py +0 -0
  788. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_part_a.py +0 -0
  789. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_part_b.py +0 -0
  790. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_part_c.py +0 -0
  791. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_part_d.py +0 -0
  792. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0660_part_e.py +0 -0
  793. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_followups.py +0 -0
  794. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_a.py +0 -0
  795. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_b.py +0 -0
  796. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_c.py +0 -0
  797. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_d.py +0 -0
  798. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_e.py +0 -0
  799. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0670_part_f.py +0 -0
  800. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_followups.py +0 -0
  801. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_part_a.py +0 -0
  802. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_part_b.py +0 -0
  803. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_part_c.py +0 -0
  804. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_part_d.py +0 -0
  805. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0680_part_e.py +0 -0
  806. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0690_part_a.py +0 -0
  807. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0690_part_b.py +0 -0
  808. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0690_part_c.py +0 -0
  809. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0690_part_d.py +0 -0
  810. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0690_part_e.py +0 -0
  811. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_a.py +0 -0
  812. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_b.py +0 -0
  813. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_c.py +0 -0
  814. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_d.py +0 -0
  815. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_e.py +0 -0
  816. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0700_part_f.py +0 -0
  817. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07110.py +0 -0
  818. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07111.py +0 -0
  819. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07112.py +0 -0
  820. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07113.py +0 -0
  821. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07114.py +0 -0
  822. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07115.py +0 -0
  823. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07116.py +0 -0
  824. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07117.py +0 -0
  825. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07118.py +0 -0
  826. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07119.py +0 -0
  827. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0712.py +0 -0
  828. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07120.py +0 -0
  829. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07121.py +0 -0
  830. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07122.py +0 -0
  831. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07123.py +0 -0
  832. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07124.py +0 -0
  833. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v07125.py +0 -0
  834. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0713.py +0 -0
  835. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0714.py +0 -0
  836. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0715.py +0 -0
  837. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0716.py +0 -0
  838. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0717.py +0 -0
  839. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0718.py +0 -0
  840. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_v0719.py +0 -0
  841. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_validator.py +0 -0
  842. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_vision.py +0 -0
  843. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_vllm_serve.py +0 -0
  844. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_warmup.py +0 -0
  845. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_why.py +0 -0
  846. {soup_cli-0.71.26 → soup_cli-0.71.27}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,82 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.27] - 2026-07-03
16
+
17
+ ### Added
18
+ - **Fine-tune Doctor** — kill the top *silent* fine-tune failures before a
19
+ single training step; no competitor (Unsloth/Axolotl/LlamaFactory) ships
20
+ any of these three:
21
+ - `soup data doctor <data> --model <id|path>` — chat-template
22
+ compatibility report over 8 checks: `chat_template` present,
23
+ `template_render`s cleanly, has `{% generation %}` markers,
24
+ `eos_in_labels` (the **#1 "model never stops generating" bug** — every
25
+ assistant turn's trained span must actually contain an EOS/EOT token;
26
+ checks every turn, not just the last), `bos_duplication` (template +
27
+ tokenizer both prepending BOS), `system_role` support (Mistral-style
28
+ templates reject a leading system turn), `unknown_roles`, and
29
+ `truncation_risk` (p95 rendered length vs `max_length`). Same OK / MINOR
30
+ / MAJOR taxonomy as `soup diagnose`; exit 0 = OK/MINOR, exit 2 = MAJOR.
31
+ `--train-on-responses-only` / `--train-on-messages-with-train-field`
32
+ select the same masking strategy `soup train` would use, so the report
33
+ and `--show-mask` never disagree about what's actually trained.
34
+ - `soup data doctor ... --show-mask N` — render N sample rows with
35
+ per-token trained/masked colouring through the REAL collator path
36
+ (answer-only / per-message-train-field / RAFT span-mask) — not a
37
+ reimplementation — so an assistant-mask bug is visible instantly.
38
+ - `soup data lint <data>` — preference-data linter for
39
+ dpo/orpo/simpo/ipo/bco/kto: `length_bias` (chosen systematically longer
40
+ than rejected — the **#1 silent DPO degradation**, reported as a
41
+ Cohen's d effect size), `label_imbalance` (KTO desirable:undesirable
42
+ ratio), `near_duplicates` (MinHash/LSH, reuses the `soup data dedup`
43
+ kernel), `identical_pairs` (chosen == rejected — zero preference
44
+ signal), and `prompt_leak` (the prompt echoed verbatim inside the
45
+ completion — a common synthetic-data pipeline bug). Optional `--model`
46
+ for exact token-length bias (default: word count).
47
+ - Validated live against the real `HuggingFaceTB/SmolLM2-135M-Instruct`
48
+ tokenizer on Windows + RTX 3050 — this smoke pass found and fixed two
49
+ genuine bugs beyond what synthetic fixtures alone caught: an EOS check
50
+ that required the EOS token to be the *literal last* trained token
51
+ (real templates often have a trailing formatting token after the
52
+ closing tag that stays inside the trained span), and two call sites
53
+ that only caught `(ValueError, TypeError)` around a tokenizer's
54
+ `apply_chat_template` when a real Jinja `raise_exception()`
55
+ (Mistral-style no-system-role guard) raises
56
+ `jinja2.exceptions.TemplateError`.
57
+
58
+ ### Fixed
59
+ - Harden `commands/diagnose.py`'s `--evidence` loader against a TOCTOU
60
+ symlink swap: opens with `O_NOFOLLOW` and size-checks the open fd via
61
+ `os.fstat` instead of `os.path.getsize` on the path before the open —
62
+ backports the hardened loader shipped for `soup ship` in v0.71.25 (closes
63
+ v0.71.25 known-limitation (4)).
64
+ - Harden judge-model URL validation against a hostname prefix bypass
65
+ (`http://localhost.attacker.com`) — `GateTask._valid_judge_url` /
66
+ `_parse_judge_url` now use `urllib.parse.urlparse` + hostname checks instead
67
+ of `startswith`. Closes #283
68
+ ([#288](https://github.com/MakazhanAlpamys/Soup/pull/288) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
69
+ - `SFTTrainerWrapper` now applies configured vocabulary expansion
70
+ (`data.add_new_tokens` / `data.new_special_tokens`) and resizes the model
71
+ embeddings during initialization — previously these fields were accepted by
72
+ the schema but silently ignored. Closes #289
73
+ ([#287](https://github.com/MakazhanAlpamys/Soup/pull/287) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
74
+ - Vision and audio SFT paths now apply that same configured vocabulary
75
+ expansion (`data.add_new_tokens` / `data.new_special_tokens`) via the shared
76
+ `apply_vocab_expansion()` helper, consistent with the text SFT path — they
77
+ previously ignored it. Closes #290
78
+ ([#291](https://github.com/MakazhanAlpamys/Soup/pull/291) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
79
+
80
+ ### Security
81
+ - `soup data doctor` strips C0 control characters (keeping tab/newline/CR)
82
+ from dataset-derived content before it reaches the terminal — Rich's
83
+ `markup.escape()` only neutralises `[...]` tag syntax, not raw escape
84
+ sequences, so an untrusted training row (e.g. an unknown `role` field, or
85
+ `--show-mask`'s decoded token text on a byte-level BPE tokenizer) could
86
+ otherwise carry a literal ESC byte through to the terminal (title-bar /
87
+ OSC-8 link spoofing, or obscuring a MAJOR verdict via cursor tricks).
88
+ `--output` JSON is unaffected (`json.dumps` already escapes control
89
+ characters).
90
+
15
91
  ## [0.71.26] - 2026-07-01
16
92
 
17
93
  ### Added
@@ -116,11 +116,11 @@ src/soup_cli/
116
116
  cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)
117
117
  data/traces/ - Trace-to-Preference harvester (v0.26.0)
118
118
  data/collators.py - CrossDocCollator for sample packing (v0.33.0)
119
- utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict
119
+ utils/ - GPU, errors, MoE, GaLore, QAT, Unsloth, vLLM, SGLang, Liger, FlashAttn, FSDP, Ring Attention, long-context, quality, curriculum, freeze, dataset-registry, mlx, peft_builder, paths, topology, launcher, mii, pipeline, cut_ce, fp8, gradient_ckpt, kernel_picker, cross_doc_attn, activation_offload, hf, spec_pairing, structured_output, metrics, tracing, auto_quant, lr_finder, grad_accum, mixed_precision, warmup, spike_recovery, convergence, v028_features, multipack_sampler, multipack, neat_packing, jinja_analyzer, quant_menu, relora, peft_patches, peft_wiring, dpo_variants, optimizer_zoo, lr_groups, loftq_init, block_expansion, tts, classifier, distill, bitnet, ebft_gdpo, moe_quant, reasoning_effort, gguf_quant, kv_cache, advanced_precision, save_formats, deploy_measure, advise, advise_history, adapter_diff, adapter_merge, blame, adapter_branch, unlearning, unlearning_eval, knowledge_edit, edit_governor, edit_diff, ra_dit, steering, citation_faithful, grace_codebook, ingest_sources, prune_prompt, active_sampler, ab_test, drift_alarm, tunability, terraform_plan, env_lock, hardware_fit, completions, license_advisor, behavior_battery, capability_suite, checklist_dsl, irt, sae_diff, sleeper_probe, interference, probe_pack, cmaes_merge, vector_bank, mole_routing, adapter_pr, soup_lock, adapter_bisect, prompt_compile, prompt_distill, compile_tools, apple_adapter, local_rl, build_dag, expectations, magpie, persona_hub, brain_rot, reward_hacking, uld, minillm, rl_checkpoint, iterative_dpo, echo_trap, mod, local_rl_scheduler, spectrum_scan, ship_verdict, reward_hack_control, data_doctor, data_lint
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 (298 files, 14788 tests)
123
+ tests/ - Test suite (304 files, 15042 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -150,7 +150,7 @@ pytest tests/test_data.py::test_detect_alpaca_format -v
150
150
  pytest tests/ --cov=soup_cli --cov-report=html
151
151
  ```
152
152
 
153
- ### Test Files (297 files)
153
+ ### Test Files (304 files)
154
154
 
155
155
  > A representative sample of the suite below. The full table lives in
156
156
  > [`.claude/CLAUDE.md`](.claude/CLAUDE.md); run `pytest tests/ -v` for the complete list.
@@ -44,6 +44,10 @@ Listed by first contribution. PR numbers link the work.
44
44
  - Unit tests for the `warmup.py` auto-warmup-steps helper ([#274](https://github.com/MakazhanAlpamys/Soup/pull/274))
45
45
  - **Kondamwar Akshaya Shrikant** ([@Akshaya-reddy18](https://github.com/Akshaya-reddy18))
46
46
  - Friendlier error messages — richer CUDA-OOM hint + Hugging Face gated-repo and `trust_remote_code` mappings + tests ([#282](https://github.com/MakazhanAlpamys/Soup/pull/282))
47
+ - **Darsh** ([@CODING-DARSH](https://github.com/CODING-DARSH))
48
+ - Harden judge-URL validation against hostname prefix bypass (`startswith` → `urlparse`) in `eval/gate.py` ([#288](https://github.com/MakazhanAlpamys/Soup/pull/288))
49
+ - Apply configured vocabulary expansion (`data.add_new_tokens` / `new_special_tokens`) during SFT trainer init ([#287](https://github.com/MakazhanAlpamys/Soup/pull/287))
50
+ - Reuse the shared vocab-expansion helper in the vision + audio SFT paths ([#291](https://github.com/MakazhanAlpamys/Soup/pull/291))
47
51
 
48
52
  ---
49
53
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.26
3
+ Version: 0.71.27
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
@@ -189,21 +189,25 @@ infrastructure instead of improving models. Soup fixes that.
189
189
 
190
190
  ## What's New
191
191
 
192
- **v0.71.26Closed-loop reward-hacking auto-mitigation.** Your GRPO/PPO trainer now *detects* reward hacking mid-run and *self-corrects* instead of only halting. No OSS RLHF library closes this loop.
193
-
194
- - **Detect correct continue.** When the hacking signal trips, the controller raises the
195
- KL coefficient β (bang-bang + hysteresis, or a PID-Lagrangian controller), and if hacking
196
- persists **rolls back to the last-good checkpoint**, then early-stops as a last resort.
197
- - **Anti-gaming hardening.** Multi-signal voting (RM cluster-separation + length-trend +
198
- repetition), signal smoothing, conservative-on-disagreement, a reward-distribution-drift
199
- guard, and optional bounded **reward shaping** on the gamed proxy.
200
- - **Observe first.** `reward_hack_mitigation=log_only` streams a per-step `mitigation_log.jsonl`
201
- and never touches training see the hacking happen before you let the controller act.
202
- - **Honest scope.** Proof-of-mechanism on SmolLM2-135M + a synthetic hacking task on one RTX
203
- 3050 (all four stages validated live, including a real rollback). PPO ships BETA.
192
+ **v0.71.27Fine-tune Doctor: catch silent failures before they burn a training run.** `soup data doctor` and `soup data lint` no competitor (Unsloth/Axolotl/LlamaFactory) ships either.
193
+
194
+ - **The #1 "model never stops generating" bug, caught pre-flight.** `soup data doctor` checks
195
+ whether every trained turn actually contains an EOS token plus BOS duplication,
196
+ no-system-role templates, unknown roles, and truncation risk before you burn GPU hours on
197
+ a broken chat template.
198
+ - **See exactly what's trained, token by token.** `--show-mask N` renders sample rows through
199
+ the REAL collator path (answer-only / RAFT / packing-aware), so an assistant-mask bug is
200
+ visible instantly instead of silently degrading the whole run.
201
+ - **Stop silently-worse DPO runs.** `soup data lint` flags length bias (the #1 silent
202
+ preference-tuning degradation, reported as an effect size), near-duplicate pairs,
203
+ chosen==rejected rows, and prompt leakage across dpo/orpo/simpo/ipo/bco/kto data.
204
+ - **Found real bugs on a real tokenizer.** Live-validated against
205
+ `HuggingFaceTB/SmolLM2-135M-Instruct` on Windows + RTX 3050 — the smoke pass itself caught
206
+ two genuine template-handling bugs before release.
204
207
 
205
208
  ```bash
206
- soup train --config grpo.yaml --reward-hack-mitigation kl_control # detect → raise KL → recover
209
+ soup data doctor train.jsonl --model meta-llama/Llama-3.1-8B-Instruct --show-mask 3
210
+ soup data lint prefs.jsonl --model meta-llama/Llama-3.1-8B-Instruct
207
211
  ```
208
212
 
209
213
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@@ -49,21 +49,25 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.26Closed-loop reward-hacking auto-mitigation.** Your GRPO/PPO trainer now *detects* reward hacking mid-run and *self-corrects* instead of only halting. No OSS RLHF library closes this loop.
53
-
54
- - **Detect correct continue.** When the hacking signal trips, the controller raises the
55
- KL coefficient β (bang-bang + hysteresis, or a PID-Lagrangian controller), and if hacking
56
- persists **rolls back to the last-good checkpoint**, then early-stops as a last resort.
57
- - **Anti-gaming hardening.** Multi-signal voting (RM cluster-separation + length-trend +
58
- repetition), signal smoothing, conservative-on-disagreement, a reward-distribution-drift
59
- guard, and optional bounded **reward shaping** on the gamed proxy.
60
- - **Observe first.** `reward_hack_mitigation=log_only` streams a per-step `mitigation_log.jsonl`
61
- and never touches training see the hacking happen before you let the controller act.
62
- - **Honest scope.** Proof-of-mechanism on SmolLM2-135M + a synthetic hacking task on one RTX
63
- 3050 (all four stages validated live, including a real rollback). PPO ships BETA.
52
+ **v0.71.27Fine-tune Doctor: catch silent failures before they burn a training run.** `soup data doctor` and `soup data lint` no competitor (Unsloth/Axolotl/LlamaFactory) ships either.
53
+
54
+ - **The #1 "model never stops generating" bug, caught pre-flight.** `soup data doctor` checks
55
+ whether every trained turn actually contains an EOS token plus BOS duplication,
56
+ no-system-role templates, unknown roles, and truncation risk before you burn GPU hours on
57
+ a broken chat template.
58
+ - **See exactly what's trained, token by token.** `--show-mask N` renders sample rows through
59
+ the REAL collator path (answer-only / RAFT / packing-aware), so an assistant-mask bug is
60
+ visible instantly instead of silently degrading the whole run.
61
+ - **Stop silently-worse DPO runs.** `soup data lint` flags length bias (the #1 silent
62
+ preference-tuning degradation, reported as an effect size), near-duplicate pairs,
63
+ chosen==rejected rows, and prompt leakage across dpo/orpo/simpo/ipo/bco/kto data.
64
+ - **Found real bugs on a real tokenizer.** Live-validated against
65
+ `HuggingFaceTB/SmolLM2-135M-Instruct` on Windows + RTX 3050 — the smoke pass itself caught
66
+ two genuine template-handling bugs before release.
64
67
 
65
68
  ```bash
66
- soup train --config grpo.yaml --reward-hack-mitigation kl_control # detect → raise KL → recover
69
+ soup data doctor train.jsonl --model meta-llama/Llama-3.1-8B-Instruct --show-mask 3
70
+ soup data lint prefs.jsonl --model meta-llama/Llama-3.1-8B-Instruct
67
71
  ```
68
72
 
69
73
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
@@ -68,6 +68,9 @@ soup sweep --config soup.yaml --param lr=... Hyperparameter search
68
68
  soup diff --model-a ./a --model-b ./b Compare two models
69
69
  soup data inspect <path> View dataset stats
70
70
  soup data validate <path> Check format (auto-detect)
71
+ soup data doctor <path> --model <id> Chat-template compat report: 8 checks, OK/MINOR/MAJOR
72
+ soup data doctor <path> --model <id> --show-mask N Per-token trained/masked colouring via the real collator
73
+ soup data lint <path> Preference-data linter: length bias, near-dups, chosen==rejected
71
74
  soup data convert <path> --to chatml Convert between formats
72
75
  soup data merge data1.jsonl data2.jsonl Combine datasets
73
76
  soup data dedup <path> --threshold 0.8 Remove duplicates (MinHash)
@@ -81,7 +84,8 @@ soup data generate ... --quality-pipeline Auto validate + filter + dedup
81
84
  soup data augment <path> --strategy rephrase|translate|style [--provider ollama|vllm --model <m> --base-url <url>] LLM-driven augmentation
82
85
  soup data from-traces --logs l.jsonl --format langchain --signal thumbs_up --output p.jsonl Preference pairs from traces
83
86
  soup data from-traces ... --judge --min-confidence 0.7 LLM-judge confidence filter
84
- soup data review prefs.jsonl --sample 10 Preview preference pairssoup data filter <path> --coherence 0.3 Quality filter (perplexity/coherence)
87
+ soup data review prefs.jsonl --sample 10 Preview preference pairs
88
+ soup data filter <path> --coherence 0.3 Quality filter (perplexity/coherence)
85
89
  soup data sample <path> --n 1000 Random sample subset
86
90
  soup data sample <path> --n 1000 --strategy diverse Cluster-based diverse sampling
87
91
  soup data sample <path> --n 1000 --strategy hard Sample hardest examples
@@ -637,3 +637,49 @@ written per node; resume rehydrates from per-node sidecars. Failed rows logged w
637
637
  redacted reasons (paths stripped, capped at 256 chars).
638
638
 
639
639
 
640
+ ## Fine-tune Doctor (`soup data doctor`)
641
+
642
+ Chat-template compatibility report — catches the top *silent* fine-tuning failures
643
+ before a single training step:
644
+
645
+ ```bash
646
+ soup data doctor ./data/train.jsonl --model meta-llama/Llama-3.1-8B-Instruct
647
+
648
+ # Render N sample rows with per-token trained/masked colouring, through the REAL
649
+ # collator path (answer-only / per-message-train-field / RAFT span-mask)
650
+ soup data doctor ./data/train.jsonl --model meta-llama/Llama-3.1-8B-Instruct --show-mask 5
651
+ ```
652
+
653
+ Eight checks, same OK/MINOR/MAJOR taxonomy as `soup diagnose` (exit 0 on OK/MINOR,
654
+ exit 2 on MAJOR): `chat_template` (tokenizer has one), `template_render` (renders
655
+ cleanly on a sample), `generation_markers` (`{% generation %}` support),
656
+ `eos_in_labels` — the **#1 "model never stops generating" bug**: every trained
657
+ assistant turn must actually contain an EOS/EOT token, checked across the *whole*
658
+ trained span, not just the last turn — `bos_duplication` (template + tokenizer both
659
+ prepending BOS), `system_role` (Mistral-style templates that reject a leading system
660
+ turn), `unknown_roles`, and `truncation_risk` (p95 rendered length vs
661
+ `data.max_length`). `--train-on-responses-only` / `--train-on-messages-with-train-field`
662
+ select the same masking strategy `soup train` would use, so the report and
663
+ `--show-mask` preview can never disagree about what's actually trained.
664
+
665
+
666
+ ## Preference-Data Linter (`soup data lint`)
667
+
668
+ Catches the top silent degradations in DPO/ORPO/SimPO/IPO/BCO/KTO preference data:
669
+
670
+ ```bash
671
+ soup data lint ./data/prefs.jsonl
672
+ soup data lint ./data/prefs.jsonl --model meta-llama/Llama-3.1-8B-Instruct # exact token-length bias, not word count
673
+ ```
674
+
675
+ Five checks: `length_bias` — the **#1 silent DPO degradation**: `chosen`
676
+ systematically longer than `rejected`, reported as a Cohen's d effect size —
677
+ `label_imbalance` (KTO desirable:undesirable ratio), `near_duplicates`
678
+ (MinHash/LSH, reuses the `soup data dedup` kernel; requires
679
+ `pip install 'soup-cli[data]'`, degrades to an advisory skip otherwise),
680
+ `identical_pairs` (`chosen == rejected` — zero preference signal), and
681
+ `prompt_leak` (the prompt echoed verbatim inside the completion, a common
682
+ synthetic-data pipeline bug). Same OK/MINOR/MAJOR taxonomy and exit codes as
683
+ `soup data doctor`.
684
+
685
+
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.26"
7
+ version = "0.71.27"
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"
@@ -0,0 +1,3 @@
1
+ """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
+
3
+ __version__ = "0.71.27"
@@ -82,6 +82,10 @@ class DeployTarget(BaseModel):
82
82
  raise ValueError("deploy path contains null byte")
83
83
  if value.startswith("/") or value.startswith("\\"):
84
84
  raise ValueError(f"deploy path '{value}' must be relative")
85
+ # Windows drive-absolute (``C:\...`` / ``C:/...``) is absolute too but
86
+ # starts with a letter, so it slipped past the ``/`` / ``\`` check.
87
+ if len(value) >= 2 and value[1] == ":" and value[0].isalpha():
88
+ raise ValueError(f"deploy path '{value}' must be relative")
85
89
  # Normalise separators first, then split — a mixed-separator path
86
90
  # like ``foo/..\\bar`` would otherwise slip past a single-separator
87
91
  # split because ``"..\\bar"`` != ``".."``.
@@ -510,6 +510,13 @@ app.add_typer(
510
510
  help="RA-DIT two-stage orchestrator: retriever -> generator (v0.71.10).",
511
511
  )
512
512
 
513
+ # v0.71.27 — Fine-tune Doctor: chat-template doctor + loss-mask X-ray +
514
+ # preference linter.
515
+ from soup_cli.commands import data_doctor as _data_doctor_cmd # noqa: E402
516
+
517
+ data.app.command(name="doctor")(_data_doctor_cmd.doctor)
518
+ data.app.command(name="lint")(_data_doctor_cmd.lint)
519
+
513
520
 
514
521
  def _rewrite_advise_argv(argv: list) -> list:
515
522
  """Inject `run` between `advise` and a non-subcommand first argument.
@@ -196,7 +196,12 @@ def render_modal_stub(
196
196
  "@app.local_entrypoint()\n"
197
197
  "def main() -> None:\n"
198
198
  " train.remote()\n"
199
- f' print("Training submitted; download checkpoints to {output_dir}")\n'
199
+ # Reference the already-repr()-embedded ``_LOCAL_OUTPUT`` via a runtime
200
+ # f-string in the GENERATED code — no user value is interpolated into
201
+ # the stub source here. (Interpolating raw ``{output_dir}`` was a code-
202
+ # injection hole; ``{output_dir!r}`` alone would still break for a path
203
+ # containing a quote because the repr is nested inside a "..." literal.)
204
+ ' print(f"Training submitted; download checkpoints to {_LOCAL_OUTPUT}")\n'
200
205
  )
201
206
 
202
207
 
@@ -43,7 +43,7 @@ def register(app: typer.Typer, console: Console) -> None:
43
43
  try:
44
44
  rows = load_advise_dataset(data)
45
45
  except (FileNotFoundError, ValueError, TypeError) as exc:
46
- console.print(f"[red]Cannot read dataset:[/] {exc}")
46
+ console.print(f"[red]Cannot read dataset:[/] {escape(str(exc))}")
47
47
  raise typer.Exit(1) from exc
48
48
 
49
49
  try:
@@ -105,7 +105,7 @@ def register(app: typer.Typer, console: Console) -> None:
105
105
  try:
106
106
  rows = load_advise_dataset(data)
107
107
  except (FileNotFoundError, ValueError, TypeError) as exc:
108
- console.print(f"[red]Cannot read dataset:[/] {exc}")
108
+ console.print(f"[red]Cannot read dataset:[/] {escape(str(exc))}")
109
109
  raise typer.Exit(1) from exc
110
110
 
111
111
  try:
@@ -254,6 +254,15 @@ def register(app: typer.Typer, console: Console) -> None:
254
254
  False, "--json-only",
255
255
  help="Suppress Rich output; emit a single JSON verdict line.",
256
256
  ),
257
+ suite: str = typer.Option(
258
+ None, "--suite",
259
+ help=(
260
+ "Locked eval suite (from `soup eval lock`) to validate as a gate "
261
+ "precondition — a missing / unparseable suite BLOCKS the check "
262
+ "(exit 1). cwd-contained. The generated pre-push hook passes "
263
+ "$GATE_SUITE here so the locked suite is actually enforced."
264
+ ),
265
+ ),
257
266
  ) -> None:
258
267
  """Run-vs-run regression check (paired-bootstrap CI).
259
268
 
@@ -265,6 +274,26 @@ def register(app: typer.Typer, console: Console) -> None:
265
274
  """
266
275
  import json as _json
267
276
 
277
+ # The locked suite is a hard precondition when supplied: validate it
278
+ # exists, is under cwd, and parses. Previously the hook wrote $GATE_SUITE
279
+ # but never used it, so a deleted / tampered locked suite silently
280
+ # passed the gate.
281
+ if suite:
282
+ from soup_cli.utils.eval_lock_coverage import load_locked_suite
283
+ from soup_cli.utils.paths import is_under_cwd
284
+
285
+ if not is_under_cwd(suite):
286
+ console.print(f"[red]--suite is outside cwd:[/] {escape(str(suite))}")
287
+ raise typer.Exit(1)
288
+ try:
289
+ load_locked_suite(suite)
290
+ except (FileNotFoundError, ValueError, OSError) as exc:
291
+ console.print(
292
+ f"[red]Locked eval suite invalid — gate blocked:[/] "
293
+ f"{escape(str(exc))}"
294
+ )
295
+ raise typer.Exit(1) from exc
296
+
268
297
  from soup_cli.experiment.tracker import ExperimentTracker
269
298
  from soup_cli.utils.eval_gate_hook import (
270
299
  GateThresholds,
@@ -194,6 +194,11 @@ def bench(
194
194
  start_load = time.time()
195
195
  try:
196
196
  model_obj, tokenizer = _load_model(str(model_path), base, device)
197
+ except typer.Exit:
198
+ # typer.Exit subclasses RuntimeError, so the broad except below would
199
+ # swallow an already-reported CLI exit and mis-print "Failed to load
200
+ # model: 1". Let it propagate unchanged.
201
+ raise
197
202
  except (OSError, ImportError, RuntimeError, ValueError) as exc:
198
203
  console.print(f"[red]Failed to load model:[/] {exc}")
199
204
  raise typer.Exit(1) from exc
@@ -754,11 +754,12 @@ def sample_data(
754
754
  if output is None:
755
755
  out_path = file_path.parent / f"{file_path.stem}_sampled_{strategy}.jsonl"
756
756
  else:
757
+ from soup_cli.utils.paths import is_under_cwd
758
+
757
759
  out_path = Path(output).resolve()
758
- cwd = Path.cwd().resolve()
759
- try:
760
- out_path.relative_to(cwd)
761
- except ValueError:
760
+ # realpath + commonpath (is_under_cwd) — Path.resolve()+relative_to()
761
+ # breaks on Windows 8.3 short names.
762
+ if not is_under_cwd(output):
762
763
  console.print("[red]Output path must be under the current working directory.[/]")
763
764
  raise typer.Exit(1)
764
765
 
@@ -812,6 +813,13 @@ def split_data(
812
813
  console.print("[red]Specify at least one of --val or --test.[/]")
813
814
  raise typer.Exit(1)
814
815
 
816
+ # Reject negatives: a negative val/test slipped past the `>= total` check
817
+ # and produced a negative slice (e.g. --val -10 sent 90 rows to val, 10 to
818
+ # train — a silently inverted split).
819
+ if (val is not None and val < 0) or (test is not None and test < 0):
820
+ console.print("[red]--val and --test must be non-negative.[/]")
821
+ raise typer.Exit(1)
822
+
815
823
  data = load_raw_data(file_path)
816
824
  if not data:
817
825
  console.print("[red]Dataset is empty.[/]")
@@ -1265,25 +1273,23 @@ def download_dataset(
1265
1273
  raise typer.Exit(1)
1266
1274
 
1267
1275
  # Resolve output path
1276
+ from soup_cli.utils.paths import is_under_cwd
1277
+
1268
1278
  if output is None:
1269
1279
  ds_name = dataset_id.split("/")[-1] if "/" in dataset_id else dataset_id
1270
1280
  # Strip embedded path separators to prevent traversal
1271
1281
  ds_name = Path(ds_name).name
1272
1282
  out_path = (Path.cwd() / f"{ds_name}.jsonl").resolve()
1273
- cwd = Path.cwd().resolve()
1274
- try:
1275
- out_path.relative_to(cwd)
1276
- except ValueError:
1283
+ # realpath + commonpath (is_under_cwd) — Path.resolve()+relative_to()
1284
+ # breaks on Windows 8.3 short names.
1285
+ if not is_under_cwd(out_path):
1277
1286
  console.print(
1278
1287
  "[red]Derived output path escapes working directory.[/]"
1279
1288
  )
1280
1289
  raise typer.Exit(1)
1281
1290
  else:
1282
1291
  out_path = Path(output).resolve()
1283
- cwd = Path.cwd().resolve()
1284
- try:
1285
- out_path.relative_to(cwd)
1286
- except ValueError:
1292
+ if not is_under_cwd(output):
1287
1293
  console.print(
1288
1294
  "[red]Output path must be under the current working directory.[/]"
1289
1295
  )