soup-cli 0.71.26__tar.gz → 0.71.28__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 (851) hide show
  1. {soup_cli-0.71.26 → soup_cli-0.71.28}/CHANGELOG.md +105 -0
  2. {soup_cli-0.71.26 → soup_cli-0.71.28}/CONTRIBUTING.md +3 -3
  3. {soup_cli-0.71.26 → soup_cli-0.71.28}/CONTRIBUTORS.md +6 -0
  4. {soup_cli-0.71.26 → soup_cli-0.71.28}/PKG-INFO +24 -16
  5. {soup_cli-0.71.26 → soup_cli-0.71.28}/README.md +19 -15
  6. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/commands.md +40 -1
  7. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/data.md +46 -0
  8. {soup_cli-0.71.26 → soup_cli-0.71.28}/pyproject.toml +7 -3
  9. soup_cli-0.71.28/src/soup_cli/__init__.py +3 -0
  10. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/schema.py +4 -0
  11. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cli.py +17 -0
  12. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cloud/modal.py +6 -1
  13. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0550.py +31 -2
  14. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/bench.py +5 -0
  15. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data.py +18 -12
  16. soup_cli-0.71.28/src/soup_cli/commands/data_doctor.py +337 -0
  17. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/diagnose.py +21 -6
  18. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/eval.py +31 -1
  19. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/export.py +8 -8
  20. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/fetch.py +4 -1
  21. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/generate.py +20 -5
  22. soup_cli-0.71.28/src/soup_cli/commands/mcp.py +62 -0
  23. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/serve.py +38 -7
  24. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/train.py +177 -0
  25. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/formats.py +43 -9
  26. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/loader.py +6 -3
  27. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/parsers.py +4 -1
  28. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/checkpoint_intelligence.py +6 -4
  29. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/custom.py +4 -1
  30. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/gate.py +41 -29
  31. soup_cli-0.71.28/src/soup_cli/mcp_server/__init__.py +9 -0
  32. soup_cli-0.71.28/src/soup_cli/mcp_server/registry.py +924 -0
  33. soup_cli-0.71.28/src/soup_cli/mcp_server/server.py +82 -0
  34. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/common.py +8 -8
  35. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/callback.py +87 -3
  36. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/store.py +39 -8
  37. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/bco.py +7 -0
  38. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/classifier.py +1 -0
  39. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/distill.py +36 -13
  40. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/dpo.py +7 -0
  41. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/embedding.py +1 -0
  42. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/grpo.py +10 -1
  43. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/ipo.py +11 -1
  44. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/kto.py +7 -0
  45. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/orpo.py +7 -0
  46. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/ppo.py +32 -12
  47. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/pretrain.py +1 -0
  48. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/reward_model.py +1 -0
  49. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/sft.py +44 -3
  50. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/simpo.py +7 -0
  51. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/app.py +12 -7
  52. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/active_sampler.py +7 -3
  53. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/block_expansion.py +15 -4
  54. soup_cli-0.71.28/src/soup_cli/utils/data_doctor.py +927 -0
  55. soup_cli-0.71.28/src/soup_cli/utils/data_lint.py +484 -0
  56. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_pipeline.py +47 -0
  57. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deploy_measure.py +26 -1
  58. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_kernels.py +4 -1
  59. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_gate_hook.py +2 -1
  60. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gguf_quant.py +9 -4
  61. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/license_matrix.py +5 -1
  62. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_stages.py +6 -1
  63. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mod.py +140 -16
  64. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/namespace_pin.py +24 -8
  65. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ollama.py +6 -6
  66. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/preference_combine.py +56 -5
  67. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/registry.py +4 -2
  68. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reward_hack_control.py +13 -6
  69. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/rl_checkpoint.py +41 -1
  70. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sglang.py +5 -2
  71. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/terraform_plan.py +17 -2
  72. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/webhooks.py +23 -7
  73. soup_cli-0.71.28/tests/test_code_review_critical.py +334 -0
  74. soup_cli-0.71.28/tests/test_code_review_deferred.py +177 -0
  75. soup_cli-0.71.28/tests/test_code_review_high.py +413 -0
  76. soup_cli-0.71.28/tests/test_code_review_medium_low.py +97 -0
  77. soup_cli-0.71.28/tests/test_code_review_recurring.py +110 -0
  78. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval_gate.py +12 -0
  79. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_a_wave1.py +7 -0
  80. soup_cli-0.71.28/tests/test_trainer_init.py +1230 -0
  81. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0560.py +8 -3
  82. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07126.py +7 -2
  83. soup_cli-0.71.28/tests/test_v07127.py +2190 -0
  84. soup_cli-0.71.28/tests/test_v07128.py +938 -0
  85. soup_cli-0.71.26/src/soup_cli/__init__.py +0 -3
  86. soup_cli-0.71.26/tests/test_trainer_init.py +0 -160
  87. {soup_cli-0.71.26 → soup_cli-0.71.28}/.dockerignore +0 -0
  88. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/FUNDING.yml +0 -0
  89. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  90. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  91. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  92. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/pull_request_template.md +0 -0
  93. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/ci.yml +0 -0
  94. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/docker.yml +0 -0
  95. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/publish.yml +0 -0
  96. {soup_cli-0.71.26 → soup_cli-0.71.28}/.github/workflows/recipe-validation.yml +0 -0
  97. {soup_cli-0.71.26 → soup_cli-0.71.28}/.gitignore +0 -0
  98. {soup_cli-0.71.26 → soup_cli-0.71.28}/.mailmap +0 -0
  99. {soup_cli-0.71.26 → soup_cli-0.71.28}/.pre-commit-config.yaml +0 -0
  100. {soup_cli-0.71.26 → soup_cli-0.71.28}/AGENTS.md +0 -0
  101. {soup_cli-0.71.26 → soup_cli-0.71.28}/CODEOWNERS +0 -0
  102. {soup_cli-0.71.26 → soup_cli-0.71.28}/CODE_OF_CONDUCT.md +0 -0
  103. {soup_cli-0.71.26 → soup_cli-0.71.28}/Dockerfile +0 -0
  104. {soup_cli-0.71.26 → soup_cli-0.71.28}/LICENSE +0 -0
  105. {soup_cli-0.71.26 → soup_cli-0.71.28}/NOTICE +0 -0
  106. {soup_cli-0.71.26 → soup_cli-0.71.28}/SECURITY.md +0 -0
  107. {soup_cli-0.71.26 → soup_cli-0.71.28}/docker-compose.yml +0 -0
  108. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/README.md +0 -0
  109. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/adapters-and-governance.md +0 -0
  110. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/backends-and-ops.md +0 -0
  111. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/evaluation.md +0 -0
  112. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/models.md +0 -0
  113. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/peft-and-efficiency.md +0 -0
  114. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/performance-and-quantization.md +0 -0
  115. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/serving-and-export.md +0 -0
  116. {soup_cli-0.71.26 → soup_cli-0.71.28}/docs/training.md +0 -0
  117. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/README.md +0 -0
  118. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/dpo_chat.yaml +0 -0
  119. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/dpo_example.yaml +0 -0
  120. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/grpo_reasoning.yaml +0 -0
  121. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step1_sft.yaml +0 -0
  122. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step2_reward.yaml +0 -0
  123. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  124. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/sft_basic.yaml +0 -0
  125. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/configs/vision_llama.yaml +0 -0
  126. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/alpaca_tiny.jsonl +0 -0
  127. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/chat_preferences.jsonl +0 -0
  128. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/dpo_sample.jsonl +0 -0
  129. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/data/reasoning_math.jsonl +0 -0
  130. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/reward_hacking/rewards.py +0 -0
  131. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/synthetic_workflow.md +0 -0
  132. {soup_cli-0.71.26 → soup_cli-0.71.28}/examples/synthetic_workflow.yaml +0 -0
  133. {soup_cli-0.71.26 → soup_cli-0.71.28}/soup.png +0 -0
  134. {soup_cli-0.71.26 → soup_cli-0.71.28}/soup_logo_svg.svg +0 -0
  135. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/__main__.py +0 -0
  136. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/__init__.py +0 -0
  137. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/analyzer.py +0 -0
  138. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/decisions.py +0 -0
  139. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/autopilot/generate_config.py +0 -0
  140. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/__init__.py +0 -0
  141. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/pack.py +0 -0
  142. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/publish.py +0 -0
  143. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/run.py +0 -0
  144. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/unpack.py +0 -0
  145. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cans/verify.py +0 -0
  146. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/cloud/__init__.py +0 -0
  147. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/__init__.py +0 -0
  148. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0610.py +0 -0
  149. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v0650.py +0 -0
  150. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_eval_v07110.py +0 -0
  151. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/_webhook_cli.py +0 -0
  152. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ab.py +0 -0
  153. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/active_sample.py +0 -0
  154. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/adapters.py +0 -0
  155. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/advise.py +0 -0
  156. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/agent.py +0 -0
  157. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/airgap.py +0 -0
  158. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/apple_adapter.py +0 -0
  159. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/attest.py +0 -0
  160. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/audit_log.py +0 -0
  161. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/autopilot.py +0 -0
  162. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/bom.py +0 -0
  163. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/build.py +0 -0
  164. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/can.py +0 -0
  165. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/chat.py +0 -0
  166. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/compile_cmd.py +0 -0
  167. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/compile_tools.py +0 -0
  168. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/completions.py +0 -0
  169. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/cost.py +0 -0
  170. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_forge.py +0 -0
  171. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_mix.py +0 -0
  172. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/data_score.py +0 -0
  173. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  174. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/deploy.py +0 -0
  175. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/diff.py +0 -0
  176. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/distill_prompt.py +0 -0
  177. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/doctor.py +0 -0
  178. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/drift_alarm.py +0 -0
  179. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/edit.py +0 -0
  180. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/env.py +0 -0
  181. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/expect.py +0 -0
  182. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/history.py +0 -0
  183. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/infer.py +0 -0
  184. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ingest.py +0 -0
  185. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/init.py +0 -0
  186. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/iterative_dpo.py +0 -0
  187. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/license_advisor.py +0 -0
  188. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/llama.py +0 -0
  189. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/local_rl.py +0 -0
  190. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/lock.py +0 -0
  191. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/loop.py +0 -0
  192. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/merge.py +0 -0
  193. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  194. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/migrate.py +0 -0
  195. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/monitor.py +0 -0
  196. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/plan.py +0 -0
  197. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/plugins.py +0 -0
  198. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/probe.py +0 -0
  199. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/profile.py +0 -0
  200. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/prune_prompt.py +0 -0
  201. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/push.py +0 -0
  202. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/quantize.py +0 -0
  203. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/quickstart.py +0 -0
  204. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ra_dit.py +0 -0
  205. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/recipes.py +0 -0
  206. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/registry.py +0 -0
  207. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/runs.py +0 -0
  208. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ship.py +0 -0
  209. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/spectrum.py +0 -0
  210. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/steer.py +0 -0
  211. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/sweep.py +0 -0
  212. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tokenizer.py +0 -0
  213. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tui.py +0 -0
  214. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/tunability.py +0 -0
  215. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/ui.py +0 -0
  216. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/commands/why.py +0 -0
  217. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/__init__.py +0 -0
  218. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/loader.py +0 -0
  219. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/config/schema.py +0 -0
  220. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/__init__.py +0 -0
  221. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  222. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  223. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  224. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  225. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  226. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  227. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  228. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  229. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  230. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  231. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  232. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  233. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/augment.py +0 -0
  234. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/chat_templates.py +0 -0
  235. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/collators.py +0 -0
  236. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/loss_mask.py +0 -0
  237. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/__init__.py +0 -0
  238. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/_utils.py +0 -0
  239. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/anthropic.py +0 -0
  240. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/ollama.py +0 -0
  241. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/providers/vllm.py +0 -0
  242. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/sft_format.py +0 -0
  243. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/__init__.py +0 -0
  244. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/code.py +0 -0
  245. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/conversation.py +0 -0
  246. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/preference.py +0 -0
  247. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/qa.py +0 -0
  248. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/reasoning.py +0 -0
  249. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/tool_calling.py +0 -0
  250. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/templates/verifiable.py +0 -0
  251. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/__init__.py +0 -0
  252. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/pair_builder.py +0 -0
  253. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/traces/quality.py +0 -0
  254. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/data/validator.py +0 -0
  255. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/__init__.py +0 -0
  256. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/arena.py +0 -0
  257. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  258. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/calibrate.py +0 -0
  259. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/forgetting.py +0 -0
  260. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/human.py +0 -0
  261. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/judge.py +0 -0
  262. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/leaderboard.py +0 -0
  263. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/eval/quant_check.py +0 -0
  264. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/experiment/__init__.py +0 -0
  265. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/experiment/tracker.py +0 -0
  266. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/__init__.py +0 -0
  267. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/axolotl.py +0 -0
  268. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/llamafactory.py +0 -0
  269. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/migrate/unsloth.py +0 -0
  270. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/__init__.py +0 -0
  271. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  272. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/display.py +0 -0
  273. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  274. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/hf_push.py +0 -0
  275. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  276. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/monitoring/trace_logger.py +0 -0
  277. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/plugins/__init__.py +0 -0
  278. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/py.typed +0 -0
  279. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/recipes/__init__.py +0 -0
  280. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/recipes/catalog.py +0 -0
  281. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/__init__.py +0 -0
  282. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/attach.py +0 -0
  283. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/diff.py +0 -0
  284. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/registry/hashing.py +0 -0
  285. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/__init__.py +0 -0
  286. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/audio.yaml +0 -0
  287. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/bco.yaml +0 -0
  288. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/chat.yaml +0 -0
  289. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/code.yaml +0 -0
  290. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/embedding.yaml +0 -0
  291. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  292. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  293. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  294. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/ipo.yaml +0 -0
  295. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/kto.yaml +0 -0
  296. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/longcontext.yaml +0 -0
  297. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/manifest.json +0 -0
  298. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/medical.yaml +0 -0
  299. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/moe.yaml +0 -0
  300. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/orpo.yaml +0 -0
  301. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/pretrain.yaml +0 -0
  302. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/reasoning.yaml +0 -0
  303. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/rlhf.yaml +0 -0
  304. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/simpo.yaml +0 -0
  305. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/tool-calling.yaml +0 -0
  306. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/templates/vision.yaml +0 -0
  307. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/__init__.py +0 -0
  308. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/bitnet.py +0 -0
  309. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  310. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  311. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_routing.py +0 -0
  312. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mlx_sft.py +0 -0
  313. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/mole_routing.py +0 -0
  314. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/preference.py +0 -0
  315. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/prm.py +0 -0
  316. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/raft.py +0 -0
  317. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/rewards.py +0 -0
  318. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/tts.py +0 -0
  319. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/trainer/unlearn.py +0 -0
  320. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/tui_app.py +0 -0
  321. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/__init__.py +0 -0
  322. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/plugins/__init__.py +0 -0
  323. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/app.js +0 -0
  324. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/index.html +0 -0
  325. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/logo.png +0 -0
  326. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/logo.svg +0 -0
  327. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/ui/static/style.css +0 -0
  328. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/__init__.py +0 -0
  329. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/_eval_text.py +0 -0
  330. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ab_test.py +0 -0
  331. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/activation_offload.py +0 -0
  332. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_bisect.py +0 -0
  333. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_branch.py +0 -0
  334. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_diff.py +0 -0
  335. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_merge.py +0 -0
  336. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_pr.py +0 -0
  337. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_scan.py +0 -0
  338. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/adapter_sign.py +0 -0
  339. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advanced_precision.py +0 -0
  340. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advise.py +0 -0
  341. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/advise_history.py +0 -0
  342. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_forge.py +0 -0
  343. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_rollout.py +0 -0
  344. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/agent_sandbox.py +0 -0
  345. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/airgap_bundle.py +0 -0
  346. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/annex_xi.py +0 -0
  347. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/anthropic_messages.py +0 -0
  348. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/apple_adapter.py +0 -0
  349. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/attest.py +0 -0
  350. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/audit_log.py +0 -0
  351. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/auto_quant.py +0 -0
  352. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/backend_detect.py +0 -0
  353. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/batch_probe.py +0 -0
  354. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/behavior_battery.py +0 -0
  355. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/bitnet.py +0 -0
  356. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/blame.py +0 -0
  357. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/bom.py +0 -0
  358. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/brain_rot.py +0 -0
  359. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  360. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/build_dag.py +0 -0
  361. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/canary_discovery.py +0 -0
  362. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/canary_router.py +0 -0
  363. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/capability_suite.py +0 -0
  364. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/checklist_dsl.py +0 -0
  365. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  366. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/citation_faithful.py +0 -0
  367. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/classifier.py +0 -0
  368. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cmaes_merge.py +0 -0
  369. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/compile_tools.py +0 -0
  370. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/completions.py +0 -0
  371. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/constants.py +0 -0
  372. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/convergence.py +0 -0
  373. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/crash.py +0 -0
  374. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  375. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/curriculum.py +0 -0
  376. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  377. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/cut_ce.py +0 -0
  378. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_forge.py +0 -0
  379. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_mix.py +0 -0
  380. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/data_score.py +0 -0
  381. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deepspeed.py +0 -0
  382. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  383. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/demo_bundles.py +0 -0
  384. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  385. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  386. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/_common.py +0 -0
  387. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/badge.py +0 -0
  388. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/citation.py +0 -0
  389. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  390. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  391. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/format.py +0 -0
  392. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/live.py +0 -0
  393. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  394. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  395. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  396. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/report.py +0 -0
  397. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/diagnose/runner.py +0 -0
  398. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/distill.py +0 -0
  399. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/dpo_variants.py +0 -0
  400. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/drift_alarm.py +0 -0
  401. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  402. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/echo_trap.py +0 -0
  403. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_diff.py +0 -0
  404. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/edit_governor.py +0 -0
  405. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/encoding.py +0 -0
  406. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/energy.py +0 -0
  407. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/env_lock.py +0 -0
  408. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/errors.py +0 -0
  409. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_design.py +0 -0
  410. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  411. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/expectations.py +0 -0
  412. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fetch_examples.py +0 -0
  413. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/flash_attn.py +0 -0
  414. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fp8.py +0 -0
  415. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/freeze.py +0 -0
  416. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fsdp.py +0 -0
  417. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  418. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/galore.py +0 -0
  419. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gpu.py +0 -0
  420. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gpu_monitor.py +0 -0
  421. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grace_codebook.py +0 -0
  422. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/graceful_save.py +0 -0
  423. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grad_accum.py +0 -0
  424. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  425. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grpo_long_context.py +0 -0
  426. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/grpo_variants.py +0 -0
  427. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hardware_fit.py +0 -0
  428. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/harm_probe.py +0 -0
  429. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hf.py +0 -0
  430. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hf_space.py +0 -0
  431. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/hubs.py +0 -0
  432. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ingest_sources.py +0 -0
  433. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/integrations.py +0 -0
  434. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/interference.py +0 -0
  435. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/interference_live.py +0 -0
  436. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/irt.py +0 -0
  437. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/iterative_dpo.py +0 -0
  438. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  439. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/kernel_picker.py +0 -0
  440. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/knowledge_edit.py +0 -0
  441. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/kv_cache.py +0 -0
  442. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/launcher.py +0 -0
  443. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/license_advisor.py +0 -0
  444. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/liger.py +0 -0
  445. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/live_eval.py +0 -0
  446. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/llama_proxy.py +0 -0
  447. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/llama_server_timings.py +0 -0
  448. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/local_rl.py +0 -0
  449. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  450. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loftq_init.py +0 -0
  451. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/log_level.py +0 -0
  452. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/long_context.py +0 -0
  453. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/longlora.py +0 -0
  454. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_budget.py +0 -0
  455. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_daemon.py +0 -0
  456. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_iteration.py +0 -0
  457. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/loop_state.py +0 -0
  458. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/lr_finder.py +0 -0
  459. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/lr_groups.py +0 -0
  460. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/magpie.py +0 -0
  461. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/metrics.py +0 -0
  462. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mii.py +0 -0
  463. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/minillm.py +0 -0
  464. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mix_proxy.py +0 -0
  465. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mixed_precision.py +0 -0
  466. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mlx.py +0 -0
  467. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/moe.py +0 -0
  468. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/moe_quant.py +0 -0
  469. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/mole_routing.py +0 -0
  470. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack.py +0 -0
  471. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack_sampler.py +0 -0
  472. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/multipack_trainer.py +0 -0
  473. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/neat_packing.py +0 -0
  474. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ngram_spec.py +0 -0
  475. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/nlg_metrics.py +0 -0
  476. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/onboarding.py +0 -0
  477. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  478. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/paths.py +0 -0
  479. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_builder.py +0 -0
  480. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_patches.py +0 -0
  481. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/peft_wiring.py +0 -0
  482. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/persona_hub.py +0 -0
  483. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/pipeline.py +0 -0
  484. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prm.py +0 -0
  485. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/probe_kernel.py +0 -0
  486. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/probe_pack.py +0 -0
  487. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiler.py +0 -0
  488. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiling.py +0 -0
  489. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  490. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prompt_compile.py +0 -0
  491. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prompt_distill.py +0 -0
  492. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/prune_prompt.py +0 -0
  493. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/qat.py +0 -0
  494. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/qr_url.py +0 -0
  495. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/quality.py +0 -0
  496. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/quant_menu.py +0 -0
  497. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ra_dit.py +0 -0
  498. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ra_dit_run.py +0 -0
  499. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/raft.py +0 -0
  500. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reasoning_effort.py +0 -0
  501. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reasoning_parser.py +0 -0
  502. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/recipe_dag.py +0 -0
  503. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/recipe_run.py +0 -0
  504. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/relora.py +0 -0
  505. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/replay.py +0 -0
  506. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/repro_receipt.py +0 -0
  507. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/reward_hacking.py +0 -0
  508. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ring_attention.py +0 -0
  509. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  510. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/run_cost.py +0 -0
  511. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sae_diff.py +0 -0
  512. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/save_formats.py +0 -0
  513. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/server_tools.py +0 -0
  514. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ship_verdict.py +0 -0
  515. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/shortcuts.py +0 -0
  516. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/signing.py +0 -0
  517. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sleeper_probe.py +0 -0
  518. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/soup_lock.py +0 -0
  519. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spec_pairing.py +0 -0
  520. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spectrum_scan.py +0 -0
  521. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/spike_recovery.py +0 -0
  522. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sse_train_stream.py +0 -0
  523. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/steering.py +0 -0
  524. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/strict_safetensors.py +0 -0
  525. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/structured_output.py +0 -0
  526. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/sweep_config.py +0 -0
  527. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tail_latency.py +0 -0
  528. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tool_outputs.py +0 -0
  529. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/topology.py +0 -0
  530. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tracing.py +0 -0
  531. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trackers.py +0 -0
  532. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/train_event_buffer.py +0 -0
  533. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trainer_plugins.py +0 -0
  534. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/trust_remote.py +0 -0
  535. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/truth_probe.py +0 -0
  536. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tts.py +0 -0
  537. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tts_codec.py +0 -0
  538. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/tunability.py +0 -0
  539. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/ui_env.py +0 -0
  540. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/uld.py +0 -0
  541. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  542. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearning.py +0 -0
  543. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unlearning_eval.py +0 -0
  544. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/unsloth.py +0 -0
  545. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/v028_features.py +0 -0
  546. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vector_bank.py +0 -0
  547. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vllm.py +0 -0
  548. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/vscode_setup.py +0 -0
  549. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/warmup.py +0 -0
  550. {soup_cli-0.71.26 → soup_cli-0.71.28}/src/soup_cli/utils/why.py +0 -0
  551. {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/chat.yaml +0 -0
  552. {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/code.yaml +0 -0
  553. {soup_cli-0.71.26 → soup_cli-0.71.28}/templates/medical.yaml +0 -0
  554. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/__init__.py +0 -0
  555. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/conftest.py +0 -0
  556. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v053_qa.md +0 -0
  557. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v07114_qa.md +0 -0
  558. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/qa/v0716_qa.md +0 -0
  559. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_adapters.py +0 -0
  560. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_advanced_peft.py +0 -0
  561. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_assistant_mask.py +0 -0
  562. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_audio.py +0 -0
  563. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_auto_tuning.py +0 -0
  564. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_autopilot.py +0 -0
  565. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_awq_gptq_export.py +0 -0
  566. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_batch_probe.py +0 -0
  567. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bco.py +0 -0
  568. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bench.py +0 -0
  569. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_brain_rot_multilingual.py +0 -0
  570. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_bugfixes.py +0 -0
  571. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_build_dag.py +0 -0
  572. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_callback.py +0 -0
  573. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cans.py +0 -0
  574. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_chat.py +0 -0
  575. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_chat_template.py +0 -0
  576. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cli.py +0 -0
  577. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cli_subprocess.py +0 -0
  578. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_config.py +0 -0
  579. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_cost.py +0 -0
  580. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_crash_reporter.py +0 -0
  581. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_curriculum.py +0 -0
  582. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data.py +0 -0
  583. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_augment.py +0 -0
  584. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_sample.py +0 -0
  585. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_split.py +0 -0
  586. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_data_tools.py +0 -0
  587. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dataset_hub.py +0 -0
  588. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dataset_registry.py +0 -0
  589. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_deepspeed.py +0 -0
  590. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_deploy_ollama.py +0 -0
  591. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_diff.py +0 -0
  592. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_display.py +0 -0
  593. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_doctor.py +0 -0
  594. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dpo_example.py +0 -0
  595. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_dpo_variants.py +0 -0
  596. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_embedding.py +0 -0
  597. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_errors.py +0 -0
  598. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval.py +0 -0
  599. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_eval_platform.py +0 -0
  600. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_export.py +0 -0
  601. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_formats.py +0 -0
  602. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_fp8_recipe.py +0 -0
  603. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_freeze_training.py +0 -0
  604. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_generate.py +0 -0
  605. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_gpu.py +0 -0
  606. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_grpo.py +0 -0
  607. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_hf_integration.py +0 -0
  608. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_infer.py +0 -0
  609. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_inference_advanced.py +0 -0
  610. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_init.py +0 -0
  611. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ipo.py +0 -0
  612. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_jinja_analyzer.py +0 -0
  613. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_kto.py +0 -0
  614. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_loader.py +0 -0
  615. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_log_level.py +0 -0
  616. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_loss_watchdog.py +0 -0
  617. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_merge.py +0 -0
  618. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_migrate.py +0 -0
  619. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_mlx_backend.py +0 -0
  620. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_moe.py +0 -0
  621. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multi_adapter.py +0 -0
  622. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multi_gpu.py +0 -0
  623. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_config.py +0 -0
  624. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_invariants.py +0 -0
  625. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_multipack_sampler.py +0 -0
  626. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_neat_packing.py +0 -0
  627. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_neftune_rslora.py +0 -0
  628. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_onnx_tensorrt_export.py +0 -0
  629. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_orpo.py +0 -0
  630. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_packing.py +0 -0
  631. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_a_wave2.py +0 -0
  632. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_b.py +0 -0
  633. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_c.py +0 -0
  634. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_d.py +0 -0
  635. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_e.py +0 -0
  636. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_part_f_hardening.py +0 -0
  637. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_peft_methods.py +0 -0
  638. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_peft_patches.py +0 -0
  639. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_performance.py +0 -0
  640. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_pissa_init.py +0 -0
  641. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ppo.py +0 -0
  642. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_dispatcher.py +0 -0
  643. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_multi.py +0 -0
  644. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_preference_multi_runtime.py +0 -0
  645. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_pretrain.py +0 -0
  646. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_profile.py +0 -0
  647. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_profiling.py +0 -0
  648. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_progress.py +0 -0
  649. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_push.py +0 -0
  650. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_qat.py +0 -0
  651. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quality_filter.py +0 -0
  652. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quant_check.py +0 -0
  653. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quant_menu.py +0 -0
  654. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_quickstart.py +0 -0
  655. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_rank_pattern.py +0 -0
  656. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_recipes.py +0 -0
  657. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_recipes_v031.py +0 -0
  658. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_refusal_multilingual.py +0 -0
  659. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_registry.py +0 -0
  660. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_relora.py +0 -0
  661. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_replay.py +0 -0
  662. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_resume.py +0 -0
  663. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_rlvr.py +0 -0
  664. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_run_cost.py +0 -0
  665. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_runs.py +0 -0
  666. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_serve.py +0 -0
  667. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_server_generate.py +0 -0
  668. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_sglang_serve.py +0 -0
  669. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_simpo.py +0 -0
  670. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_smoke_train.py +0 -0
  671. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_speculative_decoding.py +0 -0
  672. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_sweep.py +0 -0
  673. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_synth_data_pro.py +0 -0
  674. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_templates_yaml.py +0 -0
  675. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tensorboard.py +0 -0
  676. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tool_calling.py +0 -0
  677. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trace_to_pref.py +0 -0
  678. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tracker.py +0 -0
  679. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trainer_coverage_v035.py +0 -0
  680. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_training_intelligence.py +0 -0
  681. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_training_speed.py +0 -0
  682. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_trust_remote_code.py +0 -0
  683. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_tui.py +0 -0
  684. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui.py +0 -0
  685. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_chat.py +0 -0
  686. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_config_builder.py +0 -0
  687. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_live_monitor.py +0 -0
  688. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_ui_metrics.py +0 -0
  689. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_unsloth.py +0 -0
  690. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_c.py +0 -0
  691. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_d.py +0 -0
  692. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0401_part_e.py +0 -0
  693. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0402_part_a.py +0 -0
  694. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0402_part_b.py +0 -0
  695. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_a.py +0 -0
  696. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_b.py +0 -0
  697. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0403_part_c.py +0 -0
  698. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0404_part_a.py +0 -0
  699. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0404_part_b.py +0 -0
  700. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0405_part_a.py +0 -0
  701. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0406_part_a.py +0 -0
  702. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_a.py +0 -0
  703. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_b.py +0 -0
  704. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0410_part_c.py +0 -0
  705. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0420.py +0 -0
  706. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_a.py +0 -0
  707. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_b.py +0 -0
  708. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_c.py +0 -0
  709. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0430_part_d.py +0 -0
  710. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_a.py +0 -0
  711. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_b.py +0 -0
  712. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_c.py +0 -0
  713. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_part_d.py +0 -0
  714. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0440_review_followups.py +0 -0
  715. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0450.py +0 -0
  716. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0460_part_a.py +0 -0
  717. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0460_part_b.py +0 -0
  718. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0470_part_a.py +0 -0
  719. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0470_part_b.py +0 -0
  720. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0480_part_a.py +0 -0
  721. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0480_part_b.py +0 -0
  722. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0490.py +0 -0
  723. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_a.py +0 -0
  724. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_b.py +0 -0
  725. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_c.py +0 -0
  726. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_d.py +0 -0
  727. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0500_part_e.py +0 -0
  728. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0510.py +0 -0
  729. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0520.py +0 -0
  730. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0530.py +0 -0
  731. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v05310.py +0 -0
  732. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v05311.py +0 -0
  733. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_109.py +0 -0
  734. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_139.py +0 -0
  735. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_142.py +0 -0
  736. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0531_82.py +0 -0
  737. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0532.py +0 -0
  738. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0533.py +0 -0
  739. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0534.py +0 -0
  740. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0535.py +0 -0
  741. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0536.py +0 -0
  742. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0537.py +0 -0
  743. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0538.py +0 -0
  744. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0539.py +0 -0
  745. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0540.py +0 -0
  746. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0550.py +0 -0
  747. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0550_followups.py +0 -0
  748. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_a.py +0 -0
  749. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_b.py +0 -0
  750. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_c.py +0 -0
  751. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0570_part_d.py +0 -0
  752. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0580.py +0 -0
  753. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0590.py +0 -0
  754. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_a.py +0 -0
  755. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_b.py +0 -0
  756. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_c.py +0 -0
  757. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_d.py +0 -0
  758. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_e.py +0 -0
  759. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0600_part_f.py +0 -0
  760. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_a.py +0 -0
  761. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_b.py +0 -0
  762. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_c.py +0 -0
  763. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_d.py +0 -0
  764. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0610_part_e.py +0 -0
  765. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_followups.py +0 -0
  766. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_a.py +0 -0
  767. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_b.py +0 -0
  768. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_c.py +0 -0
  769. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_d.py +0 -0
  770. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0620_part_e.py +0 -0
  771. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_followups.py +0 -0
  772. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_a.py +0 -0
  773. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_b.py +0 -0
  774. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_c.py +0 -0
  775. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_d.py +0 -0
  776. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0630_part_e.py +0 -0
  777. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0631_206.py +0 -0
  778. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_followups.py +0 -0
  779. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_a.py +0 -0
  780. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_b.py +0 -0
  781. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_c.py +0 -0
  782. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_d.py +0 -0
  783. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_e.py +0 -0
  784. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0640_part_f.py +0 -0
  785. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_followups.py +0 -0
  786. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_a.py +0 -0
  787. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_b.py +0 -0
  788. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_c.py +0 -0
  789. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_d.py +0 -0
  790. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0650_part_e.py +0 -0
  791. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_cli.py +0 -0
  792. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_followups.py +0 -0
  793. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_a.py +0 -0
  794. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_b.py +0 -0
  795. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_c.py +0 -0
  796. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_d.py +0 -0
  797. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0660_part_e.py +0 -0
  798. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_followups.py +0 -0
  799. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_a.py +0 -0
  800. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_b.py +0 -0
  801. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_c.py +0 -0
  802. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_d.py +0 -0
  803. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_e.py +0 -0
  804. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0670_part_f.py +0 -0
  805. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_followups.py +0 -0
  806. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_a.py +0 -0
  807. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_b.py +0 -0
  808. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_c.py +0 -0
  809. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_d.py +0 -0
  810. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0680_part_e.py +0 -0
  811. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_a.py +0 -0
  812. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_b.py +0 -0
  813. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_c.py +0 -0
  814. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_d.py +0 -0
  815. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0690_part_e.py +0 -0
  816. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_a.py +0 -0
  817. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_b.py +0 -0
  818. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_c.py +0 -0
  819. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_d.py +0 -0
  820. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_e.py +0 -0
  821. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0700_part_f.py +0 -0
  822. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07110.py +0 -0
  823. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07111.py +0 -0
  824. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07112.py +0 -0
  825. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07113.py +0 -0
  826. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07114.py +0 -0
  827. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07115.py +0 -0
  828. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07116.py +0 -0
  829. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07117.py +0 -0
  830. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07118.py +0 -0
  831. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07119.py +0 -0
  832. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0712.py +0 -0
  833. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07120.py +0 -0
  834. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07121.py +0 -0
  835. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07122.py +0 -0
  836. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07123.py +0 -0
  837. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07124.py +0 -0
  838. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v07125.py +0 -0
  839. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0713.py +0 -0
  840. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0714.py +0 -0
  841. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0715.py +0 -0
  842. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0716.py +0 -0
  843. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0717.py +0 -0
  844. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0718.py +0 -0
  845. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_v0719.py +0 -0
  846. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_validator.py +0 -0
  847. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_vision.py +0 -0
  848. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_vllm_serve.py +0 -0
  849. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_warmup.py +0 -0
  850. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_why.py +0 -0
  851. {soup_cli-0.71.26 → soup_cli-0.71.28}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,111 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.28] - 2026-07-04
16
+
17
+ ### Added
18
+ - **MCP server (`soup mcp serve`)** — drive Soup from any Model Context Protocol
19
+ client (Claude Code / Cursor / Cline / Continue) over stdio. No fine-tuning
20
+ CLI ships an MCP server. Exposes 14 read-only tools as JSON — `advise`,
21
+ `data_inspect` / `data_validate` / `data_score` / `data_doctor`,
22
+ `recipes_search` / `recipes_show`, `runs_list` / `runs_show`,
23
+ `registry_list` / `registry_show`, `profile`, `diagnose_evidence`,
24
+ `ship_evidence` — plus two **plan-only** mutating tools (`train_start`,
25
+ `export`) gated behind `--allow-mutating` (they render the exact command that
26
+ would run; they never execute). The official `mcp` SDK is behind a new
27
+ `[mcp]` extra (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI
28
+ stays light. Security: stdio-only (no network listener); every path argument
29
+ re-enters cwd-containment + symlink rejection; output is control-char
30
+ sanitized; errors are path-free; string / size / int bounds enforced.
31
+
32
+ ### Fixed
33
+ - The DPO / IPO / KTO / BCO trainers now apply configured vocabulary expansion
34
+ (`data.add_new_tokens` / `data.new_special_tokens`) via the shared
35
+ `apply_vocab_expansion()` helper during setup, consistent with the SFT path —
36
+ they previously ignored it. Closes #292
37
+ ([#293](https://github.com/MakazhanAlpamys/Soup/pull/293) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
38
+ - The ORPO / SimPO / GRPO trainers now also apply configured vocabulary
39
+ expansion via the shared `apply_vocab_expansion()` helper — completing
40
+ consistent vocab-expansion behavior across every SFT/preference/RL trainer.
41
+ Closes #294
42
+ ([#295](https://github.com/MakazhanAlpamys/Soup/pull/295) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
43
+
44
+ ## [0.71.27] - 2026-07-03
45
+
46
+ ### Added
47
+ - **Fine-tune Doctor** — kill the top *silent* fine-tune failures before a
48
+ single training step; no competitor (Unsloth/Axolotl/LlamaFactory) ships
49
+ any of these three:
50
+ - `soup data doctor <data> --model <id|path>` — chat-template
51
+ compatibility report over 8 checks: `chat_template` present,
52
+ `template_render`s cleanly, has `{% generation %}` markers,
53
+ `eos_in_labels` (the **#1 "model never stops generating" bug** — every
54
+ assistant turn's trained span must actually contain an EOS/EOT token;
55
+ checks every turn, not just the last), `bos_duplication` (template +
56
+ tokenizer both prepending BOS), `system_role` support (Mistral-style
57
+ templates reject a leading system turn), `unknown_roles`, and
58
+ `truncation_risk` (p95 rendered length vs `max_length`). Same OK / MINOR
59
+ / MAJOR taxonomy as `soup diagnose`; exit 0 = OK/MINOR, exit 2 = MAJOR.
60
+ `--train-on-responses-only` / `--train-on-messages-with-train-field`
61
+ select the same masking strategy `soup train` would use, so the report
62
+ and `--show-mask` never disagree about what's actually trained.
63
+ - `soup data doctor ... --show-mask N` — render N sample rows with
64
+ per-token trained/masked colouring through the REAL collator path
65
+ (answer-only / per-message-train-field / RAFT span-mask) — not a
66
+ reimplementation — so an assistant-mask bug is visible instantly.
67
+ - `soup data lint <data>` — preference-data linter for
68
+ dpo/orpo/simpo/ipo/bco/kto: `length_bias` (chosen systematically longer
69
+ than rejected — the **#1 silent DPO degradation**, reported as a
70
+ Cohen's d effect size), `label_imbalance` (KTO desirable:undesirable
71
+ ratio), `near_duplicates` (MinHash/LSH, reuses the `soup data dedup`
72
+ kernel), `identical_pairs` (chosen == rejected — zero preference
73
+ signal), and `prompt_leak` (the prompt echoed verbatim inside the
74
+ completion — a common synthetic-data pipeline bug). Optional `--model`
75
+ for exact token-length bias (default: word count).
76
+ - Validated live against the real `HuggingFaceTB/SmolLM2-135M-Instruct`
77
+ tokenizer on Windows + RTX 3050 — this smoke pass found and fixed two
78
+ genuine bugs beyond what synthetic fixtures alone caught: an EOS check
79
+ that required the EOS token to be the *literal last* trained token
80
+ (real templates often have a trailing formatting token after the
81
+ closing tag that stays inside the trained span), and two call sites
82
+ that only caught `(ValueError, TypeError)` around a tokenizer's
83
+ `apply_chat_template` when a real Jinja `raise_exception()`
84
+ (Mistral-style no-system-role guard) raises
85
+ `jinja2.exceptions.TemplateError`.
86
+
87
+ ### Fixed
88
+ - Harden `commands/diagnose.py`'s `--evidence` loader against a TOCTOU
89
+ symlink swap: opens with `O_NOFOLLOW` and size-checks the open fd via
90
+ `os.fstat` instead of `os.path.getsize` on the path before the open —
91
+ backports the hardened loader shipped for `soup ship` in v0.71.25 (closes
92
+ v0.71.25 known-limitation (4)).
93
+ - Harden judge-model URL validation against a hostname prefix bypass
94
+ (`http://localhost.attacker.com`) — `GateTask._valid_judge_url` /
95
+ `_parse_judge_url` now use `urllib.parse.urlparse` + hostname checks instead
96
+ of `startswith`. Closes #283
97
+ ([#288](https://github.com/MakazhanAlpamys/Soup/pull/288) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
98
+ - `SFTTrainerWrapper` now applies configured vocabulary expansion
99
+ (`data.add_new_tokens` / `data.new_special_tokens`) and resizes the model
100
+ embeddings during initialization — previously these fields were accepted by
101
+ the schema but silently ignored. Closes #289
102
+ ([#287](https://github.com/MakazhanAlpamys/Soup/pull/287) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
103
+ - Vision and audio SFT paths now apply that same configured vocabulary
104
+ expansion (`data.add_new_tokens` / `data.new_special_tokens`) via the shared
105
+ `apply_vocab_expansion()` helper, consistent with the text SFT path — they
106
+ previously ignored it. Closes #290
107
+ ([#291](https://github.com/MakazhanAlpamys/Soup/pull/291) by [@CODING-DARSH](https://github.com/CODING-DARSH)).
108
+
109
+ ### Security
110
+ - `soup data doctor` strips C0 control characters (keeping tab/newline/CR)
111
+ from dataset-derived content before it reaches the terminal — Rich's
112
+ `markup.escape()` only neutralises `[...]` tag syntax, not raw escape
113
+ sequences, so an untrusted training row (e.g. an unknown `role` field, or
114
+ `--show-mask`'s decoded token text on a byte-level BPE tokenizer) could
115
+ otherwise carry a literal ESC byte through to the terminal (title-bar /
116
+ OSC-8 link spoofing, or obscuring a MAJOR verdict via cursor tricks).
117
+ `--output` JSON is unaffected (`json.dumps` already escapes control
118
+ characters).
119
+
15
120
  ## [0.71.26] - 2026-07-01
16
121
 
17
122
  ### 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 (305 files, 15140 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 (305 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,12 @@ 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))
51
+ - Honor configured vocab expansion in the DPO / IPO / KTO / BCO trainers ([#293](https://github.com/MakazhanAlpamys/Soup/pull/293))
52
+ - Honor configured vocab expansion in the ORPO / SimPO / GRPO trainers ([#295](https://github.com/MakazhanAlpamys/Soup/pull/295))
47
53
 
48
54
  ---
49
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.26
3
+ Version: 0.71.28
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
@@ -29,6 +29,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'all'
29
29
  Requires-Dist: datasets>=2.14.0; extra == 'all'
30
30
  Requires-Dist: datasketch>=1.6.0; extra == 'all'
31
31
  Requires-Dist: fastapi>=0.104.0; extra == 'all'
32
+ Requires-Dist: mcp>=1.2.0; extra == 'all'
32
33
  Requires-Dist: peft>=0.7.0; extra == 'all'
33
34
  Requires-Dist: torch>=2.0.0; extra == 'all'
34
35
  Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'all'
@@ -60,6 +61,7 @@ Requires-Dist: bitsandbytes>=0.41.0; extra == 'dev'
60
61
  Requires-Dist: cryptography>=41.0.0; extra == 'dev'
61
62
  Requires-Dist: datasets>=2.14.0; extra == 'dev'
62
63
  Requires-Dist: httpx>=0.24.0; extra == 'dev'
64
+ Requires-Dist: mcp>=1.2.0; extra == 'dev'
63
65
  Requires-Dist: mypy>=1.8.0; extra == 'dev'
64
66
  Requires-Dist: peft>=0.7.0; extra == 'dev'
65
67
  Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
@@ -80,6 +82,8 @@ Provides-Extra: gptq
80
82
  Requires-Dist: auto-gptq>=0.7.0; extra == 'gptq'
81
83
  Provides-Extra: liger
82
84
  Requires-Dist: liger-kernel>=0.3.0; extra == 'liger'
85
+ Provides-Extra: mcp
86
+ Requires-Dist: mcp>=1.2.0; extra == 'mcp'
83
87
  Provides-Extra: mix
84
88
  Requires-Dist: scikit-optimize>=0.9.0; extra == 'mix'
85
89
  Provides-Extra: mlx
@@ -189,21 +193,25 @@ infrastructure instead of improving models. Soup fixes that.
189
193
 
190
194
  ## What's New
191
195
 
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.
204
-
205
- ```bash
206
- soup train --config grpo.yaml --reward-hack-mitigation kl_control # detect raise KL → recover
196
+ **v0.71.28Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
197
+
198
+ - **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
199
+ `recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
200
+ `diagnose_evidence`, `ship_evidence` your agent can inspect data, search recipes, read runs,
201
+ and get a ship verdict without you leaving the chat.
202
+ - **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
203
+ mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
204
+ render the exact command that would run. Every path argument re-enters cwd containment +
205
+ symlink rejection; output is control-char sanitized; errors are path-free.
206
+ - **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
207
+ (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
208
+ - **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
209
+ call` end-to-end on Windows + RTX 3050 — read tools return real JSON, the mutating tools
210
+ refuse without the flag, and a path-traversal argument is rejected.
211
+
212
+ ```jsonc
213
+ // .mcp.json (Claude Code) or claude_desktop_config.json
214
+ { "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
207
215
  ```
208
216
 
209
217
  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.
64
-
65
- ```bash
66
- soup train --config grpo.yaml --reward-hack-mitigation kl_control # detect raise KL → recover
52
+ **v0.71.28Drive Soup from your coding agent: `soup mcp serve`.** A Model Context Protocol server, so Claude Code / Cursor / Cline / Continue can run Soup conversationally. No other fine-tuning CLI ships one.
53
+
54
+ - **14 read-only tools, JSON out.** `advise`, `data_inspect` / `validate` / `score` / `doctor`,
55
+ `recipes_search` / `show`, `runs_list` / `show`, `registry_list` / `show`, `profile`,
56
+ `diagnose_evidence`, `ship_evidence` your agent can inspect data, search recipes, read runs,
57
+ and get a ship verdict without you leaving the chat.
58
+ - **Plan-only by default, safe by design.** stdio transport only (no network listener); the two
59
+ mutating tools (`train_start`, `export`) are gated behind `--allow-mutating` and only ever
60
+ render the exact command that would run. Every path argument re-enters cwd containment +
61
+ symlink rejection; output is control-char sanitized; errors are path-free.
62
+ - **Light install.** The official `mcp` SDK lives behind a new `[mcp]` extra
63
+ (`pip install 'soup-cli[mcp]'`), lazy-imported so the core CLI stays torch-free and fast.
64
+ - **Live-validated on Windows.** A real stdio MCP client drove `initialize → list_tools →
65
+ call` end-to-end on Windows + RTX 3050 — read tools return real JSON, the mutating tools
66
+ refuse without the flag, and a path-traversal argument is rejected.
67
+
68
+ ```jsonc
69
+ // .mcp.json (Claude Code) or claude_desktop_config.json
70
+ { "mcpServers": { "soup": { "command": "soup", "args": ["mcp", "serve"] } } }
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
@@ -152,6 +156,8 @@ soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP ver
152
156
  soup ship --evidence ev.json [--output v.json] Decide offline from pre-computed scores (no model load)
153
157
  soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via LLM-as-a-judge
154
158
  soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 + recorded base scores
159
+ soup mcp serve MCP server over stdio (drive Soup from Claude Code / Cursor / Cline; requires [mcp] extra) (v0.71.28)
160
+ soup mcp serve --allow-mutating Also expose plan-only train_start / export tools (never execute) (v0.71.28)
155
161
  soup tui Full-screen Textual dashboard (requires [tui] extra)
156
162
  soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
157
163
  soup --log-level quiet|normal|verbose|debug Global logging tier (Rich-formatted)
@@ -263,4 +269,37 @@ soup version [--full] [--json] Show version (--full: system info,
263
269
  soup --verbose <command> Full traceback on errors
264
270
  ```
265
271
 
272
+ ## Fine-tune from your coding agent (MCP)
273
+
274
+ `soup mcp serve` runs a [Model Context Protocol](https://modelcontextprotocol.io)
275
+ server over **stdio**, so any MCP client — Claude Code, Cursor, Cline, Continue —
276
+ can drive Soup conversationally. Install the extra first:
277
+
278
+ ```bash
279
+ pip install 'soup-cli[mcp]'
280
+ ```
281
+
282
+ Register it with your client. For **Claude Code** (`.mcp.json` in the repo) or
283
+ the **Claude Desktop** config (`claude_desktop_config.json`):
284
+
285
+ ```json
286
+ {
287
+ "mcpServers": {
288
+ "soup": { "command": "soup", "args": ["mcp", "serve"] }
289
+ }
290
+ }
291
+ ```
292
+
293
+ The server exposes 14 read-only tools — `advise`, `data_inspect`,
294
+ `data_validate`, `data_score`, `data_doctor`, `recipes_search`, `recipes_show`,
295
+ `runs_list`, `runs_show`, `registry_list`, `registry_show`, `profile`,
296
+ `diagnose_evidence`, `ship_evidence` — each returning JSON. Two **plan-only**
297
+ mutating tools (`train_start`, `export`) are gated behind `--allow-mutating`
298
+ (`"args": ["mcp", "serve", "--allow-mutating"]`); even then they only render the
299
+ exact command that would run — they never execute training or export.
300
+
301
+ **Security:** stdio only (no network listener); every path argument stays under
302
+ the working directory and rejects symlinks; tool output is control-char
303
+ sanitized; error messages never leak filesystem paths.
304
+
266
305
 
@@ -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.28"
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"
@@ -47,14 +47,14 @@ train = [
47
47
  "accelerate>=0.25.0",
48
48
  ]
49
49
  # v0.71.0 — convenience meta-extra pulling the main optional stacks.
50
- all = ["soup-cli[train,serve,ui,data]"]
50
+ all = ["soup-cli[train,serve,ui,data,mcp]"]
51
51
  eval = ["lm-eval>=0.4.0"]
52
52
  data = ["datasketch>=1.6.0"]
53
53
  wandb = ["wandb>=0.15.0,<0.18.0"]
54
54
  # Self-references `[train]` so CI / contributors get the full training stack
55
55
  # (CI runs `pip install -e ".[dev]"`; without this every test would fail at
56
56
  # `import torch`).
57
- dev = ["soup-cli[train]", "cryptography>=41.0.0", "reportlab>=4.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
57
+ dev = ["soup-cli[train,mcp]", "cryptography>=41.0.0", "reportlab>=4.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
58
58
  ui = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
59
59
  serve = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
60
60
  serve-fast = ["vllm>=0.4.0", "fastapi>=0.104.0", "uvicorn>=0.24.0"]
@@ -102,6 +102,10 @@ compile = ["dspy-ai>=2.5.0", "textgrad>=0.1.0", "gepa>=0.0.1"]
102
102
  # Lazy-imported; only needed for `--cloud-submit` (plan-only render needs no
103
103
  # dependency). Modal auth is via `modal setup`.
104
104
  modal = ["modal>=0.60.0"]
105
+ # v0.71.28 - `soup mcp serve` MCP server. The official `mcp` python SDK is
106
+ # lazy-imported (only src/soup_cli/mcp_server/server.py touches it), so the CLI
107
+ # stays light without it. Floor pinned to guard against SDK API churn.
108
+ mcp = ["mcp>=1.2.0"]
105
109
 
106
110
  [project.scripts]
107
111
  soup = "soup_cli.cli:run"
@@ -0,0 +1,3 @@
1
+ """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
+
3
+ __version__ = "0.71.28"
@@ -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,23 @@ 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
+
520
+ # v0.71.28 — MCP server: drive Soup from any MCP client (Claude Code / Cursor /
521
+ # Cline / Continue) over stdio.
522
+ from soup_cli.commands import mcp as _mcp_cmd # noqa: E402
523
+
524
+ app.add_typer(
525
+ _mcp_cmd.app,
526
+ name="mcp",
527
+ help="Model Context Protocol server - drive Soup from any MCP client (v0.71.28).",
528
+ )
529
+
513
530
 
514
531
  def _rewrite_advise_argv(argv: list) -> list:
515
532
  """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
  )