soup-cli 0.71.22__tar.gz → 0.71.23__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 (828) hide show
  1. {soup_cli-0.71.22 → soup_cli-0.71.23}/.gitignore +1 -16
  2. {soup_cli-0.71.22 → soup_cli-0.71.23}/CHANGELOG.md +33 -0
  3. {soup_cli-0.71.22 → soup_cli-0.71.23}/CONTRIBUTING.md +1 -1
  4. {soup_cli-0.71.22 → soup_cli-0.71.23}/PKG-INFO +14 -17
  5. {soup_cli-0.71.22 → soup_cli-0.71.23}/README.md +13 -16
  6. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/commands.md +1 -0
  7. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/training.md +52 -4
  8. {soup_cli-0.71.22 → soup_cli-0.71.23}/pyproject.toml +1 -1
  9. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/__init__.py +1 -1
  10. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cli.py +5 -0
  11. soup_cli-0.71.23/src/soup_cli/commands/spectrum.py +174 -0
  12. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/schema.py +143 -0
  13. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/sft.py +79 -43
  14. soup_cli-0.71.23/src/soup_cli/utils/freeze.py +142 -0
  15. soup_cli-0.71.23/src/soup_cli/utils/spectrum_scan.py +591 -0
  16. soup_cli-0.71.23/tests/test_v07123.py +908 -0
  17. soup_cli-0.71.22/src/soup_cli/utils/freeze.py +0 -73
  18. {soup_cli-0.71.22 → soup_cli-0.71.23}/.dockerignore +0 -0
  19. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/FUNDING.yml +0 -0
  20. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/pull_request_template.md +0 -0
  24. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/ci.yml +0 -0
  25. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/docker.yml +0 -0
  26. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/publish.yml +0 -0
  27. {soup_cli-0.71.22 → soup_cli-0.71.23}/.github/workflows/recipe-validation.yml +0 -0
  28. {soup_cli-0.71.22 → soup_cli-0.71.23}/.mailmap +0 -0
  29. {soup_cli-0.71.22 → soup_cli-0.71.23}/.pre-commit-config.yaml +0 -0
  30. {soup_cli-0.71.22 → soup_cli-0.71.23}/AGENTS.md +0 -0
  31. {soup_cli-0.71.22 → soup_cli-0.71.23}/CODEOWNERS +0 -0
  32. {soup_cli-0.71.22 → soup_cli-0.71.23}/CODE_OF_CONDUCT.md +0 -0
  33. {soup_cli-0.71.22 → soup_cli-0.71.23}/CONTRIBUTORS.md +0 -0
  34. {soup_cli-0.71.22 → soup_cli-0.71.23}/Dockerfile +0 -0
  35. {soup_cli-0.71.22 → soup_cli-0.71.23}/LICENSE +0 -0
  36. {soup_cli-0.71.22 → soup_cli-0.71.23}/NOTICE +0 -0
  37. {soup_cli-0.71.22 → soup_cli-0.71.23}/SECURITY.md +0 -0
  38. {soup_cli-0.71.22 → soup_cli-0.71.23}/docker-compose.yml +0 -0
  39. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/README.md +0 -0
  40. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/adapters-and-governance.md +0 -0
  41. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/backends-and-ops.md +0 -0
  42. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/data.md +0 -0
  43. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/evaluation.md +0 -0
  44. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/models.md +0 -0
  45. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/peft-and-efficiency.md +0 -0
  46. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/performance-and-quantization.md +0 -0
  47. {soup_cli-0.71.22 → soup_cli-0.71.23}/docs/serving-and-export.md +0 -0
  48. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/README.md +0 -0
  49. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/dpo_chat.yaml +0 -0
  50. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/dpo_example.yaml +0 -0
  51. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/grpo_reasoning.yaml +0 -0
  52. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step1_sft.yaml +0 -0
  53. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step2_reward.yaml +0 -0
  54. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  55. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/sft_basic.yaml +0 -0
  56. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/configs/vision_llama.yaml +0 -0
  57. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/alpaca_tiny.jsonl +0 -0
  58. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/chat_preferences.jsonl +0 -0
  59. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/dpo_sample.jsonl +0 -0
  60. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/data/reasoning_math.jsonl +0 -0
  61. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/synthetic_workflow.md +0 -0
  62. {soup_cli-0.71.22 → soup_cli-0.71.23}/examples/synthetic_workflow.yaml +0 -0
  63. {soup_cli-0.71.22 → soup_cli-0.71.23}/soup.png +0 -0
  64. {soup_cli-0.71.22 → soup_cli-0.71.23}/soup_logo_svg.svg +0 -0
  65. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/__main__.py +0 -0
  66. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/__init__.py +0 -0
  67. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/analyzer.py +0 -0
  68. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/decisions.py +0 -0
  69. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/autopilot/generate_config.py +0 -0
  70. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/__init__.py +0 -0
  71. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/pack.py +0 -0
  72. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/publish.py +0 -0
  73. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/run.py +0 -0
  74. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/schema.py +0 -0
  75. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/unpack.py +0 -0
  76. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cans/verify.py +0 -0
  77. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cloud/__init__.py +0 -0
  78. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/cloud/modal.py +0 -0
  79. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/__init__.py +0 -0
  80. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0550.py +0 -0
  81. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0610.py +0 -0
  82. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v0650.py +0 -0
  83. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_eval_v07110.py +0 -0
  84. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/_webhook_cli.py +0 -0
  85. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ab.py +0 -0
  86. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/active_sample.py +0 -0
  87. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/adapters.py +0 -0
  88. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/advise.py +0 -0
  89. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/agent.py +0 -0
  90. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/airgap.py +0 -0
  91. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/apple_adapter.py +0 -0
  92. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/attest.py +0 -0
  93. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/audit_log.py +0 -0
  94. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/autopilot.py +0 -0
  95. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/bench.py +0 -0
  96. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/bom.py +0 -0
  97. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/build.py +0 -0
  98. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/can.py +0 -0
  99. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/chat.py +0 -0
  100. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/compile_cmd.py +0 -0
  101. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/compile_tools.py +0 -0
  102. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/completions.py +0 -0
  103. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/cost.py +0 -0
  104. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data.py +0 -0
  105. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_forge.py +0 -0
  106. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_mix.py +0 -0
  107. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/data_score.py +0 -0
  108. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  109. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/deploy.py +0 -0
  110. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/diagnose.py +0 -0
  111. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/diff.py +0 -0
  112. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/distill_prompt.py +0 -0
  113. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/doctor.py +0 -0
  114. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/drift_alarm.py +0 -0
  115. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/edit.py +0 -0
  116. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/env.py +0 -0
  117. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/eval.py +0 -0
  118. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/expect.py +0 -0
  119. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/export.py +0 -0
  120. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/fetch.py +0 -0
  121. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/generate.py +0 -0
  122. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/history.py +0 -0
  123. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/infer.py +0 -0
  124. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ingest.py +0 -0
  125. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/init.py +0 -0
  126. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/iterative_dpo.py +0 -0
  127. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/license_advisor.py +0 -0
  128. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/llama.py +0 -0
  129. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/local_rl.py +0 -0
  130. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/lock.py +0 -0
  131. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/loop.py +0 -0
  132. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/merge.py +0 -0
  133. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  134. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/migrate.py +0 -0
  135. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/monitor.py +0 -0
  136. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/plan.py +0 -0
  137. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/plugins.py +0 -0
  138. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/probe.py +0 -0
  139. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/profile.py +0 -0
  140. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/prune_prompt.py +0 -0
  141. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/push.py +0 -0
  142. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/quantize.py +0 -0
  143. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/quickstart.py +0 -0
  144. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ra_dit.py +0 -0
  145. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/recipes.py +0 -0
  146. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/registry.py +0 -0
  147. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/runs.py +0 -0
  148. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/serve.py +0 -0
  149. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/steer.py +0 -0
  150. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/sweep.py +0 -0
  151. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tokenizer.py +0 -0
  152. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/train.py +0 -0
  153. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tui.py +0 -0
  154. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/tunability.py +0 -0
  155. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/ui.py +0 -0
  156. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/commands/why.py +0 -0
  157. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/__init__.py +0 -0
  158. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/config/loader.py +0 -0
  159. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/__init__.py +0 -0
  160. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  161. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  162. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  163. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  164. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  165. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  166. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  167. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  168. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  169. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  170. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  171. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  172. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/augment.py +0 -0
  173. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/chat_templates.py +0 -0
  174. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/collators.py +0 -0
  175. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/formats.py +0 -0
  176. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/loader.py +0 -0
  177. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/loss_mask.py +0 -0
  178. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/__init__.py +0 -0
  179. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/_utils.py +0 -0
  180. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/anthropic.py +0 -0
  181. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/ollama.py +0 -0
  182. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/providers/vllm.py +0 -0
  183. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/sft_format.py +0 -0
  184. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/__init__.py +0 -0
  185. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/code.py +0 -0
  186. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/conversation.py +0 -0
  187. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/preference.py +0 -0
  188. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/qa.py +0 -0
  189. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/reasoning.py +0 -0
  190. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/tool_calling.py +0 -0
  191. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/templates/verifiable.py +0 -0
  192. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/__init__.py +0 -0
  193. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/pair_builder.py +0 -0
  194. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/parsers.py +0 -0
  195. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/traces/quality.py +0 -0
  196. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/data/validator.py +0 -0
  197. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/__init__.py +0 -0
  198. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/arena.py +0 -0
  199. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  200. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/calibrate.py +0 -0
  201. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  202. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/custom.py +0 -0
  203. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/forgetting.py +0 -0
  204. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/gate.py +0 -0
  205. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/human.py +0 -0
  206. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/judge.py +0 -0
  207. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/leaderboard.py +0 -0
  208. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/eval/quant_check.py +0 -0
  209. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/experiment/__init__.py +0 -0
  210. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/experiment/tracker.py +0 -0
  211. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/__init__.py +0 -0
  212. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/axolotl.py +0 -0
  213. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/common.py +0 -0
  214. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/llamafactory.py +0 -0
  215. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/migrate/unsloth.py +0 -0
  216. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/__init__.py +0 -0
  217. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/callback.py +0 -0
  218. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  219. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/display.py +0 -0
  220. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  221. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/hf_push.py +0 -0
  222. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  223. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/monitoring/trace_logger.py +0 -0
  224. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/plugins/__init__.py +0 -0
  225. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/py.typed +0 -0
  226. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/recipes/__init__.py +0 -0
  227. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/recipes/catalog.py +0 -0
  228. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/__init__.py +0 -0
  229. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/attach.py +0 -0
  230. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/diff.py +0 -0
  231. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/hashing.py +0 -0
  232. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/registry/store.py +0 -0
  233. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/__init__.py +0 -0
  234. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/audio.yaml +0 -0
  235. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/bco.yaml +0 -0
  236. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/chat.yaml +0 -0
  237. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/code.yaml +0 -0
  238. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/embedding.yaml +0 -0
  239. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  240. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  241. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  242. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/ipo.yaml +0 -0
  243. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/kto.yaml +0 -0
  244. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/longcontext.yaml +0 -0
  245. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/manifest.json +0 -0
  246. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/medical.yaml +0 -0
  247. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/moe.yaml +0 -0
  248. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/orpo.yaml +0 -0
  249. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/pretrain.yaml +0 -0
  250. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/reasoning.yaml +0 -0
  251. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/rlhf.yaml +0 -0
  252. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/simpo.yaml +0 -0
  253. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/tool-calling.yaml +0 -0
  254. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/templates/vision.yaml +0 -0
  255. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/__init__.py +0 -0
  256. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/bco.py +0 -0
  257. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/bitnet.py +0 -0
  258. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/classifier.py +0 -0
  259. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/distill.py +0 -0
  260. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/dpo.py +0 -0
  261. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/embedding.py +0 -0
  262. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/grpo.py +0 -0
  263. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/ipo.py +0 -0
  264. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/kto.py +0 -0
  265. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  266. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  267. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_routing.py +0 -0
  268. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mlx_sft.py +0 -0
  269. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/mole_routing.py +0 -0
  270. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/orpo.py +0 -0
  271. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/ppo.py +0 -0
  272. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/preference.py +0 -0
  273. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/pretrain.py +0 -0
  274. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/prm.py +0 -0
  275. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/raft.py +0 -0
  276. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/reward_model.py +0 -0
  277. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/rewards.py +0 -0
  278. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/simpo.py +0 -0
  279. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/tts.py +0 -0
  280. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/trainer/unlearn.py +0 -0
  281. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/tui_app.py +0 -0
  282. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/__init__.py +0 -0
  283. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/app.py +0 -0
  284. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/plugins/__init__.py +0 -0
  285. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/app.js +0 -0
  286. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/index.html +0 -0
  287. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/logo.png +0 -0
  288. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/logo.svg +0 -0
  289. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/ui/static/style.css +0 -0
  290. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/__init__.py +0 -0
  291. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/_eval_text.py +0 -0
  292. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ab_test.py +0 -0
  293. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/activation_offload.py +0 -0
  294. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/active_sampler.py +0 -0
  295. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_bisect.py +0 -0
  296. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_branch.py +0 -0
  297. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_diff.py +0 -0
  298. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_merge.py +0 -0
  299. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_pr.py +0 -0
  300. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_scan.py +0 -0
  301. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/adapter_sign.py +0 -0
  302. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advanced_precision.py +0 -0
  303. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advise.py +0 -0
  304. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/advise_history.py +0 -0
  305. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_forge.py +0 -0
  306. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_rollout.py +0 -0
  307. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/agent_sandbox.py +0 -0
  308. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/airgap_bundle.py +0 -0
  309. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/annex_xi.py +0 -0
  310. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/anthropic_messages.py +0 -0
  311. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/apple_adapter.py +0 -0
  312. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/attest.py +0 -0
  313. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/audit_log.py +0 -0
  314. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/auto_quant.py +0 -0
  315. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/backend_detect.py +0 -0
  316. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/batch_probe.py +0 -0
  317. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/behavior_battery.py +0 -0
  318. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/bitnet.py +0 -0
  319. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/blame.py +0 -0
  320. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/block_expansion.py +0 -0
  321. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/bom.py +0 -0
  322. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/brain_rot.py +0 -0
  323. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  324. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/build_dag.py +0 -0
  325. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/canary_discovery.py +0 -0
  326. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/canary_router.py +0 -0
  327. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/capability_suite.py +0 -0
  328. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/checklist_dsl.py +0 -0
  329. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  330. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/citation_faithful.py +0 -0
  331. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/classifier.py +0 -0
  332. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cmaes_merge.py +0 -0
  333. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/compile_tools.py +0 -0
  334. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/completions.py +0 -0
  335. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/constants.py +0 -0
  336. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/convergence.py +0 -0
  337. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/crash.py +0 -0
  338. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  339. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/curriculum.py +0 -0
  340. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  341. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/cut_ce.py +0 -0
  342. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_forge.py +0 -0
  343. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_mix.py +0 -0
  344. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_pipeline.py +0 -0
  345. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/data_score.py +0 -0
  346. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deepspeed.py +0 -0
  347. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  348. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/demo_bundles.py +0 -0
  349. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  350. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/deploy_measure.py +0 -0
  351. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  352. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/_common.py +0 -0
  353. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/badge.py +0 -0
  354. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/citation.py +0 -0
  355. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  356. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  357. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/format.py +0 -0
  358. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/live.py +0 -0
  359. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  360. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  361. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  362. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/report.py +0 -0
  363. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/diagnose/runner.py +0 -0
  364. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/distill.py +0 -0
  365. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/dpo_variants.py +0 -0
  366. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/drift_alarm.py +0 -0
  367. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  368. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/echo_trap.py +0 -0
  369. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_diff.py +0 -0
  370. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_governor.py +0 -0
  371. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/edit_kernels.py +0 -0
  372. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/encoding.py +0 -0
  373. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/energy.py +0 -0
  374. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/env_lock.py +0 -0
  375. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/errors.py +0 -0
  376. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_design.py +0 -0
  377. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  378. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  379. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/expectations.py +0 -0
  380. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fetch_examples.py +0 -0
  381. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/flash_attn.py +0 -0
  382. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fp8.py +0 -0
  383. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fsdp.py +0 -0
  384. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  385. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/galore.py +0 -0
  386. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gguf_quant.py +0 -0
  387. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gpu.py +0 -0
  388. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gpu_monitor.py +0 -0
  389. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grace_codebook.py +0 -0
  390. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/graceful_save.py +0 -0
  391. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grad_accum.py +0 -0
  392. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  393. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grpo_long_context.py +0 -0
  394. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/grpo_variants.py +0 -0
  395. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hardware_fit.py +0 -0
  396. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/harm_probe.py +0 -0
  397. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hf.py +0 -0
  398. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hf_space.py +0 -0
  399. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/hubs.py +0 -0
  400. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ingest_sources.py +0 -0
  401. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/integrations.py +0 -0
  402. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/interference.py +0 -0
  403. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/interference_live.py +0 -0
  404. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/irt.py +0 -0
  405. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/iterative_dpo.py +0 -0
  406. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  407. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/kernel_picker.py +0 -0
  408. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/knowledge_edit.py +0 -0
  409. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/kv_cache.py +0 -0
  410. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/launcher.py +0 -0
  411. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/license_advisor.py +0 -0
  412. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/license_matrix.py +0 -0
  413. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/liger.py +0 -0
  414. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/live_eval.py +0 -0
  415. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/llama_proxy.py +0 -0
  416. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/llama_server_timings.py +0 -0
  417. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/local_rl.py +0 -0
  418. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  419. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loftq_init.py +0 -0
  420. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/log_level.py +0 -0
  421. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/long_context.py +0 -0
  422. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/longlora.py +0 -0
  423. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_budget.py +0 -0
  424. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_daemon.py +0 -0
  425. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_iteration.py +0 -0
  426. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_stages.py +0 -0
  427. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/loop_state.py +0 -0
  428. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/lr_finder.py +0 -0
  429. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/lr_groups.py +0 -0
  430. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/magpie.py +0 -0
  431. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/metrics.py +0 -0
  432. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mii.py +0 -0
  433. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/minillm.py +0 -0
  434. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mix_proxy.py +0 -0
  435. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mixed_precision.py +0 -0
  436. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mlx.py +0 -0
  437. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mod.py +0 -0
  438. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/moe.py +0 -0
  439. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/moe_quant.py +0 -0
  440. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/mole_routing.py +0 -0
  441. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack.py +0 -0
  442. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack_sampler.py +0 -0
  443. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/multipack_trainer.py +0 -0
  444. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/namespace_pin.py +0 -0
  445. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/neat_packing.py +0 -0
  446. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ngram_spec.py +0 -0
  447. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/nlg_metrics.py +0 -0
  448. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ollama.py +0 -0
  449. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/onboarding.py +0 -0
  450. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  451. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/paths.py +0 -0
  452. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_builder.py +0 -0
  453. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_patches.py +0 -0
  454. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/peft_wiring.py +0 -0
  455. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/persona_hub.py +0 -0
  456. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/pipeline.py +0 -0
  457. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/preference_combine.py +0 -0
  458. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prm.py +0 -0
  459. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/probe_kernel.py +0 -0
  460. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/probe_pack.py +0 -0
  461. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiler.py +0 -0
  462. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiling.py +0 -0
  463. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  464. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prompt_compile.py +0 -0
  465. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prompt_distill.py +0 -0
  466. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/prune_prompt.py +0 -0
  467. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/qat.py +0 -0
  468. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/qr_url.py +0 -0
  469. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/quality.py +0 -0
  470. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/quant_menu.py +0 -0
  471. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ra_dit.py +0 -0
  472. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ra_dit_run.py +0 -0
  473. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/raft.py +0 -0
  474. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reasoning_effort.py +0 -0
  475. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reasoning_parser.py +0 -0
  476. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/recipe_dag.py +0 -0
  477. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/recipe_run.py +0 -0
  478. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/registry.py +0 -0
  479. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/relora.py +0 -0
  480. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/replay.py +0 -0
  481. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/repro_receipt.py +0 -0
  482. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/reward_hacking.py +0 -0
  483. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ring_attention.py +0 -0
  484. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  485. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  486. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/run_cost.py +0 -0
  487. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sae_diff.py +0 -0
  488. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/save_formats.py +0 -0
  489. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/server_tools.py +0 -0
  490. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sglang.py +0 -0
  491. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/shortcuts.py +0 -0
  492. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/signing.py +0 -0
  493. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sleeper_probe.py +0 -0
  494. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/soup_lock.py +0 -0
  495. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/spec_pairing.py +0 -0
  496. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/spike_recovery.py +0 -0
  497. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sse_train_stream.py +0 -0
  498. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/steering.py +0 -0
  499. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/strict_safetensors.py +0 -0
  500. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/structured_output.py +0 -0
  501. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/sweep_config.py +0 -0
  502. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tail_latency.py +0 -0
  503. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/terraform_plan.py +0 -0
  504. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tool_outputs.py +0 -0
  505. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/topology.py +0 -0
  506. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tracing.py +0 -0
  507. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trackers.py +0 -0
  508. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/train_event_buffer.py +0 -0
  509. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trainer_plugins.py +0 -0
  510. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/trust_remote.py +0 -0
  511. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/truth_probe.py +0 -0
  512. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tts.py +0 -0
  513. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tts_codec.py +0 -0
  514. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/tunability.py +0 -0
  515. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/ui_env.py +0 -0
  516. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/uld.py +0 -0
  517. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  518. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearning.py +0 -0
  519. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unlearning_eval.py +0 -0
  520. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/unsloth.py +0 -0
  521. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/v028_features.py +0 -0
  522. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vector_bank.py +0 -0
  523. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vllm.py +0 -0
  524. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/vscode_setup.py +0 -0
  525. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/warmup.py +0 -0
  526. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/webhooks.py +0 -0
  527. {soup_cli-0.71.22 → soup_cli-0.71.23}/src/soup_cli/utils/why.py +0 -0
  528. {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/chat.yaml +0 -0
  529. {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/code.yaml +0 -0
  530. {soup_cli-0.71.22 → soup_cli-0.71.23}/templates/medical.yaml +0 -0
  531. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/__init__.py +0 -0
  532. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/conftest.py +0 -0
  533. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v053_qa.md +0 -0
  534. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v07114_qa.md +0 -0
  535. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/qa/v0716_qa.md +0 -0
  536. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_adapters.py +0 -0
  537. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_advanced_peft.py +0 -0
  538. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_assistant_mask.py +0 -0
  539. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_audio.py +0 -0
  540. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_auto_tuning.py +0 -0
  541. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_autopilot.py +0 -0
  542. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_awq_gptq_export.py +0 -0
  543. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_batch_probe.py +0 -0
  544. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bco.py +0 -0
  545. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bench.py +0 -0
  546. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_brain_rot_multilingual.py +0 -0
  547. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_bugfixes.py +0 -0
  548. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_build_dag.py +0 -0
  549. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_callback.py +0 -0
  550. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cans.py +0 -0
  551. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_chat.py +0 -0
  552. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_chat_template.py +0 -0
  553. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cli.py +0 -0
  554. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cli_subprocess.py +0 -0
  555. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_config.py +0 -0
  556. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_cost.py +0 -0
  557. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_crash_reporter.py +0 -0
  558. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_curriculum.py +0 -0
  559. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data.py +0 -0
  560. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_augment.py +0 -0
  561. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_sample.py +0 -0
  562. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_split.py +0 -0
  563. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_data_tools.py +0 -0
  564. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dataset_hub.py +0 -0
  565. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dataset_registry.py +0 -0
  566. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_deepspeed.py +0 -0
  567. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_deploy_ollama.py +0 -0
  568. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_diff.py +0 -0
  569. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_display.py +0 -0
  570. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_doctor.py +0 -0
  571. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dpo_example.py +0 -0
  572. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_dpo_variants.py +0 -0
  573. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_embedding.py +0 -0
  574. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_errors.py +0 -0
  575. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval.py +0 -0
  576. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval_gate.py +0 -0
  577. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_eval_platform.py +0 -0
  578. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_export.py +0 -0
  579. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_formats.py +0 -0
  580. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_fp8_recipe.py +0 -0
  581. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_freeze_training.py +0 -0
  582. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_generate.py +0 -0
  583. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_gpu.py +0 -0
  584. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_grpo.py +0 -0
  585. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_hf_integration.py +0 -0
  586. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_infer.py +0 -0
  587. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_inference_advanced.py +0 -0
  588. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_init.py +0 -0
  589. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ipo.py +0 -0
  590. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_jinja_analyzer.py +0 -0
  591. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_kto.py +0 -0
  592. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_loader.py +0 -0
  593. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_log_level.py +0 -0
  594. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_loss_watchdog.py +0 -0
  595. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_merge.py +0 -0
  596. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_migrate.py +0 -0
  597. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_mlx_backend.py +0 -0
  598. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_moe.py +0 -0
  599. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multi_adapter.py +0 -0
  600. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multi_gpu.py +0 -0
  601. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_config.py +0 -0
  602. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_invariants.py +0 -0
  603. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_multipack_sampler.py +0 -0
  604. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_neat_packing.py +0 -0
  605. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_neftune_rslora.py +0 -0
  606. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_onnx_tensorrt_export.py +0 -0
  607. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_orpo.py +0 -0
  608. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_packing.py +0 -0
  609. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_a_wave1.py +0 -0
  610. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_a_wave2.py +0 -0
  611. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_b.py +0 -0
  612. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_c.py +0 -0
  613. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_d.py +0 -0
  614. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_e.py +0 -0
  615. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_part_f_hardening.py +0 -0
  616. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_peft_methods.py +0 -0
  617. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_peft_patches.py +0 -0
  618. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_performance.py +0 -0
  619. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_pissa_init.py +0 -0
  620. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ppo.py +0 -0
  621. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_dispatcher.py +0 -0
  622. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_multi.py +0 -0
  623. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_preference_multi_runtime.py +0 -0
  624. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_pretrain.py +0 -0
  625. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_profile.py +0 -0
  626. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_profiling.py +0 -0
  627. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_progress.py +0 -0
  628. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_push.py +0 -0
  629. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_qat.py +0 -0
  630. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quality_filter.py +0 -0
  631. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quant_check.py +0 -0
  632. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quant_menu.py +0 -0
  633. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_quickstart.py +0 -0
  634. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_rank_pattern.py +0 -0
  635. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_recipes.py +0 -0
  636. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_recipes_v031.py +0 -0
  637. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_refusal_multilingual.py +0 -0
  638. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_registry.py +0 -0
  639. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_relora.py +0 -0
  640. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_replay.py +0 -0
  641. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_resume.py +0 -0
  642. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_rlvr.py +0 -0
  643. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_run_cost.py +0 -0
  644. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_runs.py +0 -0
  645. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_serve.py +0 -0
  646. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_server_generate.py +0 -0
  647. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_sglang_serve.py +0 -0
  648. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_simpo.py +0 -0
  649. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_smoke_train.py +0 -0
  650. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_speculative_decoding.py +0 -0
  651. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_sweep.py +0 -0
  652. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_synth_data_pro.py +0 -0
  653. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_templates_yaml.py +0 -0
  654. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tensorboard.py +0 -0
  655. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tool_calling.py +0 -0
  656. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trace_to_pref.py +0 -0
  657. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tracker.py +0 -0
  658. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trainer_coverage_v035.py +0 -0
  659. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trainer_init.py +0 -0
  660. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_training_intelligence.py +0 -0
  661. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_training_speed.py +0 -0
  662. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_trust_remote_code.py +0 -0
  663. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_tui.py +0 -0
  664. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui.py +0 -0
  665. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_chat.py +0 -0
  666. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_config_builder.py +0 -0
  667. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_live_monitor.py +0 -0
  668. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_ui_metrics.py +0 -0
  669. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_unsloth.py +0 -0
  670. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_c.py +0 -0
  671. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_d.py +0 -0
  672. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0401_part_e.py +0 -0
  673. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0402_part_a.py +0 -0
  674. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0402_part_b.py +0 -0
  675. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_a.py +0 -0
  676. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_b.py +0 -0
  677. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0403_part_c.py +0 -0
  678. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0404_part_a.py +0 -0
  679. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0404_part_b.py +0 -0
  680. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0405_part_a.py +0 -0
  681. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0406_part_a.py +0 -0
  682. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_a.py +0 -0
  683. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_b.py +0 -0
  684. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0410_part_c.py +0 -0
  685. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0420.py +0 -0
  686. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_a.py +0 -0
  687. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_b.py +0 -0
  688. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_c.py +0 -0
  689. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0430_part_d.py +0 -0
  690. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_a.py +0 -0
  691. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_b.py +0 -0
  692. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_c.py +0 -0
  693. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_part_d.py +0 -0
  694. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0440_review_followups.py +0 -0
  695. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0450.py +0 -0
  696. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0460_part_a.py +0 -0
  697. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0460_part_b.py +0 -0
  698. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0470_part_a.py +0 -0
  699. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0470_part_b.py +0 -0
  700. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0480_part_a.py +0 -0
  701. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0480_part_b.py +0 -0
  702. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0490.py +0 -0
  703. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_a.py +0 -0
  704. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_b.py +0 -0
  705. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_c.py +0 -0
  706. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_d.py +0 -0
  707. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0500_part_e.py +0 -0
  708. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0510.py +0 -0
  709. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0520.py +0 -0
  710. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0530.py +0 -0
  711. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v05310.py +0 -0
  712. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v05311.py +0 -0
  713. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_109.py +0 -0
  714. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_139.py +0 -0
  715. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_142.py +0 -0
  716. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0531_82.py +0 -0
  717. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0532.py +0 -0
  718. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0533.py +0 -0
  719. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0534.py +0 -0
  720. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0535.py +0 -0
  721. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0536.py +0 -0
  722. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0537.py +0 -0
  723. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0538.py +0 -0
  724. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0539.py +0 -0
  725. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0540.py +0 -0
  726. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0550.py +0 -0
  727. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0550_followups.py +0 -0
  728. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0560.py +0 -0
  729. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_a.py +0 -0
  730. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_b.py +0 -0
  731. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_c.py +0 -0
  732. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0570_part_d.py +0 -0
  733. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0580.py +0 -0
  734. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0590.py +0 -0
  735. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_a.py +0 -0
  736. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_b.py +0 -0
  737. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_c.py +0 -0
  738. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_d.py +0 -0
  739. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_e.py +0 -0
  740. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0600_part_f.py +0 -0
  741. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_a.py +0 -0
  742. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_b.py +0 -0
  743. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_c.py +0 -0
  744. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_d.py +0 -0
  745. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0610_part_e.py +0 -0
  746. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_followups.py +0 -0
  747. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_a.py +0 -0
  748. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_b.py +0 -0
  749. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_c.py +0 -0
  750. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_d.py +0 -0
  751. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0620_part_e.py +0 -0
  752. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_followups.py +0 -0
  753. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_a.py +0 -0
  754. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_b.py +0 -0
  755. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_c.py +0 -0
  756. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_d.py +0 -0
  757. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0630_part_e.py +0 -0
  758. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0631_206.py +0 -0
  759. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_followups.py +0 -0
  760. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_a.py +0 -0
  761. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_b.py +0 -0
  762. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_c.py +0 -0
  763. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_d.py +0 -0
  764. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_e.py +0 -0
  765. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0640_part_f.py +0 -0
  766. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_followups.py +0 -0
  767. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_a.py +0 -0
  768. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_b.py +0 -0
  769. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_c.py +0 -0
  770. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_d.py +0 -0
  771. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0650_part_e.py +0 -0
  772. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_cli.py +0 -0
  773. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_followups.py +0 -0
  774. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_a.py +0 -0
  775. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_b.py +0 -0
  776. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_c.py +0 -0
  777. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_d.py +0 -0
  778. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0660_part_e.py +0 -0
  779. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_followups.py +0 -0
  780. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_a.py +0 -0
  781. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_b.py +0 -0
  782. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_c.py +0 -0
  783. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_d.py +0 -0
  784. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_e.py +0 -0
  785. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0670_part_f.py +0 -0
  786. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_followups.py +0 -0
  787. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_a.py +0 -0
  788. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_b.py +0 -0
  789. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_c.py +0 -0
  790. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_d.py +0 -0
  791. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0680_part_e.py +0 -0
  792. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_a.py +0 -0
  793. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_b.py +0 -0
  794. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_c.py +0 -0
  795. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_d.py +0 -0
  796. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0690_part_e.py +0 -0
  797. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_a.py +0 -0
  798. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_b.py +0 -0
  799. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_c.py +0 -0
  800. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_d.py +0 -0
  801. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_e.py +0 -0
  802. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0700_part_f.py +0 -0
  803. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07110.py +0 -0
  804. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07111.py +0 -0
  805. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07112.py +0 -0
  806. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07113.py +0 -0
  807. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07114.py +0 -0
  808. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07115.py +0 -0
  809. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07116.py +0 -0
  810. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07117.py +0 -0
  811. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07118.py +0 -0
  812. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07119.py +0 -0
  813. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0712.py +0 -0
  814. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07120.py +0 -0
  815. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07121.py +0 -0
  816. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v07122.py +0 -0
  817. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0713.py +0 -0
  818. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0714.py +0 -0
  819. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0715.py +0 -0
  820. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0716.py +0 -0
  821. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0717.py +0 -0
  822. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0718.py +0 -0
  823. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_v0719.py +0 -0
  824. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_validator.py +0 -0
  825. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_vision.py +0 -0
  826. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_vllm_serve.py +0 -0
  827. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_why.py +0 -0
  828. {soup_cli-0.71.22 → soup_cli-0.71.23}/tests/test_windows_encoding.py +0 -0
@@ -41,22 +41,7 @@ report.xml
41
41
  *.key
42
42
 
43
43
  # Internal plan + Claude Code local dev instructions (not for repo)
44
- .claude/plan.md
45
- .claude/CLAUDE.md
46
- .claude/settings.json
47
- .claude/scheduled_tasks.lock
48
- .claude/*.lock
49
- .claude/settings.local.json
50
-
51
- # ECC plugin (local only)
52
- .claude/agents/
53
- .claude/commands/
54
- .claude/examples/
55
- .claude/hooks/
56
- .claude/mcp-configs/
57
- .claude/rules/
58
- .claude/skills/
59
- .claude/settings.json
44
+ .claude/
60
45
  .coverage
61
46
 
62
47
  # Local scratch / temp scripts at repo root (e.g. _smoke.py, _scratch.py) — never committed
@@ -12,6 +12,39 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.23] - 2026-06-12
16
+
17
+ ### Added
18
+ - **Native Spectrum targeted training (closes #266).** A new `soup spectrum
19
+ scan` reads a model's `.safetensors` shards **one tensor at a time** (no
20
+ model load — peak RAM is the largest single weight matrix), computes a
21
+ singular-value SNR per weight matrix with a Marchenko-Pastur noise threshold
22
+ (arXiv:2406.06623), ranks layers within each module-type group and prints
23
+ the top `--top-percent` as a ready-to-paste `training.unfrozen_parameters`
24
+ YAML block. This lets you scan even a very large model's layer SNR on a CPU
25
+ box and then full-fine-tune only the high-signal layers.
26
+ - `soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn|all] [--output patch.yaml]`
27
+ — SNR table + the YAML patch; results cache at `~/.soup/spectrum/<slug>.json`
28
+ (override via `SOUP_SPECTRUM_CACHE_DIR`).
29
+ - New schema field `training.unfrozen_parameters: list[str]` — regex patterns
30
+ of parameter names to keep trainable; the SFT trainer freezes every
31
+ parameter then unfreezes the matched set (full fine-tuning, LoRA off).
32
+ Mutually exclusive with LoRA features / `freeze_layers` / `freeze_ratio` /
33
+ `train_router_only` / `expand_layers`; requires `task=sft`,
34
+ `backend=transformers`, `modality=text`, and `quantization=none`.
35
+ - The SNR kernel is pure-numpy and transpose-invariant (singular values are
36
+ identical for `W` and `W.T`); GPT-2 `Conv1D` naming
37
+ (`c_attn`/`c_fc`/`c_proj`) is recognised alongside Llama-style names.
38
+ - The existing `spectrum` trainer-plugin wrapper is untouched (back-compat).
39
+ LISA (per-step layer sampling) is tracked separately in #267.
40
+
41
+ ### Security
42
+ - `soup spectrum scan` validates `unfrozen_parameters` patterns at parse time:
43
+ rejects nested-unbounded-quantifier regexes (ReDoS), null bytes, empties, and
44
+ caps count (50k) and length (512). Hub downloads route through the
45
+ SSRF-hardened, namespace-pinned `hubs.snapshot_download`; symlinked shards and
46
+ matrices above a 2^31-element SVD cap are skipped; `--output` stays under cwd.
47
+
15
48
  ## [0.71.22] - 2026-06-10
16
49
 
17
50
  ### Added
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (293 files, 14184 tests)
123
+ tests/ - Test suite (294 files, 14278 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.22
3
+ Version: 0.71.23
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -189,22 +189,19 @@ infrastructure instead of improving models. Soup fixes that.
189
189
 
190
190
  ## What's New
191
191
 
192
- **v0.71.22Perf & measure polish.** Four live paths from the recent BETA lifts get tighter:
193
-
194
- - **MiniLLM on-policy distillation is fast**the on-policy rollout
195
- (`training.minillm_on_policy: true`) now threads a KV cache so each step forwards only the new
196
- token instead of re-feeding the whole prefix, resolving the earlier O(L²) cost. A LoRA student
197
- activates the cache too (the PEFT wrapper is unwrapped before the cache check).
198
- - **`soup serve --mole` uses a KV cache** each task adapter in a served MoLE keeps its own cache
199
- in lockstep, created fresh per request (no cross-request leak). Output is byte-identical to the
200
- previous no-cache path.
201
- - **`soup deploy autopilot --measure` is real and frugal** — a first-party transformers loader
202
- factory loads each candidate live (per-candidate quant config), scores the baseline **once**, and
203
- pre-validates the whole `--measure-candidates` list up front, so a typo fails before any model
204
- load instead of burning N loads or doubling peak VRAM.
205
- - **Live-codec TTS via SNAC (Orpheus)** — encoding raw audio at train time (`data.format: audio`)
206
- is validated for Orpheus: audio is duration- and byte-capped from `soundfile.info` **before**
207
- decoding into RAM, and read through a symlink-safe file descriptor.
192
+ **v0.71.23Native Spectrum targeted training.** Fine-tune only the layers that matter no 8×H100 needed to find them:
193
+
194
+ - **`soup spectrum scan --model <id|path> --top-percent 50`** streams a model's weights one
195
+ tensor at a time (no model load, runs on a CPU box even for very large models) and computes a
196
+ singular-value signal-to-noise ratio per weight matrix (Marchenko-Pastur, arXiv:2406.06623).
197
+ - **Ready-to-paste patch** prints a per-group SNR table and a `training.unfrozen_parameters`
198
+ YAML block; pipe it straight into your `soup.yaml`. Results cache under `~/.soup/spectrum/`.
199
+ - **Targeted full fine-tuning** with `training.unfrozen_parameters` set, `soup train` freezes
200
+ every parameter and unfreezes only the matched high-SNR layers (full FT, LoRA off) — train
201
+ fewer parameters, keep more of the base model intact.
202
+ - **Honest guards** the scan is pure-numpy and transpose-invariant; patterns are ReDoS-checked,
203
+ Hub downloads go through the SSRF-hardened loader, and the config gates `quantization: none` +
204
+ `task: sft` so a mis-set flag fails loudly, not silently.
208
205
 
209
206
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
210
207
 
@@ -49,22 +49,19 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.22Perf & measure polish.** Four live paths from the recent BETA lifts get tighter:
53
-
54
- - **MiniLLM on-policy distillation is fast**the on-policy rollout
55
- (`training.minillm_on_policy: true`) now threads a KV cache so each step forwards only the new
56
- token instead of re-feeding the whole prefix, resolving the earlier O(L²) cost. A LoRA student
57
- activates the cache too (the PEFT wrapper is unwrapped before the cache check).
58
- - **`soup serve --mole` uses a KV cache** each task adapter in a served MoLE keeps its own cache
59
- in lockstep, created fresh per request (no cross-request leak). Output is byte-identical to the
60
- previous no-cache path.
61
- - **`soup deploy autopilot --measure` is real and frugal** — a first-party transformers loader
62
- factory loads each candidate live (per-candidate quant config), scores the baseline **once**, and
63
- pre-validates the whole `--measure-candidates` list up front, so a typo fails before any model
64
- load instead of burning N loads or doubling peak VRAM.
65
- - **Live-codec TTS via SNAC (Orpheus)** — encoding raw audio at train time (`data.format: audio`)
66
- is validated for Orpheus: audio is duration- and byte-capped from `soundfile.info` **before**
67
- decoding into RAM, and read through a symlink-safe file descriptor.
52
+ **v0.71.23Native Spectrum targeted training.** Fine-tune only the layers that matter no 8×H100 needed to find them:
53
+
54
+ - **`soup spectrum scan --model <id|path> --top-percent 50`** streams a model's weights one
55
+ tensor at a time (no model load, runs on a CPU box even for very large models) and computes a
56
+ singular-value signal-to-noise ratio per weight matrix (Marchenko-Pastur, arXiv:2406.06623).
57
+ - **Ready-to-paste patch** prints a per-group SNR table and a `training.unfrozen_parameters`
58
+ YAML block; pipe it straight into your `soup.yaml`. Results cache under `~/.soup/spectrum/`.
59
+ - **Targeted full fine-tuning** with `training.unfrozen_parameters` set, `soup train` freezes
60
+ every parameter and unfreezes only the matched high-SNR layers (full FT, LoRA off) — train
61
+ fewer parameters, keep more of the base model intact.
62
+ - **Honest guards** the scan is pure-numpy and transpose-invariant; patterns are ReDoS-checked,
63
+ Hub downloads go through the SSRF-hardened loader, and the config gates `quantization: none` +
64
+ `task: sft` so a mis-set flag fails loudly, not silently.
68
65
 
69
66
  Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
70
67
 
@@ -25,6 +25,7 @@ soup push --model ./output --repo user/name --collection user/coll-abc123 Add t
25
25
  soup merge --adapter ./output Merge LoRA with base model
26
26
  soup merge-sharded-fsdp-weights ./shards -o merged.safetensors Consolidate FSDP shards into one safetensors (v0.71.14; --plan-only previews)
27
27
  soup delinearize-llama4 ./src --target ./out [--num-experts N] [--plan-only] Live Llama-4 fused-expert reshape [E*din,dout] -> [E,din,dout] + sidecar copy (v0.71.21)
28
+ soup spectrum scan --model <id|path> --top-percent 50 [--modules mlp,attn] [-o patch.yaml] Spectrum SNR scan (no model load) -> training.unfrozen_parameters YAML patch (v0.71.23)
28
29
  soup export --model ./output --format gguf Export to GGUF (Ollama)
29
30
  soup export --model ./output --deploy ollama Export GGUF + auto-deploy to Ollama
30
31
  soup export --model ./output --format onnx Export to ONNX
@@ -1026,10 +1026,13 @@ prepends the family's emotion control string to the first user turn.
1026
1026
  **Live-codec (hardware/dependency-gated).** Setting `data.format: audio` asks
1027
1027
  the trainer to encode raw audio into codec tokens **at train time**, which needs
1028
1028
  the family's heavyweight codec package (`snac` for Orpheus, `moshi` for
1029
- Sesame-CSM, `xcodec2` for Llasa, `sparktts` for Spark, `outetts` for Oute). This
1030
- path surfaces a friendly per-family `RuntimeError` naming the required `pip
1031
- install` and is not validated on the maintainer's box use the pre-encoded
1032
- workflow above for a runnable fine-tune.
1029
+ Sesame-CSM, `xcodec2` for Llasa, `sparktts` for Spark, `outetts` for Oute). The
1030
+ **Orpheus** path is live install `pip install snac` and a 24 kHz mono wav is
1031
+ encoded to SNAC codec tokens end-to-end (audio is duration- and byte-capped and
1032
+ read through an `O_NOFOLLOW` fd). The other four families still surface a
1033
+ friendly per-family `RuntimeError` naming the required `pip install` and are not
1034
+ yet validated on the maintainer's box — use the pre-encoded workflow above for a
1035
+ runnable fine-tune with those.
1033
1036
 
1034
1037
  Five ready-made recipes ship: `orpheus-tts-sft`, `sesame-csm-tts`, `llasa-tts`,
1035
1038
  `spark-tts`, `oute-tts` — copy with `soup recipes use <name>`. Cross-validators
@@ -1142,3 +1145,48 @@ rejected at the schema gate for non-supported arches and for `use_ring_attention
1142
1145
  Pick one of MoD / LLaMA Pro / LongLoRA per run. (v0.71.12)
1143
1146
 
1144
1147
 
1148
+ ## Spectrum — Targeted Training on Layer SNR (`soup spectrum scan`, v0.71.23)
1149
+
1150
+ Spectrum (arXiv:2406.06623) fine-tunes only the layers with the most signal. `soup spectrum scan`
1151
+ streams a model's `.safetensors` shards **one tensor at a time** — there is no model load, so it
1152
+ runs on a CPU box even for very large models — and computes a singular-value signal-to-noise ratio
1153
+ per weight matrix with a Marchenko-Pastur noise threshold. It ranks the layers within each
1154
+ module-type group and prints the top `--top-percent` as a ready-to-paste config block:
1155
+
1156
+ ```bash
1157
+ soup spectrum scan --model HuggingFaceTB/SmolLM2-135M --top-percent 25 --modules mlp,attn -o patch.yaml
1158
+ ```
1159
+
1160
+ ```yaml
1161
+ # patch.yaml — paste into your soup.yaml
1162
+ training:
1163
+ unfrozen_parameters:
1164
+ - model.layers.0.mlp.down_proj
1165
+ - model.layers.29.self_attn.v_proj
1166
+ # ...
1167
+ ```
1168
+
1169
+ Then train with the patch — the SFT trainer freezes **every** parameter and unfreezes only the
1170
+ matched set (full fine-tuning, LoRA off):
1171
+
1172
+ ```yaml
1173
+ base: HuggingFaceTB/SmolLM2-135M
1174
+ task: sft
1175
+ training:
1176
+ quantization: none # Spectrum trains float weights — quantization off
1177
+ unfrozen_parameters:
1178
+ - model.layers.0.mlp.down_proj
1179
+ - model.layers.29.self_attn.v_proj
1180
+ ```
1181
+
1182
+ `unfrozen_parameters` entries are regex patterns matched against parameter names. It requires
1183
+ `task: sft`, `backend: transformers`, `modality: text`, and `quantization: none`, and is mutually
1184
+ exclusive with LoRA features (`use_dora` / `use_vera` / `moe_lora` / `relora_steps` / …) and the
1185
+ other freezing knobs (`freeze_layers` / `freeze_ratio` / `train_router_only` / `expand_layers`) —
1186
+ a conflicting combo is rejected loudly at config load. Scans cache under `~/.soup/spectrum/`
1187
+ (override with `SOUP_SPECTRUM_CACHE_DIR`); `--no-cache` skips it. `--modules mlp,attn` (vs the
1188
+ `all` default) is recommended for very large models — it skips the giant embedding/lm_head matrices.
1189
+ The SNR kernel is pure-numpy and transpose-invariant, so GPT-2 `Conv1D` weights score the same as
1190
+ Linear weights. (v0.71.23)
1191
+
1192
+
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.22"
7
+ version = "0.71.23"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.22"
3
+ __version__ = "0.71.23"
@@ -58,6 +58,7 @@ from soup_cli.commands import ( # noqa: E402
58
58
  from soup_cli.commands import monitor as monitor_cmd # noqa: E402
59
59
  from soup_cli.commands import quantize as quantize_cmd # noqa: E402
60
60
  from soup_cli.commands import quickstart as quickstart_cmd # noqa: E402
61
+ from soup_cli.commands import spectrum as spectrum_cmd # noqa: E402
61
62
  from soup_cli.commands import ( # noqa: E402
62
63
  tui as tui_cmd,
63
64
  )
@@ -136,6 +137,10 @@ app.add_typer(
136
137
  app.command(name="history")(history.history)
137
138
  app.command(name="why")(why_cmd.why)
138
139
  app.command(name="tui")(tui_cmd.tui)
140
+ app.add_typer(
141
+ spectrum_cmd.app, name="spectrum",
142
+ help="Spectrum SNR scan for targeted training (v0.71.23).",
143
+ )
139
144
  app.add_typer(
140
145
  can.app, name="can",
141
146
  help="Soup Cans: pack/inspect/verify/fork shareable .can artifacts.",
@@ -0,0 +1,174 @@
1
+ """soup spectrum — native Spectrum targeted-training scan (#266, v0.71.23).
2
+
3
+ ``soup spectrum scan`` streams a model's ``.safetensors`` shards (NO model
4
+ load), computes a singular-value SNR per weight matrix (arXiv:2406.06623),
5
+ ranks layers within each module-type group and prints the top ``--top-percent``
6
+ as a ready-to-paste ``training.unfrozen_parameters`` YAML block. Paste it into
7
+ a ``soup.yaml`` to fine-tune only the high-SNR layers (full FT, LoRA off).
8
+
9
+ The scan is pure-numpy and runs on a CPU box even for very large models —
10
+ peak RSS is the largest single weight matrix, not the whole model.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ from collections import defaultdict
15
+ from typing import TYPE_CHECKING, Optional
16
+
17
+ import typer
18
+ from rich.console import Console
19
+ from rich.markup import escape
20
+ from rich.panel import Panel
21
+ from rich.table import Table
22
+
23
+ if TYPE_CHECKING: # static types only — the import is numpy-lazy at runtime
24
+ from soup_cli.utils.spectrum_scan import LayerSNR, ScanResult
25
+
26
+ console = Console()
27
+
28
+ app = typer.Typer(
29
+ no_args_is_help=True,
30
+ help="Spectrum SNR scan for targeted training (v0.71.23).",
31
+ )
32
+
33
+
34
+ @app.callback()
35
+ def _spectrum() -> None:
36
+ """Spectrum SNR scan for targeted training (v0.71.23).
37
+
38
+ An explicit callback keeps this a command group (Typer otherwise collapses
39
+ a single-command app and drops the ``scan`` subcommand name).
40
+ """
41
+
42
+
43
+ def _render_table(
44
+ result: "ScanResult", kept: list[str], top_percent: float
45
+ ) -> None:
46
+ # Group by the same key as select_unfrozen_parameters (the layer-type
47
+ # signature), so the "Kept" column can never desync from the selection.
48
+ from soup_cli.utils.spectrum_scan import param_prefix
49
+
50
+ kept_set = set(kept)
51
+ groups: dict[str, list["LayerSNR"]] = defaultdict(list)
52
+ for layer in result.layers:
53
+ groups[layer.group].append(layer)
54
+
55
+ table = Table(
56
+ title=f"Spectrum SNR — {escape(result.model)} "
57
+ f"(top {top_percent:g}% per group)"
58
+ )
59
+ table.add_column("Type")
60
+ table.add_column("Group")
61
+ table.add_column("Layers", justify="right")
62
+ table.add_column("Kept", justify="right")
63
+ table.add_column("SNR min / mean / max", justify="right")
64
+
65
+ for group in sorted(groups):
66
+ items = groups[group]
67
+ snrs = [layer.snr for layer in items]
68
+ n_kept = sum(1 for layer in items if param_prefix(layer.name) in kept_set)
69
+ table.add_row(
70
+ items[0].module_type,
71
+ escape(group),
72
+ str(len(items)),
73
+ str(n_kept),
74
+ f"{min(snrs):.3f} / {sum(snrs) / len(snrs):.3f} / {max(snrs):.3f}",
75
+ )
76
+ console.print(table)
77
+
78
+
79
+ @app.command()
80
+ def scan(
81
+ model: str = typer.Option(
82
+ ..., "--model", "-m", help="HF Hub id or local model directory."
83
+ ),
84
+ top_percent: float = typer.Option(
85
+ 50.0,
86
+ "--top-percent",
87
+ help="Keep the top N% of layers (by SNR) within each module type.",
88
+ ),
89
+ modules: str = typer.Option(
90
+ "all",
91
+ "--modules",
92
+ help="Comma list of module types to scan: e.g. 'mlp,attn' — or 'all'.",
93
+ ),
94
+ output: Optional[str] = typer.Option(
95
+ None,
96
+ "--output",
97
+ "-o",
98
+ help="Write the YAML patch to this path (must stay under cwd).",
99
+ ),
100
+ no_cache: bool = typer.Option(
101
+ False, "--no-cache", help="Skip the ~/.soup/spectrum scan cache."
102
+ ),
103
+ ) -> None:
104
+ """Scan a model's layer SNR and emit a ``training.unfrozen_parameters`` patch."""
105
+ import yaml
106
+
107
+ from soup_cli.utils.spectrum_scan import scan_model, select_unfrozen_parameters
108
+
109
+ if not (0 < top_percent <= 100):
110
+ console.print("[red]--top-percent must be in (0, 100].[/]")
111
+ raise typer.Exit(2)
112
+
113
+ # Validate the output path up front (before the scan work) so a bad
114
+ # destination fails fast rather than after a long scan.
115
+ if output is not None:
116
+ from soup_cli.utils.paths import enforce_under_cwd_and_no_symlink
117
+
118
+ try:
119
+ enforce_under_cwd_and_no_symlink(output, "output")
120
+ except (ValueError, TypeError) as exc:
121
+ console.print(f"[red]{escape(str(exc))}[/]")
122
+ raise typer.Exit(2) from exc
123
+
124
+ try:
125
+ result = scan_model(model, modules=modules, use_cache=not no_cache)
126
+ except (ValueError, FileNotFoundError, RuntimeError, OSError) as exc:
127
+ console.print(f"[red]Spectrum scan failed:[/] {escape(str(exc))}")
128
+ raise typer.Exit(1) from exc
129
+ except Exception as exc: # hub validation / unexpected — friendly, no traceback
130
+ console.print(
131
+ f"[red]Spectrum scan failed:[/] "
132
+ f"{escape(type(exc).__name__)}: {escape(str(exc))}"
133
+ )
134
+ raise typer.Exit(1) from exc
135
+
136
+ if not result.layers:
137
+ console.print(
138
+ "[yellow]No scannable 2-D weight matrices found "
139
+ "(check --model and --modules).[/]"
140
+ )
141
+ raise typer.Exit(1)
142
+
143
+ try:
144
+ kept = select_unfrozen_parameters(
145
+ result.layers, top_percent=top_percent, modules=modules
146
+ )
147
+ except ValueError as exc:
148
+ console.print(f"[red]{escape(str(exc))}[/]")
149
+ raise typer.Exit(2) from exc
150
+
151
+ _render_table(result, kept, top_percent)
152
+
153
+ yaml_block = yaml.safe_dump(
154
+ {"training": {"unfrozen_parameters": kept}},
155
+ default_flow_style=False,
156
+ sort_keys=False,
157
+ )
158
+ console.print(
159
+ Panel(
160
+ escape(yaml_block.rstrip()),
161
+ title="training.unfrozen_parameters",
162
+ border_style="cyan",
163
+ )
164
+ )
165
+ console.print(
166
+ f"[dim]{len(kept)} parameter group(s) unfrozen — paste the block above "
167
+ f"into your soup.yaml (full fine-tuning, LoRA off).[/]"
168
+ )
169
+
170
+ if output is not None:
171
+ from soup_cli.utils.paths import atomic_write_text
172
+
173
+ atomic_write_text(yaml_block, output, field="output")
174
+ console.print(f"[green]Wrote patch:[/] {escape(output)}")
@@ -9,6 +9,15 @@ from pydantic import BaseModel, Field, field_validator, model_validator
9
9
  _MAX_LORA_RANK_PATTERN_KEYS = 256
10
10
  _MAX_LORA_RANK_PATTERN_VALUE = 1024
11
11
 
12
+ # v0.71.23 #266 — Spectrum targeted-training unfrozen-parameter caps
13
+ _MAX_UNFROZEN_PARAMETERS = 50_000
14
+ _MAX_UNFROZEN_PATTERN_LEN = 512
15
+ # Reject nested-unbounded-quantifier regexes — e.g. ``(x+)+y`` / ``(a*)*`` —
16
+ # which catastrophically backtrack (ReDoS) when re.search'd against parameter
17
+ # names in apply_unfrozen_parameters. soup.yaml is shareable config, so the
18
+ # pattern *class* is rejected at parse time, not just compile failures.
19
+ _UNFROZEN_REDOS_RE = re.compile(r"\([^)]*[+*][^)]*\)\s*[+*]")
20
+
12
21
 
13
22
  class LoraConfig(BaseModel):
14
23
  r: int = Field(default=64, description="LoRA rank")
@@ -2319,6 +2328,62 @@ class TrainingConfig(BaseModel):
2319
2328
  lt=1.0,
2320
2329
  description="Freeze this fraction of layers (0.75 = freeze 75% from bottom).",
2321
2330
  )
2331
+ # v0.71.23 #266 — Spectrum targeted training: full FT of selected params
2332
+ unfrozen_parameters: Optional[List[str]] = Field(
2333
+ default=None,
2334
+ description=(
2335
+ "Spectrum (#266) targeted training: regex patterns of parameter "
2336
+ "names to keep trainable — every other parameter is frozen. Full "
2337
+ "fine-tuning, LoRA off. Generate with `soup spectrum scan`. "
2338
+ "Mutually exclusive with LoRA features / freeze_layers / "
2339
+ "freeze_ratio / train_router_only; sft + transformers backend only."
2340
+ ),
2341
+ )
2342
+
2343
+ @field_validator("unfrozen_parameters")
2344
+ @classmethod
2345
+ def _validate_unfrozen_parameters(
2346
+ cls, value: Optional[List[str]]
2347
+ ) -> Optional[List[str]]:
2348
+ """v0.71.23 #266 — caps + NUL + non-empty + regex-compilability."""
2349
+ if value is None:
2350
+ return None
2351
+ if len(value) > _MAX_UNFROZEN_PARAMETERS:
2352
+ raise ValueError(
2353
+ f"training.unfrozen_parameters: too many patterns "
2354
+ f"({len(value)} > {_MAX_UNFROZEN_PARAMETERS})"
2355
+ )
2356
+ for pat in value:
2357
+ # pydantic's List[str] already guarantees each entry is a str.
2358
+ if not pat:
2359
+ raise ValueError(
2360
+ "training.unfrozen_parameters entries must be non-empty"
2361
+ )
2362
+ if "\x00" in pat:
2363
+ raise ValueError(
2364
+ "training.unfrozen_parameters entries must not contain "
2365
+ "null bytes"
2366
+ )
2367
+ if len(pat) > _MAX_UNFROZEN_PATTERN_LEN:
2368
+ raise ValueError(
2369
+ f"training.unfrozen_parameters entries must be "
2370
+ f"<= {_MAX_UNFROZEN_PATTERN_LEN} chars"
2371
+ )
2372
+ try:
2373
+ re.compile(pat)
2374
+ except re.error as exc:
2375
+ raise ValueError(
2376
+ f"training.unfrozen_parameters: invalid regex {pat!r}: {exc}"
2377
+ ) from exc
2378
+ if _UNFROZEN_REDOS_RE.search(pat):
2379
+ raise ValueError(
2380
+ f"training.unfrozen_parameters: pattern {pat!r} has nested "
2381
+ f"unbounded quantifiers (ReDoS risk). Use a literal "
2382
+ f"parameter-name prefix such as "
2383
+ f"'model.layers.0.mlp.down_proj' (run `soup spectrum scan`)."
2384
+ )
2385
+ return value
2386
+
2322
2387
  # Sample packing — pack multiple short samples into one sequence
2323
2388
  packing: bool = Field(
2324
2389
  default=False,
@@ -3627,6 +3692,84 @@ class SoupConfig(BaseModel):
3627
3692
  raise ValueError(str(exc)) from exc
3628
3693
  return self
3629
3694
 
3695
+ @model_validator(mode="after")
3696
+ def _validate_unfrozen_parameters(self) -> "SoupConfig":
3697
+ """v0.71.23 #266 — Spectrum targeted-training compatibility gates.
3698
+
3699
+ ``unfrozen_parameters`` is full fine-tuning of a hand-picked parameter
3700
+ set (LoRA off), so it is mutually exclusive with the LoRA feature
3701
+ flags and with the other parameter-freezing mechanisms. Wired only in
3702
+ the transformers SFT trainer.
3703
+ """
3704
+ tcfg = self.training
3705
+ if not tcfg.unfrozen_parameters:
3706
+ return self
3707
+ if self.task != "sft":
3708
+ raise ValueError(
3709
+ f"training.unfrozen_parameters (Spectrum targeted training) "
3710
+ f"requires task='sft'; got task={self.task!r}"
3711
+ )
3712
+ if self.backend != "transformers":
3713
+ raise ValueError(
3714
+ f"training.unfrozen_parameters requires backend='transformers'; "
3715
+ f"got backend={self.backend!r}"
3716
+ )
3717
+ if self.modality != "text":
3718
+ raise ValueError(
3719
+ f"training.unfrozen_parameters requires modality='text' "
3720
+ f"(the Spectrum branch is wired in the text SFT trainer); "
3721
+ f"got modality={self.modality!r}"
3722
+ )
3723
+ if tcfg.quantization != "none":
3724
+ raise ValueError(
3725
+ f"training.unfrozen_parameters (Spectrum full fine-tuning) "
3726
+ f"requires quantization='none' (got {tcfg.quantization!r}); "
3727
+ f"quantized weights cannot be trained directly. For a quantized "
3728
+ f"run, drop unfrozen_parameters and use LoRA (QLoRA)."
3729
+ )
3730
+ freeze_conflicts = []
3731
+ if tcfg.freeze_layers is not None:
3732
+ freeze_conflicts.append("freeze_layers")
3733
+ if tcfg.freeze_ratio is not None:
3734
+ freeze_conflicts.append("freeze_ratio")
3735
+ if tcfg.train_router_only:
3736
+ freeze_conflicts.append("train_router_only")
3737
+ if tcfg.expand_layers is not None:
3738
+ freeze_conflicts.append("expand_layers")
3739
+ if tcfg.freeze_trainable_layers is not None:
3740
+ freeze_conflicts.append("freeze_trainable_layers")
3741
+ if freeze_conflicts:
3742
+ raise ValueError(
3743
+ f"training.unfrozen_parameters is mutually exclusive with "
3744
+ f"{', '.join(freeze_conflicts)} (each independently selects "
3745
+ f"which parameters train)"
3746
+ )
3747
+ lcfg = tcfg.lora
3748
+ lora_conflicts = []
3749
+ if lcfg.use_dora:
3750
+ lora_conflicts.append("lora.use_dora")
3751
+ if lcfg.use_vera:
3752
+ lora_conflicts.append("lora.use_vera")
3753
+ if lcfg.use_olora:
3754
+ lora_conflicts.append("lora.use_olora")
3755
+ if lcfg.use_rslora:
3756
+ lora_conflicts.append("lora.use_rslora")
3757
+ if tcfg.moe_lora:
3758
+ lora_conflicts.append("moe_lora")
3759
+ if tcfg.use_longlora:
3760
+ lora_conflicts.append("use_longlora")
3761
+ if tcfg.relora_steps is not None:
3762
+ lora_conflicts.append("relora_steps")
3763
+ if tcfg.loraplus_lr_ratio is not None:
3764
+ lora_conflicts.append("loraplus_lr_ratio")
3765
+ if lora_conflicts:
3766
+ raise ValueError(
3767
+ f"training.unfrozen_parameters (Spectrum full fine-tuning, "
3768
+ f"LoRA off) is mutually exclusive with LoRA features: "
3769
+ f"{', '.join(lora_conflicts)}"
3770
+ )
3771
+ return self
3772
+
3630
3773
  @model_validator(mode="after")
3631
3774
  def _validate_rollout_backend(self) -> "SoupConfig":
3632
3775
  """v0.50.0 Part C — ``rollout_backend`` requires task='grpo' and a