soup-cli 0.75.0__tar.gz → 0.75.2__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 (1170) hide show
  1. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/ci.yml +12 -1
  2. {soup_cli-0.75.0 → soup_cli-0.75.2}/CHANGELOG.md +40 -1
  3. {soup_cli-0.75.0 → soup_cli-0.75.2}/PKG-INFO +15 -34
  4. {soup_cli-0.75.0 → soup_cli-0.75.2}/README.md +14 -33
  5. {soup_cli-0.75.0 → soup_cli-0.75.2}/README.tr.md +17 -34
  6. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/adapters-and-governance.md +2 -1
  7. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/backends-and-ops.md +14 -1
  8. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/commands.md +1 -0
  9. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/evaluation.md +2 -0
  10. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/performance-and-quantization.md +9 -0
  11. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/serving-and-export.md +14 -1
  12. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/training.md +2 -0
  13. {soup_cli-0.75.0 → soup_cli-0.75.2}/pyproject.toml +1 -1
  14. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/__init__.py +1 -1
  15. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/run.py +24 -3
  16. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/schema.py +7 -0
  17. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/unpack.py +76 -7
  18. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cli.py +42 -1
  19. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/lambda_labs.py +56 -6
  20. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/modal.py +117 -17
  21. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/adapters.py +2 -1
  22. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/can.py +15 -12
  23. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/generate.py +12 -4
  24. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/push.py +45 -19
  25. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/runs.py +5 -2
  26. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/serve.py +69 -18
  27. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ship.py +25 -14
  28. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/schema.py +54 -13
  29. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/vllm.py +4 -0
  30. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/gate.py +17 -2
  31. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/judge.py +10 -1
  32. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/experiment/tracker.py +13 -0
  33. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/execution.py +124 -10
  34. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/registry.py +86 -24
  35. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/app.py +98 -4
  36. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/app.js +131 -82
  37. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/index.html +20 -19
  38. soup_cli-0.75.2/src/soup_cli/ui/static/safe_html.js +48 -0
  39. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_sign.py +9 -0
  40. soup_cli-0.75.2/src/soup_cli/utils/argv_redaction.py +163 -0
  41. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/audit_log.py +4 -1
  42. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hubs.py +31 -0
  43. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream_runtime.py +174 -19
  44. soup_cli-0.75.2/src/soup_cli/utils/local_request_guard.py +133 -0
  45. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lr_groups.py +6 -14
  46. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/net_guard.py +81 -0
  47. soup_cli-0.75.2/src/soup_cli/utils/safe_regex.py +312 -0
  48. soup_cli-0.75.2/src/soup_cli/utils/yaml_limits.py +121 -0
  49. soup_cli-0.75.2/tests/test_adapter_trusted_key_backend.py +134 -0
  50. soup_cli-0.75.2/tests/test_argv_redaction_bundled_shorts.py +78 -0
  51. soup_cli-0.75.2/tests/test_audit_log_option_masking.py +135 -0
  52. soup_cli-0.75.2/tests/test_can_deploy_target_containment.py +115 -0
  53. soup_cli-0.75.2/tests/test_can_output_control_bytes.py +99 -0
  54. soup_cli-0.75.2/tests/test_can_read_limits.py +199 -0
  55. soup_cli-0.75.2/tests/test_cloud_output_dir_containment.py +154 -0
  56. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_critical.py +2 -2
  57. soup_cli-0.75.2/tests/test_config_regex_limits.py +283 -0
  58. soup_cli-0.75.2/tests/test_hub_push_credentials.py +135 -0
  59. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_inference_advanced.py +5 -5
  60. soup_cli-0.75.2/tests/test_issue1005_peft021_canonical_names.py +283 -0
  61. soup_cli-0.75.2/tests/test_issue1005_peft021_review_round.py +350 -0
  62. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue369_canonical_named_parameters.py +23 -15
  63. soup_cli-0.75.2/tests/test_issue616_net_guard_is_shared.py +436 -0
  64. soup_cli-0.75.2/tests/test_judge_key_scoping.py +59 -0
  65. soup_cli-0.75.2/tests/test_lambda_submit_interrupt.py +335 -0
  66. soup_cli-0.75.2/tests/test_local_request_guard.py +102 -0
  67. soup_cli-0.75.2/tests/test_mcp_capacity_all_runs.py +91 -0
  68. soup_cli-0.75.2/tests/test_mcp_digest_no_follow.py +292 -0
  69. soup_cli-0.75.2/tests/test_mcp_plan_inputs.py +230 -0
  70. soup_cli-0.75.2/tests/test_mcp_post_spawn_failure.py +130 -0
  71. soup_cli-0.75.2/tests/test_modal_stub_outputs.py +321 -0
  72. soup_cli-0.75.2/tests/test_outbound_endpoint_ip_literals.py +734 -0
  73. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_a_wave1.py +19 -0
  74. soup_cli-0.75.2/tests/test_runs_clean_keep_weights.py +177 -0
  75. soup_cli-0.75.2/tests/test_safe_regex.py +240 -0
  76. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_serve.py +2 -2
  77. soup_cli-0.75.2/tests/test_serve_local_request_guard.py +307 -0
  78. soup_cli-0.75.2/tests/test_ui_rendering_escapes.py +184 -0
  79. soup_cli-0.75.2/tests/test_ui_security_headers.py +203 -0
  80. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0536.py +1 -1
  81. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0537.py +20 -20
  82. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07135.py +1 -1
  83. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07201.py +11 -9
  84. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07202.py +2 -2
  85. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07203.py +11 -5
  86. soup_cli-0.75.2/tests/test_yaml_expanded_limit.py +283 -0
  87. soup_cli-0.75.0/tests/test_issue616_net_guard_is_shared.py +0 -208
  88. {soup_cli-0.75.0 → soup_cli-0.75.2}/.dockerignore +0 -0
  89. {soup_cli-0.75.0 → soup_cli-0.75.2}/.gitattributes +0 -0
  90. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/FUNDING.yml +0 -0
  91. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  92. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  93. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  94. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/constraints/transformers-floor.txt +0 -0
  95. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/pull_request_template.md +0 -0
  96. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/dependency-drift.yml +0 -0
  97. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/docker.yml +0 -0
  98. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/publish.yml +0 -0
  99. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/recipe-repo-ids.yml +0 -0
  100. {soup_cli-0.75.0 → soup_cli-0.75.2}/.github/workflows/recipe-validation.yml +0 -0
  101. {soup_cli-0.75.0 → soup_cli-0.75.2}/.gitignore +0 -0
  102. {soup_cli-0.75.0 → soup_cli-0.75.2}/.mailmap +0 -0
  103. {soup_cli-0.75.0 → soup_cli-0.75.2}/.pre-commit-config.yaml +0 -0
  104. {soup_cli-0.75.0 → soup_cli-0.75.2}/AGENTS.md +0 -0
  105. {soup_cli-0.75.0 → soup_cli-0.75.2}/CODEOWNERS +0 -0
  106. {soup_cli-0.75.0 → soup_cli-0.75.2}/CODE_OF_CONDUCT.md +0 -0
  107. {soup_cli-0.75.0 → soup_cli-0.75.2}/CONTRIBUTING.md +0 -0
  108. {soup_cli-0.75.0 → soup_cli-0.75.2}/CONTRIBUTORS.md +0 -0
  109. {soup_cli-0.75.0 → soup_cli-0.75.2}/Dockerfile +0 -0
  110. {soup_cli-0.75.0 → soup_cli-0.75.2}/LICENSE +0 -0
  111. {soup_cli-0.75.0 → soup_cli-0.75.2}/NOTICE +0 -0
  112. {soup_cli-0.75.0 → soup_cli-0.75.2}/SECURITY.md +0 -0
  113. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/README.md +0 -0
  114. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/bench_validator.py +0 -0
  115. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-395-second-stack-vram.md +0 -0
  116. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-655-pinned-store-accounting.md +0 -0
  117. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-674-quest-w4a4-sft.md +0 -0
  118. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-h100-validation.md +0 -0
  119. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-qwen4-ple-m4-max.md +0 -0
  120. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.0-layer-streaming.md +0 -0
  121. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.2-nf4.md +0 -0
  122. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.3-breadth.md +0 -0
  123. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.72.4-preference-losses.md +0 -0
  124. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.73.1-measured-vram-fit.md +0 -0
  125. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/gate-v0.73.2-leg2-scoring.md +0 -0
  126. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/bitexact.py +0 -0
  127. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/bnb_repro.py +0 -0
  128. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/fsdp_sharding_probe.py +0 -0
  129. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/issue331_qlora_scope.py +0 -0
  130. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/issue395_second_stack_vram.py +0 -0
  131. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/harness/mlx_sft_smoke.py +0 -0
  132. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/probe-v0.73.0-what-bounds-streaming.md +0 -0
  133. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/run-m1-8gb-mlx-sft.md +0 -0
  134. {soup_cli-0.75.0 → soup_cli-0.75.2}/benchmarks/run-t4-colab-free-tier.md +0 -0
  135. {soup_cli-0.75.0 → soup_cli-0.75.2}/changelog.d/README.md +0 -0
  136. {soup_cli-0.75.0 → soup_cli-0.75.2}/docker-compose.yml +0 -0
  137. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/README.md +0 -0
  138. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/assets/layer-streaming.gif +0 -0
  139. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/assets/web-ui-new-training.png +0 -0
  140. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/autodistill.md +0 -0
  141. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/compliance.md +0 -0
  142. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/data.md +0 -0
  143. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/models.md +0 -0
  144. {soup_cli-0.75.0 → soup_cli-0.75.2}/docs/peft-and-efficiency.md +0 -0
  145. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/README.md +0 -0
  146. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/dpo_chat.yaml +0 -0
  147. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/dpo_example.yaml +0 -0
  148. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/grpo_reasoning.yaml +0 -0
  149. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step1_sft.yaml +0 -0
  150. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step2_reward.yaml +0 -0
  151. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  152. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/sft_basic.yaml +0 -0
  153. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/configs/vision_llama.yaml +0 -0
  154. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/README.md +0 -0
  155. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/alpaca_tiny.jsonl +0 -0
  156. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/chat_preferences.jsonl +0 -0
  157. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/dpo_sample.jsonl +0 -0
  158. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/data/reasoning_math.jsonl +0 -0
  159. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/reward_hacking/rewards.py +0 -0
  160. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/synthetic_workflow.md +0 -0
  161. {soup_cli-0.75.0 → soup_cli-0.75.2}/examples/synthetic_workflow.yaml +0 -0
  162. {soup_cli-0.75.0 → soup_cli-0.75.2}/notebooks/proof-4gb.ipynb +0 -0
  163. {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/__init__.py +0 -0
  164. {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/assemble_changelog.py +0 -0
  165. {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/autodistill_b1_hardware_smoke.py +0 -0
  166. {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/check_recipe_repo_ids.py +0 -0
  167. {soup_cli-0.75.0 → soup_cli-0.75.2}/scripts/generate_recipe_snapshot.py +0 -0
  168. {soup_cli-0.75.0 → soup_cli-0.75.2}/soup.png +0 -0
  169. {soup_cli-0.75.0 → soup_cli-0.75.2}/soup_logo_svg.svg +0 -0
  170. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/__main__.py +0 -0
  171. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/__init__.py +0 -0
  172. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/capture.py +0 -0
  173. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/contract.py +0 -0
  174. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/fingerprints.py +0 -0
  175. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/mlx_worker.py +0 -0
  176. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autodistill/publisher.py +0 -0
  177. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/__init__.py +0 -0
  178. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/analyzer.py +0 -0
  179. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/decisions.py +0 -0
  180. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/autopilot/generate_config.py +0 -0
  181. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/__init__.py +0 -0
  182. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/pack.py +0 -0
  183. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/publish.py +0 -0
  184. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cans/verify.py +0 -0
  185. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/__init__.py +0 -0
  186. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/cloud/_common.py +0 -0
  187. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/__init__.py +0 -0
  188. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0550.py +0 -0
  189. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0610.py +0 -0
  190. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0650.py +0 -0
  191. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v07110.py +0 -0
  192. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/_webhook_cli.py +0 -0
  193. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ab.py +0 -0
  194. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/active_sample.py +0 -0
  195. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/advise.py +0 -0
  196. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/agent.py +0 -0
  197. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/airgap.py +0 -0
  198. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/apple_adapter.py +0 -0
  199. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/attest.py +0 -0
  200. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/audit_log.py +0 -0
  201. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/autopilot.py +0 -0
  202. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/bench.py +0 -0
  203. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/bom.py +0 -0
  204. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/build.py +0 -0
  205. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/card.py +0 -0
  206. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/chat.py +0 -0
  207. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ci.py +0 -0
  208. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/compile_cmd.py +0 -0
  209. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/compile_tools.py +0 -0
  210. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/completions.py +0 -0
  211. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/cost.py +0 -0
  212. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data.py +0 -0
  213. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_canary.py +0 -0
  214. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_doctor.py +0 -0
  215. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_forge.py +0 -0
  216. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_mix.py +0 -0
  217. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_score.py +0 -0
  218. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/data_topics.py +0 -0
  219. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  220. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/deploy.py +0 -0
  221. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/diagnose.py +0 -0
  222. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/diff.py +0 -0
  223. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/distill_prompt.py +0 -0
  224. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/doctor.py +0 -0
  225. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/draft.py +0 -0
  226. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/drift_alarm.py +0 -0
  227. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/edit.py +0 -0
  228. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/env.py +0 -0
  229. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/eval.py +0 -0
  230. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/expect.py +0 -0
  231. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/export.py +0 -0
  232. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/fetch.py +0 -0
  233. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/history.py +0 -0
  234. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/infer.py +0 -0
  235. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ingest.py +0 -0
  236. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/init.py +0 -0
  237. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/iterative_dpo.py +0 -0
  238. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/license_advisor.py +0 -0
  239. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/llama.py +0 -0
  240. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/local_rl.py +0 -0
  241. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/lock.py +0 -0
  242. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/loop.py +0 -0
  243. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/mcp.py +0 -0
  244. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/merge.py +0 -0
  245. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  246. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/migrate.py +0 -0
  247. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/monitor.py +0 -0
  248. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/plan.py +0 -0
  249. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/plugins.py +0 -0
  250. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/probe.py +0 -0
  251. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/profile.py +0 -0
  252. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/prune_prompt.py +0 -0
  253. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/quantize.py +0 -0
  254. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/quickstart.py +0 -0
  255. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ra_dit.py +0 -0
  256. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/recipes.py +0 -0
  257. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/registry.py +0 -0
  258. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/reward.py +0 -0
  259. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/shrink.py +0 -0
  260. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/spectrum.py +0 -0
  261. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/steer.py +0 -0
  262. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/sweep.py +0 -0
  263. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tokenizer.py +0 -0
  264. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/train.py +0 -0
  265. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tui.py +0 -0
  266. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/tunability.py +0 -0
  267. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/ui.py +0 -0
  268. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/commands/why.py +0 -0
  269. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/__init__.py +0 -0
  270. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/backend_support.py +0 -0
  271. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/loader.py +0 -0
  272. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/config/unknown_keys.py +0 -0
  273. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/__init__.py +0 -0
  274. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  275. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  276. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  277. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  278. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  279. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  280. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  281. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  282. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  283. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/over_refusal.jsonl +0 -0
  284. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  285. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  286. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  287. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  288. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  289. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  290. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/augment.py +0 -0
  291. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/chat_templates.py +0 -0
  292. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/collators.py +0 -0
  293. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/formats.py +0 -0
  294. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/loader.py +0 -0
  295. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/loss_mask.py +0 -0
  296. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/__init__.py +0 -0
  297. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/_utils.py +0 -0
  298. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/anthropic.py +0 -0
  299. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/providers/ollama.py +0 -0
  300. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/sft_format.py +0 -0
  301. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/__init__.py +0 -0
  302. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/code.py +0 -0
  303. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/conversation.py +0 -0
  304. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/preference.py +0 -0
  305. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/qa.py +0 -0
  306. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/reasoning.py +0 -0
  307. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/tool_calling.py +0 -0
  308. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/templates/verifiable.py +0 -0
  309. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/__init__.py +0 -0
  310. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/pair_builder.py +0 -0
  311. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/parsers.py +0 -0
  312. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/traces/quality.py +0 -0
  313. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/data/validator.py +0 -0
  314. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/__init__.py +0 -0
  315. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/_common.py +0 -0
  316. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/calculator.py +0 -0
  317. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/guess_number.py +0 -0
  318. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/envs/retrieval_qa.py +0 -0
  319. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/__init__.py +0 -0
  320. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/aider_polyglot.py +0 -0
  321. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/arena.py +0 -0
  322. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  323. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/calibrate.py +0 -0
  324. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  325. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/custom.py +0 -0
  326. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/forgetting.py +0 -0
  327. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/gate_suites.py +0 -0
  328. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/human.py +0 -0
  329. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/leaderboard.py +0 -0
  330. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/eval/quant_check.py +0 -0
  331. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/experiment/__init__.py +0 -0
  332. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/__init__.py +0 -0
  333. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/mcp_server/server.py +0 -0
  334. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/__init__.py +0 -0
  335. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/axolotl.py +0 -0
  336. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/common.py +0 -0
  337. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/llamafactory.py +0 -0
  338. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/migrate/unsloth.py +0 -0
  339. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/__init__.py +0 -0
  340. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/callback.py +0 -0
  341. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  342. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/display.py +0 -0
  343. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  344. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/hf_push.py +0 -0
  345. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  346. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/monitoring/trace_logger.py +0 -0
  347. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/plugins/__init__.py +0 -0
  348. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/py.typed +0 -0
  349. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/recipes/__init__.py +0 -0
  350. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/recipes/catalog.py +0 -0
  351. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/__init__.py +0 -0
  352. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/attach.py +0 -0
  353. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/diff.py +0 -0
  354. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/hashing.py +0 -0
  355. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/registry/store.py +0 -0
  356. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/__init__.py +0 -0
  357. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/audio.yaml +0 -0
  358. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/bco.yaml +0 -0
  359. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/chat.yaml +0 -0
  360. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/code.yaml +0 -0
  361. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/embedding.yaml +0 -0
  362. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  363. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  364. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  365. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  366. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/hipaa.yaml +0 -0
  367. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/ipo.yaml +0 -0
  368. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/kto.yaml +0 -0
  369. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/longcontext.yaml +0 -0
  370. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/manifest.json +0 -0
  371. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/medical.yaml +0 -0
  372. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/moe.yaml +0 -0
  373. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/orpo.yaml +0 -0
  374. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/pretrain.yaml +0 -0
  375. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/reasoning.yaml +0 -0
  376. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/rlhf.yaml +0 -0
  377. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/simpo.yaml +0 -0
  378. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/soc2.yaml +0 -0
  379. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  380. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/tool-calling.yaml +0 -0
  381. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/templates/vision.yaml +0 -0
  382. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/__init__.py +0 -0
  383. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/_trl_compat.py +0 -0
  384. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/asr.py +0 -0
  385. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/bco.py +0 -0
  386. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/bitnet.py +0 -0
  387. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/classifier.py +0 -0
  388. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/distill.py +0 -0
  389. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/dpo.py +0 -0
  390. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/embedding.py +0 -0
  391. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/grpo.py +0 -0
  392. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/ipo.py +0 -0
  393. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/kto.py +0 -0
  394. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  395. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  396. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_masking.py +0 -0
  397. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_optim.py +0 -0
  398. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_routing.py +0 -0
  399. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_sft.py +0 -0
  400. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/mole_routing.py +0 -0
  401. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/online_dpo.py +0 -0
  402. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/orpo.py +0 -0
  403. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/ppo.py +0 -0
  404. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/preference.py +0 -0
  405. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/pretrain.py +0 -0
  406. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/prm.py +0 -0
  407. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/raft.py +0 -0
  408. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/reward_model.py +0 -0
  409. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/rewards.py +0 -0
  410. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/sft.py +0 -0
  411. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/simpo.py +0 -0
  412. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/stream_setup.py +0 -0
  413. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/tts.py +0 -0
  414. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/trainer/unlearn.py +0 -0
  415. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/tui_app.py +0 -0
  416. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/__init__.py +0 -0
  417. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/plugins/__init__.py +0 -0
  418. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.png +0 -0
  419. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.svg +0 -0
  420. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/ui/static/style.css +0 -0
  421. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/__init__.py +0 -0
  422. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/_eval_text.py +0 -0
  423. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ab_test.py +0 -0
  424. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/activation_offload.py +0 -0
  425. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/active_sampler.py +0 -0
  426. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  427. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_bisect.py +0 -0
  428. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_branch.py +0 -0
  429. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_diff.py +0 -0
  430. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_fuse.py +0 -0
  431. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_merge.py +0 -0
  432. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_pr.py +0 -0
  433. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_scan.py +0 -0
  434. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advanced_precision.py +0 -0
  435. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advise.py +0 -0
  436. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/advise_history.py +0 -0
  437. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_forge.py +0 -0
  438. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_rollout.py +0 -0
  439. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/agent_sandbox.py +0 -0
  440. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/airgap_bundle.py +0 -0
  441. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/annex_xi.py +0 -0
  442. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/anthropic_messages.py +0 -0
  443. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/apple_adapter.py +0 -0
  444. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/asr_metrics.py +0 -0
  445. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/attest.py +0 -0
  446. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/auto_quant.py +0 -0
  447. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/backend_detect.py +0 -0
  448. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/batch_probe.py +0 -0
  449. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/behavior_battery.py +0 -0
  450. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n.py +0 -0
  451. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_artifact.py +0 -0
  452. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_checkpoint.py +0 -0
  453. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_stream.py +0 -0
  454. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/bitnet.py +0 -0
  455. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/blame.py +0 -0
  456. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/block_expansion.py +0 -0
  457. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/bom.py +0 -0
  458. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot.py +0 -0
  459. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  460. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/build_dag.py +0 -0
  461. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary.py +0 -0
  462. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary_discovery.py +0 -0
  463. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/canary_router.py +0 -0
  464. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/capability_suite.py +0 -0
  465. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/checklist_dsl.py +0 -0
  466. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  467. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ci_workflow.py +0 -0
  468. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/citation_faithful.py +0 -0
  469. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/classifier.py +0 -0
  470. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cmaes_merge.py +0 -0
  471. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/compile_tools.py +0 -0
  472. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/completions.py +0 -0
  473. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/constants.py +0 -0
  474. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/convergence.py +0 -0
  475. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/crash.py +0 -0
  476. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  477. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum.py +0 -0
  478. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  479. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/cut_ce.py +0 -0
  480. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_doctor.py +0 -0
  481. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_forge.py +0 -0
  482. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_lint.py +0 -0
  483. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_mix.py +0 -0
  484. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_pipeline.py +0 -0
  485. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/data_score.py +0 -0
  486. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deepspeed.py +0 -0
  487. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  488. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/demo_bundles.py +0 -0
  489. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  490. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_measure.py +0 -0
  491. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  492. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/_common.py +0 -0
  493. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/badge.py +0 -0
  494. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/citation.py +0 -0
  495. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  496. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  497. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/format.py +0 -0
  498. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/live.py +0 -0
  499. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  500. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  501. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  502. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/report.py +0 -0
  503. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/runner.py +0 -0
  504. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/distill.py +0 -0
  505. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/dpo_variants.py +0 -0
  506. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/draft.py +0 -0
  507. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/drift_alarm.py +0 -0
  508. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  509. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/echo_trap.py +0 -0
  510. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_diff.py +0 -0
  511. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_governor.py +0 -0
  512. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/edit_kernels.py +0 -0
  513. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/embed.py +0 -0
  514. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/encoding.py +0 -0
  515. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/energy.py +0 -0
  516. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/env_lock.py +0 -0
  517. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/errors.py +0 -0
  518. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_design.py +0 -0
  519. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  520. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  521. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/evolve.py +0 -0
  522. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/expectations.py +0 -0
  523. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fetch_examples.py +0 -0
  524. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/flash_attn.py +0 -0
  525. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fp8.py +0 -0
  526. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/freeze.py +0 -0
  527. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp.py +0 -0
  528. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  529. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/galore.py +0 -0
  530. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gguf_quant.py +0 -0
  531. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gpu.py +0 -0
  532. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gpu_monitor.py +0 -0
  533. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grace_codebook.py +0 -0
  534. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/graceful_save.py +0 -0
  535. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grad_accum.py +0 -0
  536. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  537. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_long_context.py +0 -0
  538. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_variants.py +0 -0
  539. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hardware_fit.py +0 -0
  540. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/harm_probe.py +0 -0
  541. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hf.py +0 -0
  542. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/hf_space.py +0 -0
  543. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_pull.py +0 -0
  544. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_sources.py +0 -0
  545. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/integrations.py +0 -0
  546. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/interference.py +0 -0
  547. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/interference_live.py +0 -0
  548. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/irt.py +0 -0
  549. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/iterative_dpo.py +0 -0
  550. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  551. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/kernel_picker.py +0 -0
  552. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/knowledge_edit.py +0 -0
  553. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/kv_cache.py +0 -0
  554. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/launcher.py +0 -0
  555. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_shard.py +0 -0
  556. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream.py +0 -0
  557. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/license_advisor.py +0 -0
  558. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/license_matrix.py +0 -0
  559. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/liger.py +0 -0
  560. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lisa.py +0 -0
  561. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/live_eval.py +0 -0
  562. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/llama_proxy.py +0 -0
  563. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/llama_server_timings.py +0 -0
  564. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl.py +0 -0
  565. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  566. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loftq_init.py +0 -0
  567. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/log_level.py +0 -0
  568. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/long_context.py +0 -0
  569. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/longlora.py +0 -0
  570. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_budget.py +0 -0
  571. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_daemon.py +0 -0
  572. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_iteration.py +0 -0
  573. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_stages.py +0 -0
  574. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/loop_state.py +0 -0
  575. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/lr_finder.py +0 -0
  576. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/magpie.py +0 -0
  577. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/metrics.py +0 -0
  578. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mii.py +0 -0
  579. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/minillm.py +0 -0
  580. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mix_proxy.py +0 -0
  581. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mixed_precision.py +0 -0
  582. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mlx.py +0 -0
  583. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mod.py +0 -0
  584. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/moe.py +0 -0
  585. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/moe_quant.py +0 -0
  586. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/mole_routing.py +0 -0
  587. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack.py +0 -0
  588. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_sampler.py +0 -0
  589. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_trainer.py +0 -0
  590. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/namespace_pin.py +0 -0
  591. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/neat_packing.py +0 -0
  592. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ngram_spec.py +0 -0
  593. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/nlg_metrics.py +0 -0
  594. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ollama.py +0 -0
  595. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/onboarding.py +0 -0
  596. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  597. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/oq_affine.py +0 -0
  598. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/paths.py +0 -0
  599. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_builder.py +0 -0
  600. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_patches.py +0 -0
  601. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/peft_wiring.py +0 -0
  602. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/persona_hub.py +0 -0
  603. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/pipeline.py +0 -0
  604. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/plotext_compat.py +0 -0
  605. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/preference_combine.py +0 -0
  606. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prm.py +0 -0
  607. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prm_reward.py +0 -0
  608. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/probe_kernel.py +0 -0
  609. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/probe_pack.py +0 -0
  610. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/process_liveness.py +0 -0
  611. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiler.py +0 -0
  612. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiling.py +0 -0
  613. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  614. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_compile.py +0 -0
  615. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_distill.py +0 -0
  616. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/prune_prompt.py +0 -0
  617. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qat.py +0 -0
  618. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qr_url.py +0 -0
  619. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/quality.py +0 -0
  620. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/quant_menu.py +0 -0
  621. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_compat.py +0 -0
  622. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_ple.py +0 -0
  623. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit.py +0 -0
  624. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit_run.py +0 -0
  625. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/raft.py +0 -0
  626. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_effort.py +0 -0
  627. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_parser.py +0 -0
  628. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_dag.py +0 -0
  629. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_run.py +0 -0
  630. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/registry.py +0 -0
  631. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rehearsal.py +0 -0
  632. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/relora.py +0 -0
  633. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/replay.py +0 -0
  634. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/repro_receipt.py +0 -0
  635. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hack_control.py +0 -0
  636. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hacking.py +0 -0
  637. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_stress.py +0 -0
  638. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/reward_synth.py +0 -0
  639. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ring_attention.py +0 -0
  640. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  641. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  642. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/run_cost.py +0 -0
  643. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sae_diff.py +0 -0
  644. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/save_formats.py +0 -0
  645. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/seeding.py +0 -0
  646. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/semdedup.py +0 -0
  647. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/server_tools.py +0 -0
  648. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sglang.py +0 -0
  649. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ship_verdict.py +0 -0
  650. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/shortcuts.py +0 -0
  651. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/shrink.py +0 -0
  652. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/signing.py +0 -0
  653. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sleeper_probe.py +0 -0
  654. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/soup_lock.py +0 -0
  655. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spec_pairing.py +0 -0
  656. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spectrum_scan.py +0 -0
  657. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/spike_recovery.py +0 -0
  658. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sse_train_stream.py +0 -0
  659. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/steering.py +0 -0
  660. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/strict_safetensors.py +0 -0
  661. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/structured_output.py +0 -0
  662. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/sweep_config.py +0 -0
  663. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tail_latency.py +0 -0
  664. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/terminal.py +0 -0
  665. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/terraform_plan.py +0 -0
  666. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tool_outputs.py +0 -0
  667. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/topics.py +0 -0
  668. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/topology.py +0 -0
  669. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tracing.py +0 -0
  670. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trackers.py +0 -0
  671. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/train_event_buffer.py +0 -0
  672. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trainer_plugins.py +0 -0
  673. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/trust_remote.py +0 -0
  674. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/truth_probe.py +0 -0
  675. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tts.py +0 -0
  676. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tts_codec.py +0 -0
  677. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/tunability.py +0 -0
  678. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/ui_env.py +0 -0
  679. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/uld.py +0 -0
  680. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  681. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning.py +0 -0
  682. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning_eval.py +0 -0
  683. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/unsloth.py +0 -0
  684. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/v028_features.py +0 -0
  685. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vector_bank.py +0 -0
  686. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vllm.py +0 -0
  687. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/vscode_setup.py +0 -0
  688. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/warmup.py +0 -0
  689. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/webhooks.py +0 -0
  690. {soup_cli-0.75.0 → soup_cli-0.75.2}/src/soup_cli/utils/why.py +0 -0
  691. {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/chat.yaml +0 -0
  692. {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/code.yaml +0 -0
  693. {soup_cli-0.75.0 → soup_cli-0.75.2}/templates/medical.yaml +0 -0
  694. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/__init__.py +0 -0
  695. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/_windows_ci.py +0 -0
  696. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/conftest.py +0 -0
  697. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/capture_token.json +0 -0
  698. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/consumption_ledger.json +0 -0
  699. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/plan.json +0 -0
  700. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/shard_manifest.json +0 -0
  701. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/student_rollout_capture_token.json +0 -0
  702. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/issue204_langfuse_observations_v2_page.json +0 -0
  703. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/fixtures/recipe_config_snapshots.json +0 -0
  704. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/mcp_roundtrip.py +0 -0
  705. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v053_qa.md +0 -0
  706. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v07114_qa.md +0 -0
  707. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/qa/v0716_qa.md +0 -0
  708. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_adapters.py +0 -0
  709. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_advanced_peft.py +0 -0
  710. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_align_trainable_dtype.py +0 -0
  711. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_assistant_mask.py +0 -0
  712. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_audio.py +0 -0
  713. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_auto_tuning.py +0 -0
  714. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_autopilot.py +0 -0
  715. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_awq_gptq_export.py +0 -0
  716. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_batch_probe.py +0 -0
  717. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bco.py +0 -0
  718. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bench.py +0 -0
  719. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_brain_rot_multilingual.py +0 -0
  720. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_bugfixes.py +0 -0
  721. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_build_dag.py +0 -0
  722. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_callback.py +0 -0
  723. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cans.py +0 -0
  724. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_chat.py +0 -0
  725. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_chat_template.py +0 -0
  726. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli.py +0 -0
  727. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_help_assertions_are_ansi_safe.py +0 -0
  728. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_startup_is_light.py +0 -0
  729. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cli_subprocess.py +0 -0
  730. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_deferred.py +0 -0
  731. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_high.py +0 -0
  732. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_medium_low.py +0 -0
  733. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_code_review_recurring.py +0 -0
  734. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_config.py +0 -0
  735. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_contributing_test_counts_are_digit_free.py +0 -0
  736. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_cost.py +0 -0
  737. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_crash_reporter.py +0 -0
  738. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_curriculum.py +0 -0
  739. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data.py +0 -0
  740. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_augment.py +0 -0
  741. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_sample.py +0 -0
  742. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_split.py +0 -0
  743. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_data_tools.py +0 -0
  744. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dataset_hub.py +0 -0
  745. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dataset_registry.py +0 -0
  746. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_deepspeed.py +0 -0
  747. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_demo_bundle_metadata.py +0 -0
  748. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_deploy_ollama.py +0 -0
  749. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_device_map_distributed.py +0 -0
  750. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_diff.py +0 -0
  751. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_display.py +0 -0
  752. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_doctor.py +0 -0
  753. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dpo_example.py +0 -0
  754. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_dpo_variants.py +0 -0
  755. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_embedding.py +0 -0
  756. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_errors.py +0 -0
  757. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval.py +0 -0
  758. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval_gate.py +0 -0
  759. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_eval_platform.py +0 -0
  760. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_examples_configs.py +0 -0
  761. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_export.py +0 -0
  762. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_formats.py +0 -0
  763. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_fp8_recipe.py +0 -0
  764. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_freeze_training.py +0 -0
  765. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_generate.py +0 -0
  766. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_gpu.py +0 -0
  767. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_grpo.py +0 -0
  768. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_hf_integration.py +0 -0
  769. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_infer.py +0 -0
  770. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_init.py +0 -0
  771. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ipo.py +0 -0
  772. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue144_gguf_export.py +0 -0
  773. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue204_langfuse_pull.py +0 -0
  774. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_display_bridge.py +0 -0
  775. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_harness_bridge.py +0 -0
  776. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue23_mlx_val_loss_producer.py +0 -0
  777. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue264_cloud.py +0 -0
  778. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue296_network_transport.py +0 -0
  779. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_kwargs.py +0 -0
  780. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_train.py +0 -0
  781. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue302_vision_pad_token.py +0 -0
  782. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue304_cross_tokenizer.py +0 -0
  783. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
  784. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue308_callback_subclass.py +0 -0
  785. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue316_refusal_apostrophe.py +0 -0
  786. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue316_suites.py +0 -0
  787. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue320_lazy_callback_import.py +0 -0
  788. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue322_mcp2_compat.py +0 -0
  789. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue323_trl_kwarg_drift.py +0 -0
  790. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue327_logits_estimate.py +0 -0
  791. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue330_mix_recipe_train_loadable.py +0 -0
  792. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue332_vllm_prompt.py +0 -0
  793. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue334_fa3_detection.py +0 -0
  794. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue336_deepspeed_lora.py +0 -0
  795. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue339_load_dtype.py +0 -0
  796. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue341_seed_and_fullft.py +0 -0
  797. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue348_calibrated_logits_wiring.py +0 -0
  798. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue349_measured_fit.py +0 -0
  799. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue350_fsdp_qlora.py +0 -0
  800. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue352_fsdp_peft_checkpoint.py +0 -0
  801. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue353_mlx_seed_warning.py +0 -0
  802. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue353_seed_every_task.py +0 -0
  803. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue359_deepspeed_guard_coverage.py +0 -0
  804. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue360_sglang_prompt_finish_reason.py +0 -0
  805. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue367_live_eval_quantization.py +0 -0
  806. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue372_no_reexec_hint.py +0 -0
  807. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue373_fsdp_sharding_probe.py +0 -0
  808. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue374_stream_disk_preflight.py +0 -0
  809. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue377_lisa_train_embeddings.py +0 -0
  810. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue382_windows_ci_guard_is_shared.py +0 -0
  811. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue385_stream_dtype.py +0 -0
  812. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue389_torchao_error.py +0 -0
  813. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue390_expandable_segments_reason.py +0 -0
  814. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue392_mlx_target_keys.py +0 -0
  815. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue394_mlx_runtime_isolation.py +0 -0
  816. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue401_orphaned_run_reconcile.py +0 -0
  817. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue402_restart_capacity.py +0 -0
  818. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue404_baseline_scorer_stamp.py +0 -0
  819. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue423_mlx_device_detection.py +0 -0
  820. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue424_windows_liveness.py +0 -0
  821. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue427_qwen35_text_modality.py +0 -0
  822. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue433_meta_adapter_guard.py +0 -0
  823. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue441_coerce_token_ids.py +0 -0
  824. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue443_interleave_wiring.py +0 -0
  825. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue459_interleave_streaming_hub.py +0 -0
  826. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue477_qwen38_catalog.py +0 -0
  827. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue487_changelog_fragments.py +0 -0
  828. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue491_frozen_base_load_dtype.py +0 -0
  829. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue502_qwen35_transformers5.py +0 -0
  830. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue505_launching_window_blocks_restart.py +0 -0
  831. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue524_launching_reconcile.py +0 -0
  832. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue531_stream_base_provenance.py +0 -0
  833. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue532_supervised_token_guard.py +0 -0
  834. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue533_offline_hf_materialization.py +0 -0
  835. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue534_apple_nvme.py +0 -0
  836. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue546_transient_finite_metric.py +0 -0
  837. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue549_bon_resume.py +0 -0
  838. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue550_bon_offline.py +0 -0
  839. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue555_bon_stream_resume.py +0 -0
  840. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue563_mps_bf16_training.py +0 -0
  841. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue565_grpo_reward_metadata.py +0 -0
  842. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue567_grpo_mps_bf16.py +0 -0
  843. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue571_qwen4_exp.py +0 -0
  844. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue573_qwen4_expert_lora.py +0 -0
  845. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_capture.py +0 -0
  846. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_contract.py +0 -0
  847. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_fingerprints.py +0 -0
  848. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_mlx_worker.py +0 -0
  849. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue580_autodistill_publisher.py +0 -0
  850. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue599_telemetry_dns_ssrf.py +0 -0
  851. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue600_abbreviated_ipv4_ssrf.py +0 -0
  852. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue602_qwen4_ple_streaming.py +0 -0
  853. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue621_recipe_snapshot.py +0 -0
  854. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue623_stream_pin_allocation.py +0 -0
  855. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue627_unknown_config_keys.py +0 -0
  856. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue633_ansi_in_highlighted_output.py +0 -0
  857. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue634_mlx_resume.py +0 -0
  858. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue636_torch_floor.py +0 -0
  859. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue642_sweep_dry_run.py +0 -0
  860. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue649_batch_probe_peak_gate.py +0 -0
  861. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue654_batch_probe_uncovered_branches.py +0 -0
  862. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue676_non_dict_messages.py +0 -0
  863. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue677_recipe_repo_id_guard.py +0 -0
  864. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue681_uld_id_compat.py +0 -0
  865. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue682_uld_loss_label_mask.py +0 -0
  866. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue683_mlx_response_masking.py +0 -0
  867. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue684_mlx_grad_accumulation.py +0 -0
  868. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue685_mlx_grad_checkpoint.py +0 -0
  869. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue686_mlx_optimizer_schedule.py +0 -0
  870. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue687_ui_auth.py +0 -0
  871. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue688_ui_drain.py +0 -0
  872. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue689_hub_streaming.py +0 -0
  873. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue690_embedding_trainer_attrs.py +0 -0
  874. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue691_sft_packing.py +0 -0
  875. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue695_validate_agrees_with_loader.py +0 -0
  876. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue700_embedding_lora_zero.py +0 -0
  877. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue721_ppo_config_forwarding.py +0 -0
  878. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue723_sequence_gspo.py +0 -0
  879. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue724_loraplus_optimizer.py +0 -0
  880. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue724_loraplus_wiring_coverage.py +0 -0
  881. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue731_ui_docs_bind.py +0 -0
  882. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue748_config_fields_reach_a_consumer.py +0 -0
  883. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue752_cli_commands_called_as_functions.py +0 -0
  884. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue755_backend_support_registry.py +0 -0
  885. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue771_validator_fast_path.py +0 -0
  886. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue775_path_containment_ratchet.py +0 -0
  887. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue781_inference_bos.py +0 -0
  888. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue811_data_validate_exit_codes.py +0 -0
  889. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue91_aider_eval.py +0 -0
  890. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_issue99_apple_monitor.py +0 -0
  891. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_jinja_analyzer.py +0 -0
  892. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_kto.py +0 -0
  893. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_loader.py +0 -0
  894. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_log_level.py +0 -0
  895. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_loss_watchdog.py +0 -0
  896. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mcp_execute.py +0 -0
  897. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_merge.py +0 -0
  898. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_migrate.py +0 -0
  899. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mii_serve.py +0 -0
  900. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_backend.py +0 -0
  901. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_dispatch.py +0 -0
  902. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_mlx_max_grad_norm.py +0 -0
  903. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_moe.py +0 -0
  904. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multi_adapter.py +0 -0
  905. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multi_gpu.py +0 -0
  906. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_config.py +0 -0
  907. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_ffd_placement.py +0 -0
  908. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_invariants.py +0 -0
  909. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_multipack_sampler.py +0 -0
  910. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_neat_packing.py +0 -0
  911. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_neftune_rslora.py +0 -0
  912. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_no_foreign_license_headers.py +0 -0
  913. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_onnx_tensorrt_export.py +0 -0
  914. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_orpo.py +0 -0
  915. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_packing.py +0 -0
  916. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_a_wave2.py +0 -0
  917. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_b.py +0 -0
  918. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_c.py +0 -0
  919. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_d.py +0 -0
  920. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_e.py +0 -0
  921. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_part_f_hardening.py +0 -0
  922. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_peft_methods.py +0 -0
  923. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_peft_patches.py +0 -0
  924. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_performance.py +0 -0
  925. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_pissa_init.py +0 -0
  926. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_plotext_compat.py +0 -0
  927. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ppo.py +0 -0
  928. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_dispatcher.py +0 -0
  929. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_multi.py +0 -0
  930. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_preference_multi_runtime.py +0 -0
  931. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_pretrain.py +0 -0
  932. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_profile.py +0 -0
  933. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_profiling.py +0 -0
  934. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_progress.py +0 -0
  935. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_push.py +0 -0
  936. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_qat.py +0 -0
  937. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quality_filter.py +0 -0
  938. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quant_check.py +0 -0
  939. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quant_menu.py +0 -0
  940. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_quickstart.py +0 -0
  941. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_qwen35_streaming.py +0 -0
  942. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_rank_pattern.py +0 -0
  943. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_readme_translation_sync.py +0 -0
  944. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipe_count_is_synced.py +0 -0
  945. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipes.py +0 -0
  946. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_recipes_v031.py +0 -0
  947. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_refusal_multilingual.py +0 -0
  948. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_registry.py +0 -0
  949. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_relora.py +0 -0
  950. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_replay.py +0 -0
  951. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_requires_python_bound.py +0 -0
  952. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_resume.py +0 -0
  953. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_review_fixes_v07133.py +0 -0
  954. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_rlvr.py +0 -0
  955. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_run_cost.py +0 -0
  956. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_runs.py +0 -0
  957. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_semantic_split.py +0 -0
  958. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_server_generate.py +0 -0
  959. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sglang_serve.py +0 -0
  960. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sglang_trust_contract.py +0 -0
  961. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_simpo.py +0 -0
  962. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_smoke_train.py +0 -0
  963. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_speculative_decoding.py +0 -0
  964. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_stream_multi_gpu_guard.py +0 -0
  965. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_sweep.py +0 -0
  966. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_synth_data_pro.py +0 -0
  967. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_telemetry_ssrf.py +0 -0
  968. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_templates_yaml.py +0 -0
  969. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tensorboard.py +0 -0
  970. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tool_calling.py +0 -0
  971. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trace_to_pref.py +0 -0
  972. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tracker.py +0 -0
  973. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trainer_coverage_v035.py +0 -0
  974. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trainer_init.py +0 -0
  975. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_training_intelligence.py +0 -0
  976. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_training_speed.py +0 -0
  977. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_transformers_floor_compat.py +0 -0
  978. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trl_preference_config_contract.py +0 -0
  979. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trl_version_compat.py +0 -0
  980. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_trust_remote_code.py +0 -0
  981. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_tui.py +0 -0
  982. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui.py +0 -0
  983. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_chat.py +0 -0
  984. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_config_builder.py +0 -0
  985. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_live_monitor.py +0 -0
  986. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_ui_metrics.py +0 -0
  987. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_unsloth.py +0 -0
  988. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_c.py +0 -0
  989. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_d.py +0 -0
  990. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0401_part_e.py +0 -0
  991. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0402_part_a.py +0 -0
  992. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0402_part_b.py +0 -0
  993. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_a.py +0 -0
  994. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_b.py +0 -0
  995. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0403_part_c.py +0 -0
  996. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0404_part_a.py +0 -0
  997. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0404_part_b.py +0 -0
  998. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0405_part_a.py +0 -0
  999. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0406_part_a.py +0 -0
  1000. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_a.py +0 -0
  1001. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_b.py +0 -0
  1002. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0410_part_c.py +0 -0
  1003. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0420.py +0 -0
  1004. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_a.py +0 -0
  1005. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_b.py +0 -0
  1006. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_c.py +0 -0
  1007. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0430_part_d.py +0 -0
  1008. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_a.py +0 -0
  1009. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_b.py +0 -0
  1010. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_c.py +0 -0
  1011. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_part_d.py +0 -0
  1012. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0440_review_followups.py +0 -0
  1013. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0450.py +0 -0
  1014. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0460_part_a.py +0 -0
  1015. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0460_part_b.py +0 -0
  1016. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0470_part_a.py +0 -0
  1017. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0470_part_b.py +0 -0
  1018. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0480_part_a.py +0 -0
  1019. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0480_part_b.py +0 -0
  1020. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0490.py +0 -0
  1021. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_a.py +0 -0
  1022. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_b.py +0 -0
  1023. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_c.py +0 -0
  1024. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_d.py +0 -0
  1025. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0500_part_e.py +0 -0
  1026. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0510.py +0 -0
  1027. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0520.py +0 -0
  1028. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0530.py +0 -0
  1029. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v05310.py +0 -0
  1030. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v05311.py +0 -0
  1031. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_109.py +0 -0
  1032. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_139.py +0 -0
  1033. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_142.py +0 -0
  1034. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0531_82.py +0 -0
  1035. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0532.py +0 -0
  1036. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0533.py +0 -0
  1037. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0534.py +0 -0
  1038. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0535.py +0 -0
  1039. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0538.py +0 -0
  1040. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0539.py +0 -0
  1041. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0540.py +0 -0
  1042. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0550.py +0 -0
  1043. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0550_followups.py +0 -0
  1044. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0560.py +0 -0
  1045. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_a.py +0 -0
  1046. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_b.py +0 -0
  1047. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_c.py +0 -0
  1048. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0570_part_d.py +0 -0
  1049. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0580.py +0 -0
  1050. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0590.py +0 -0
  1051. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_a.py +0 -0
  1052. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_b.py +0 -0
  1053. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_c.py +0 -0
  1054. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_d.py +0 -0
  1055. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_e.py +0 -0
  1056. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0600_part_f.py +0 -0
  1057. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_a.py +0 -0
  1058. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_b.py +0 -0
  1059. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_c.py +0 -0
  1060. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_d.py +0 -0
  1061. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0610_part_e.py +0 -0
  1062. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_followups.py +0 -0
  1063. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_a.py +0 -0
  1064. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_b.py +0 -0
  1065. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_c.py +0 -0
  1066. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_d.py +0 -0
  1067. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0620_part_e.py +0 -0
  1068. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_followups.py +0 -0
  1069. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_a.py +0 -0
  1070. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_b.py +0 -0
  1071. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_c.py +0 -0
  1072. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_d.py +0 -0
  1073. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0630_part_e.py +0 -0
  1074. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0631_206.py +0 -0
  1075. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_followups.py +0 -0
  1076. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_a.py +0 -0
  1077. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_b.py +0 -0
  1078. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_c.py +0 -0
  1079. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_d.py +0 -0
  1080. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_e.py +0 -0
  1081. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0640_part_f.py +0 -0
  1082. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_followups.py +0 -0
  1083. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_a.py +0 -0
  1084. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_b.py +0 -0
  1085. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_c.py +0 -0
  1086. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_d.py +0 -0
  1087. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0650_part_e.py +0 -0
  1088. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_cli.py +0 -0
  1089. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_followups.py +0 -0
  1090. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_a.py +0 -0
  1091. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_b.py +0 -0
  1092. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_c.py +0 -0
  1093. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_d.py +0 -0
  1094. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0660_part_e.py +0 -0
  1095. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_followups.py +0 -0
  1096. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_a.py +0 -0
  1097. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_b.py +0 -0
  1098. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_c.py +0 -0
  1099. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_d.py +0 -0
  1100. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_e.py +0 -0
  1101. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0670_part_f.py +0 -0
  1102. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_followups.py +0 -0
  1103. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_a.py +0 -0
  1104. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_b.py +0 -0
  1105. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_c.py +0 -0
  1106. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_d.py +0 -0
  1107. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0680_part_e.py +0 -0
  1108. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_a.py +0 -0
  1109. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_b.py +0 -0
  1110. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_c.py +0 -0
  1111. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_d.py +0 -0
  1112. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0690_part_e.py +0 -0
  1113. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_a.py +0 -0
  1114. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_b.py +0 -0
  1115. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_c.py +0 -0
  1116. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_d.py +0 -0
  1117. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_e.py +0 -0
  1118. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0700_part_f.py +0 -0
  1119. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07110.py +0 -0
  1120. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07111.py +0 -0
  1121. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07112.py +0 -0
  1122. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07113.py +0 -0
  1123. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07114.py +0 -0
  1124. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07115.py +0 -0
  1125. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07116.py +0 -0
  1126. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07117.py +0 -0
  1127. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07118.py +0 -0
  1128. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07119.py +0 -0
  1129. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0712.py +0 -0
  1130. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07120.py +0 -0
  1131. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07121.py +0 -0
  1132. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07122.py +0 -0
  1133. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07123.py +0 -0
  1134. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07124.py +0 -0
  1135. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07125.py +0 -0
  1136. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07126.py +0 -0
  1137. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07127.py +0 -0
  1138. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07128.py +0 -0
  1139. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07129.py +0 -0
  1140. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0713.py +0 -0
  1141. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07130.py +0 -0
  1142. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07131.py +0 -0
  1143. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07132.py +0 -0
  1144. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07133.py +0 -0
  1145. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07134.py +0 -0
  1146. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07136.py +0 -0
  1147. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07137.py +0 -0
  1148. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07138.py +0 -0
  1149. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07139.py +0 -0
  1150. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0714.py +0 -0
  1151. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07140.py +0 -0
  1152. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07141.py +0 -0
  1153. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07141_telemetry_prompt.py +0 -0
  1154. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0715.py +0 -0
  1155. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0716.py +0 -0
  1156. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0717.py +0 -0
  1157. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0718.py +0 -0
  1158. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v0719.py +0 -0
  1159. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07200.py +0 -0
  1160. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07204.py +0 -0
  1161. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07300.py +0 -0
  1162. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_v07302.py +0 -0
  1163. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_val_loss_end_to_end.py +0 -0
  1164. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_validator.py +0 -0
  1165. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_version_sync.py +0 -0
  1166. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_vision.py +0 -0
  1167. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_vllm_serve.py +0 -0
  1168. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_warmup.py +0 -0
  1169. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_why.py +0 -0
  1170. {soup_cli-0.75.0 → soup_cli-0.75.2}/tests/test_windows_encoding.py +0 -0
@@ -2,7 +2,11 @@ name: CI
2
2
 
3
3
  on:
4
4
  push:
5
- branches: [main]
5
+ # `release/**` is here so a release branch gets the matrix on the exact
6
+ # tree that will be tagged. A pull request builds the MERGE of head and
7
+ # main, which for a release cut from an older tag is not the tree that
8
+ # ships, so a PR run cannot stand in for this one.
9
+ branches: [main, 'release/**']
6
10
  pull_request:
7
11
  branches: [main]
8
12
 
@@ -236,6 +240,13 @@ jobs:
236
240
  - uses: actions/setup-python@v5
237
241
  with:
238
242
  python-version: ${{ matrix.python-version }}
243
+ # The Web UI escaping tests run `safe_html.js` under node, and skip when
244
+ # node is absent. Runner images happen to ship one, so the skip would be
245
+ # silent: pin it, or the only tests that execute the real escaping logic
246
+ # can disappear without anything turning red.
247
+ - uses: actions/setup-node@v4
248
+ with:
249
+ node-version: "22"
239
250
  - name: Pin the HF cache to a deterministic path
240
251
  # Set here and not in the job-level `env:` block: the `runner` context
241
252
  # is not available there (only github / needs / strategy / matrix /
@@ -12,6 +12,44 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.75.2] - 2026-10-01
16
+
17
+ ### Changed
18
+
19
+ - Outbound endpoint checks now refuse a private, link-local or reserved IP literal over `https` as well as `http`. This covers `soup data generate --api-base`, the vLLM provider and the commands that use it, judge URLs in `soup eval judge`, eval-gate suites, `soup ship --judge-model` / `eval.ship.judge_model` and `training.online_dpo_judge`, and the Web UI chat proxy. Loopback still works; address a LAN server by its hostname. `training.online_dpo_judge` is now checked when soup.yaml loads, not only when the trainer starts.
20
+
21
+ - `soup data generate --api-base` and the Web UI chat proxy no longer treat `http://0.0.0.0` as local; use `localhost` or `127.0.0.1`.
22
+
23
+ - `100.64.0.0/10` and `fec0::/10` literals are now treated as non-public by every check that already refused private addresses (webhooks, the OTLP endpoint, telemetry, hub endpoints over HTTP, and `soup ingest --pull`, where `--allow-private-host` admits them).
24
+
25
+ - Every check that refuses private addresses now also recognizes an IP literal written with non-ASCII digits or label separators, which an HTTP client folds to ASCII before it connects.
26
+
27
+ ### Fixed
28
+
29
+ - `soup ship` checks `--judge-model` before it builds the base and tuned models; it used to load both and only then stop with a usage error.
30
+
31
+ - The Web UI chat proxy answers 400, not 500, for an endpoint URL that does not parse.
32
+
33
+ ### Security
34
+
35
+ - Hardening of outbound endpoint validation. A security advisory with details and upgrade guidance will be published alongside this release.
36
+
37
+ ## [0.75.1] - 2026-09-21
38
+
39
+ ### Fixed
40
+
41
+ - **A layer-streamed LoRA adapter saved as ZERO tensors under peft 0.21.0 (#1005 in #1010).** peft 0.21 selects an adapter's tensors by the prefixes it reads off `model.named_modules()` and keeps the matching `state_dict()` entries, where 0.20 filtered by the `lora_` substring; the streaming wrapper's module and parameter names carried `.inner.` while its `state_dict()` keys were canonical, so `trainer.save_model()`, every `save_steps` checkpoint and `get_peft_model_state_dict()` returned nothing, and nothing raised. The wrapper now enumerates the inner layer's tree at its own prefix (`named_modules()` / `named_children()`, with `train()` / `apply()` / `_apply()` reaching the inner layer explicitly), so names and keys are one spelling — which also keeps transformers' weight-decay grouping, built from `named_children()`, from silently dropping every LoRA parameter into the no-decay group. **Any adapter saved with `stream_layers: true` on peft>=0.21 before this fix holds zero tensors (a 40-byte `adapter_model.safetensors`, no error at save time) and cannot be recovered — re-train it on a Soup with this fix, or with `peft<0.21`.** Naming only; nothing on the streamed forward path changes. Ten peft-version-independent tests pin names == keys against a resident LoRA model; the four tests that documented the old asymmetry are inverted rather than deleted. No `peft<0.21` pin.
42
+
43
+ - **A Ctrl+C arriving immediately after the Lambda controller started could still leave the instance running (#1073 in #1078).** `submit_lambda_run` spawned the controller outside the `try` that absorbs interrupts, so a SIGINT delivered between `Popen` returning and the waiting loop being entered — or one landing on the "still waiting" notice, which is written from the interrupt handler — unwound the parent while the controller was still terminating the paid instance in its `finally` block. The spawn and the notice now sit inside the guarded region: once the child exists, every path leads back to `proc.wait()` and the controller's exit code remains what the function returns. An interrupt raised before the child exists still propagates unchanged, and a `wait()` failure that is not an interrupt still surfaces rather than being retried.
44
+
45
+ - `soup runs clean` now accepts `--no-keep-weights` to delete whole non-best checkpoints; `--keep-weights` (the default) keeps weights on every supported Click version — on Click 8.1 it previously deleted whole checkpoints (#1057)
46
+
47
+ - **Cloud runs keep their outputs and their cleanup (#1058).** `soup train --cloud modal` now writes run outputs to the `soup-outputs` Modal volume and downloads them to the local output directory when the run ends (also after a failed run); previously checkpoints were lost with the container. `soup train --cloud lambda --cloud-submit`: pressing Ctrl+C now waits for the controller to terminate the Lambda instance; previously the controller was killed 0.25 s later and the instance could keep running (Linux/macOS).
48
+
49
+ ### Security
50
+
51
+ - Hardening across the CLI, the inference server, the Web UI, MCP execution, config parsing and `.can` handling. A security advisory with details and upgrade guidance will be published alongside this release.
52
+
15
53
  ## [0.75.0] - 2026-09-12
16
54
 
17
55
  ### Added
@@ -4650,7 +4688,8 @@ what a fine-tune forgets and leaks.
4650
4688
  `SECURITY.md` (~220 KB). `SECURITY.md` is now a concise security policy; the
4651
4689
  detailed hardening notes remain in git history and the GitHub Releases notes.
4652
4690
 
4653
- [Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.0...HEAD
4691
+ [Unreleased]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.1...HEAD
4692
+ [0.75.1]: https://github.com/MakazhanAlpamys/Soup/compare/v0.75.0...v0.75.1
4654
4693
  [0.75.0]: https://github.com/MakazhanAlpamys/Soup/compare/v0.74.0...v0.75.0
4655
4694
  [0.74.0]: https://github.com/MakazhanAlpamys/Soup/compare/v0.73.3...v0.74.0
4656
4695
  [0.73.1]: https://github.com/MakazhanAlpamys/Soup/compare/v0.73.0...v0.73.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: soup-cli
3
- Version: 0.75.0
3
+ Version: 0.75.2
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
@@ -241,39 +241,20 @@ infrastructure instead of improving models. Soup fixes that.
241
241
 
242
242
  ## What's New
243
243
 
244
- **v0.75.0 — the same `soup.yaml` trained a different recipe on MLX than on transformers,
245
- silently.** Six training options were validated, documented, accepted — and read by nothing
246
- on that backend. **All 60 pull requests in this release came from outside the maintainer**,
247
- by 22 people.
248
-
249
- - **Breaking: an unknown config key now refuses the load.** v0.74 warned and named this
250
- release as the deadline. A typo like `quantizaton`, or a key that only exists on a newer
251
- Soup, used to be dropped while the run proceeded with the setting not applied; it now
252
- fails on the CLI (exit 1) and in the API (`ValueError`), naming the field you probably
253
- meant. The detector applies the root-level `lora:` remap the schema has honoured
254
- since v0.40.1, so that spelling is accepted, not refused; the two `soup fetch examples`
255
- files using it moved to the canonical `training.lora`. Every recipe and template loads
256
- clean, key names are escaped before they reach the terminal, and the scan is bounded.
257
- - **MLX honours the config it accepted.** `train_on_responses_only`, `warmup_ratio` /
258
- `scheduler` / `weight_decay` / `optimizer`, `max_grad_norm`, `gradient_accumulation_steps`
259
- and `gradient_checkpointing` were each validated and then dropped on `backend: mlx`. Only
260
- 8 of the 32 optimizer names have an MLX equivalent; the other 24 are refused by name
261
- instead of silently becoming AdamW. MLX also drives the live dashboard, the tracker and
262
- `soup ui`, and `soup doctor --config` lists the settings a backend does not read.
263
- - **Validation loss existed nowhere.** It was computed on every backend and thrown away:
264
- no metrics column, no event field, nothing on the panel. It is now recorded, streamed
265
- and displayed.
266
- - **Breaking: `grpo_variant: gspo` is the published sequence-level objective**
267
- (arXiv:2507.18071), replacing a column-centering heuristic in which a padding token also
268
- shifted the gradient of every row sharing its column. Existing gspo configs will not
269
- reproduce prior runs.
270
- - **Web UI read endpoints and SSE require auth**, with short-lived single-use tickets
271
- instead of a token in a query string; `--public` no longer serves `/docs` and
272
- `/openapi.json` to the LAN; and a training subprocess no longer hangs when nothing
273
- reads its output.
274
- - **`torch>=2.6.0`** closes v0.74.0's known limitation: at 2.5.1 `trl>=0.29` could not
275
- import and every preference trainer was dead. Also fixed: `training.loraplus_lr_ratio`
276
- crashed every run that set it, and `packing: true` raised on TRL 0.29.
244
+ **v0.75.2 — outbound endpoint checks refuse private addresses.** A security patch on top
245
+ of v0.75.1 with one hardening change; everything merged since v0.75.0 ships in the next
246
+ minor release.
247
+
248
+ - **Endpoint URLs can no longer name a private address directly.** The
249
+ `soup data generate --api-base` URL, the vLLM provider, judge URLs (`soup eval judge`,
250
+ eval-gate suites, `soup ship --judge-model`, `training.online_dpo_judge`) and the Web UI
251
+ chat proxy refuse a private, link-local or reserved IP literal over `https` as well as
252
+ `http`. Loopback still works; address a server on your network by its hostname. Details
253
+ in an advisory published with this release.
254
+ - **`http://0.0.0.0` is no longer treated as local** by `soup data generate --api-base` and
255
+ the Web UI chat proxy; use `localhost` or `127.0.0.1`.
256
+ - **`100.64.0.0/10` and `fec0::/10` count as non-public** wherever private addresses were
257
+ already refused, including webhooks, the OTLP endpoint and `soup ingest --pull`.
277
258
 
278
259
  > Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
279
260
  > crash in the native extension before Soup runs at all.
@@ -87,39 +87,20 @@ infrastructure instead of improving models. Soup fixes that.
87
87
 
88
88
  ## What's New
89
89
 
90
- **v0.75.0 — the same `soup.yaml` trained a different recipe on MLX than on transformers,
91
- silently.** Six training options were validated, documented, accepted — and read by nothing
92
- on that backend. **All 60 pull requests in this release came from outside the maintainer**,
93
- by 22 people.
94
-
95
- - **Breaking: an unknown config key now refuses the load.** v0.74 warned and named this
96
- release as the deadline. A typo like `quantizaton`, or a key that only exists on a newer
97
- Soup, used to be dropped while the run proceeded with the setting not applied; it now
98
- fails on the CLI (exit 1) and in the API (`ValueError`), naming the field you probably
99
- meant. The detector applies the root-level `lora:` remap the schema has honoured
100
- since v0.40.1, so that spelling is accepted, not refused; the two `soup fetch examples`
101
- files using it moved to the canonical `training.lora`. Every recipe and template loads
102
- clean, key names are escaped before they reach the terminal, and the scan is bounded.
103
- - **MLX honours the config it accepted.** `train_on_responses_only`, `warmup_ratio` /
104
- `scheduler` / `weight_decay` / `optimizer`, `max_grad_norm`, `gradient_accumulation_steps`
105
- and `gradient_checkpointing` were each validated and then dropped on `backend: mlx`. Only
106
- 8 of the 32 optimizer names have an MLX equivalent; the other 24 are refused by name
107
- instead of silently becoming AdamW. MLX also drives the live dashboard, the tracker and
108
- `soup ui`, and `soup doctor --config` lists the settings a backend does not read.
109
- - **Validation loss existed nowhere.** It was computed on every backend and thrown away:
110
- no metrics column, no event field, nothing on the panel. It is now recorded, streamed
111
- and displayed.
112
- - **Breaking: `grpo_variant: gspo` is the published sequence-level objective**
113
- (arXiv:2507.18071), replacing a column-centering heuristic in which a padding token also
114
- shifted the gradient of every row sharing its column. Existing gspo configs will not
115
- reproduce prior runs.
116
- - **Web UI read endpoints and SSE require auth**, with short-lived single-use tickets
117
- instead of a token in a query string; `--public` no longer serves `/docs` and
118
- `/openapi.json` to the LAN; and a training subprocess no longer hangs when nothing
119
- reads its output.
120
- - **`torch>=2.6.0`** closes v0.74.0's known limitation: at 2.5.1 `trl>=0.29` could not
121
- import and every preference trainer was dead. Also fixed: `training.loraplus_lr_ratio`
122
- crashed every run that set it, and `packing: true` raised on TRL 0.29.
90
+ **v0.75.2 — outbound endpoint checks refuse private addresses.** A security patch on top
91
+ of v0.75.1 with one hardening change; everything merged since v0.75.0 ships in the next
92
+ minor release.
93
+
94
+ - **Endpoint URLs can no longer name a private address directly.** The
95
+ `soup data generate --api-base` URL, the vLLM provider, judge URLs (`soup eval judge`,
96
+ eval-gate suites, `soup ship --judge-model`, `training.online_dpo_judge`) and the Web UI
97
+ chat proxy refuse a private, link-local or reserved IP literal over `https` as well as
98
+ `http`. Loopback still works; address a server on your network by its hostname. Details
99
+ in an advisory published with this release.
100
+ - **`http://0.0.0.0` is no longer treated as local** by `soup data generate --api-base` and
101
+ the Web UI chat proxy; use `localhost` or `127.0.0.1`.
102
+ - **`100.64.0.0/10` and `fec0::/10` count as non-public** wherever private addresses were
103
+ already refused, including webhooks, the OTLP endpoint and `soup ingest --pull`.
123
104
 
124
105
  > Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
125
106
  > crash in the native extension before Soup runs at all.
@@ -1,4 +1,4 @@
1
- <!-- synced-from: README.md sha256:5ceff359925678608a55dc8a4d522221b75668b10e659aa4f0dd05a28f2eb1c4 -->
1
+ <!-- synced-from: README.md sha256:aca2a4e15b1d8c4055ac1b650f9fd514bdfdc024e7d9dd86211a0796263d1d4b -->
2
2
  <p align="center">🌍 <a href="README.md">English</a> | <strong>Türkçe</strong></p>
3
3
 
4
4
  <p align="center">
@@ -88,39 +88,22 @@ yerine altyapıyla boğuşarak geçiriyor. Soup bunu çözer.
88
88
 
89
89
  ## Yenilikler
90
90
 
91
- **v0.75.0 — aynı `soup.yaml`, MLX'te transformers'takinden farklı bir tarif eğitiyordu,
92
- sessizce.** Altı eğitim seçeneği doğrulanıyor, belgeleniyor, kabul ediliyor — ve o arka uçta
93
- hiçbir şey tarafından okunmuyordu. **Bu sürümdeki 60 pull request'in tamamı bakımcı dışından
94
- geldi**, 22 kişiden.
95
-
96
- - **Geriye dönük uyumsuz: bilinmeyen bir yapılandırma anahtarı artık yüklemeyi reddediyor.**
97
- v0.74 uyarı vermiş ve son tarih olarak bu sürümü adlandırmıştı. `quantizaton` gibi bir yazım
98
- hatası ya da yalnızca daha yeni bir Soup'ta bulunan bir anahtar eskiden atılıyor ve
99
- çalıştırma o ayar uygulanmadan devam ediyordu; artık CLI'da (çıkış kodu 1) ve API'de
100
- (`ValueError`) başarısız oluyor ve muhtemelen kastettiğiniz alanı adlandırıyor. Dedektör,
101
- şemanın v0.40.1'den beri tanıdığı üst düzey `lora:` yeniden eşlemesini uyguluyor; yani bu
102
- yazım reddedilmiyor, kabul ediliyor. Onu kullanan iki `soup fetch examples` dosyası kanonik
103
- `training.lora` biçimine taşındı. Her tarif ve şablon temiz yükleniyor, anahtar adları
104
- terminale ulaşmadan önce kaçışlanıyor ve tarama sınırlı.
105
- - **MLX, kabul ettiği yapılandırmaya uyuyor.** `train_on_responses_only`, `warmup_ratio` /
106
- `scheduler` / `weight_decay` / `optimizer`, `max_grad_norm`, `gradient_accumulation_steps`
107
- ve `gradient_checkpointing`, `backend: mlx` üzerinde tek tek doğrulanıp sonra düşürülüyordu.
108
- 32 optimizer adından yalnızca 8'inin MLX karşılığı var; diğer 24'ü sessizce AdamW'ye
109
- dönüşmek yerine adıyla reddediliyor. MLX ayrıca canlı panoyu, izleyiciyi ve `soup ui`'yi
110
- sürüyor; `soup doctor --config` ise bir arka ucun okumadığı ayarları listeliyor.
111
- - **Doğrulama kaybı hiçbir yerde yoktu.** Her arka uçta hesaplanıp atılıyordu: metrik sütunu
112
- yok, olay alanı yok, panoda hiçbir şey yok. Artık kaydediliyor, akıtılıyor ve gösteriliyor.
113
- - **Geriye dönük uyumsuz: `grpo_variant: gspo`, yayımlanmış dizi düzeyi hedef fonksiyonudur**
114
- (arXiv:2507.18071); bir dolgu belirtecinin aynı sütunu paylaşan her satırın gradyanını da
115
- kaydırdığı sütun merkezleme sezgiselinin yerini alıyor. Mevcut gspo yapılandırmaları önceki
116
- çalıştırmaları yeniden üretmeyecek.
117
- - **Web arayüzünün okuma uç noktaları ve SSE, kimlik doğrulama gerektiriyor**; sorgu
118
- dizesindeki bir belirteç yerine kısa ömürlü, tek kullanımlık biletlerle. `--public` artık
119
- `/docs` ve `/openapi.json`'ı yerel ağa sunmuyor; eğitim alt süreci de çıktısını kimse
120
- okumadığında artık askıda kalmıyor.
121
- - **`torch>=2.6.0`**, v0.74.0'ın bilinen sınırlamasını kapatıyor: 2.5.1'de `trl>=0.29` içe
122
- aktarılamıyor ve her tercih eğiticisi ölüydü. Ayrıca düzeltildi: `training.loraplus_lr_ratio`
123
- onu ayarlayan her çalıştırmayı çökertiyordu ve `packing: true` TRL 0.29'da hata veriyordu.
91
+ **v0.75.2 — giden uç nokta denetimleri özel adresleri reddediyor.** v0.75.1'in üzerine
92
+ tek bir sıkılaştırma değişikliği içeren bir güvenlik yaması; v0.75.0'dan bu yana
93
+ birleştirilen her şey bir sonraki ara sürümde geliyor.
94
+
95
+ - **Uç nokta URL'leri artık özel bir adresi doğrudan gösteremiyor.**
96
+ `soup data generate --api-base` URL'si, vLLM sağlayıcısı, yargıç URL'leri (`soup eval judge`,
97
+ eval-gate paketleri, `soup ship --judge-model`, `training.online_dpo_judge`) ve Web
98
+ arayüzünün sohbet vekili; özel, bağlantı-yerel (link-local) veya ayrılmış bir IP
99
+ değişmezini yalnızca `http` üzerinden değil `https` üzerinden de reddediyor. Geri döngü
100
+ (loopback) çalışmaya devam ediyor; ağınızdaki bir sunucuya ana makine adıyla erişin.
101
+ Ayrıntılar bu sürümle birlikte yayımlanan bir danışma belgesinde.
102
+ - **`http://0.0.0.0` artık yerel sayılmıyor**: `soup data generate --api-base` ve Web
103
+ arayüzünün sohbet vekili için `localhost` veya `127.0.0.1` kullanın.
104
+ - **`100.64.0.0/10` ve `fec0::/10` herkese açık olmayan adres sayılıyor**: web kancaları,
105
+ OTLP uç noktası ve `soup ingest --pull` dahil, özel adreslerin zaten reddedildiği her
106
+ yerde.
124
107
 
125
108
  > Yalnızca Python **3.10–3.12**. 3.13+ sürümlerinde pip, Soup daha hiç çalışmadan yerel
126
109
  > eklentide çöken, test edilmemiş PyTorch tekerleklerini çözümlüyordu.
@@ -524,7 +524,8 @@ soup adapters verify ./adapter --public-key trusted.pub
524
524
  ```
525
525
 
526
526
  `verify` fails closed — any tamper, wrong/missing/unreadable key, or a
527
- signature from an untrusted key marks the adapter invalid. Signing keys and
527
+ signature from an untrusted key marks the adapter invalid. With `--public-key`,
528
+ an adapter whose signature record is not `ed25519` is also invalid. Signing keys and
528
529
  trusted public keys are symlink-rejected and size-capped but **not**
529
530
  cwd-contained (keys are secrets that live outside the project). Signature
530
531
  persists as `.soup-signature.json` (atomic write). `sigstore` keyless signing
@@ -221,6 +221,12 @@ soup train --config soup.yaml --cloud modal --gpu a100 --cloud-submit
221
221
  `soup_modal_app.py` builds an image with `soup-cli[train]` pinned to your running version, writes
222
222
  the embedded config inside the container, and runs `soup train` on the chosen GPU.
223
223
 
224
+ Run outputs are written to the `soup-outputs` Modal volume (created on first use), in a directory
225
+ named after the run (`soup-<12 hex>`), so checkpoints outlive the container. When the run ends,
226
+ including after a failed run, the app downloads every file in that directory into your local
227
+ output directory and prints a `modal volume get soup-outputs /<run name> <output dir> --force`
228
+ command that retries the download; that command places the files under `<output dir>/<run name>`.
229
+
224
230
  ### RunPod (Planned)
225
231
 
226
232
  RunPod support is currently in development and descoped from live CLI dispatch pending automated
@@ -233,6 +239,10 @@ Lambda uses an instance rather than a serverless function. The generated local c
233
239
  secret-free cloud-init script as API `user_data`, waits for it over SSH, copies the configured
234
240
  output back, and requests instance termination in a `finally` block. Keep the controller running
235
241
  until it reports that termination succeeded; shutting down the guest does not terminate billing.
242
+ Pressing Ctrl+C during `--cloud-submit` interrupts the controller, which still runs that `finally`
243
+ block, and `soup` waits for it to terminate the instance and exit rather than killing it; the only
244
+ way to skip that cleanup is to kill the controller process itself (for example with `kill` from
245
+ another terminal), which can leave the instance running.
236
246
 
237
247
  Register the public half of an SSH key with Lambda first, then set:
238
248
 
@@ -373,7 +383,7 @@ soup runs clean run_202611...
373
383
  soup runs clean --all --dry-run
374
384
  ```
375
385
 
376
- By default, the `clean` command operates in "surgical mode" (`--keep-weights`), deleting huge optimizer state files (`optimizer.pt`) from lesser checkpoints to save gigabytes, but keeping their lightweight evaluation weights just in case you want to load them later.
386
+ By default, the `clean` command operates in "surgical mode" (`--keep-weights`), deleting huge optimizer state files (`optimizer.pt`) from lesser checkpoints to save gigabytes, but keeping their lightweight evaluation weights just in case you want to load them later. Pass `--no-keep-weights` to delete whole non-best checkpoints instead (the checkpoint with the lowest loss is always kept); combine it with `--dry-run` to see what would go first.
377
387
 
378
388
 
379
389
  ## Alternative Model Hubs
@@ -397,6 +407,9 @@ The endpoint validator follows the same SSRF rules as `HF_ENDPOINT`: only `http`
397
407
 
398
408
  The hub adapter is schema-only in this release; the live downloader and uploader land in v0.51.1.
399
409
 
410
+ `soup push --hub modelscope` authenticates with `--token` or `MODELSCOPE_API_TOKEN`; `--hub modelers`
411
+ with `--token` or `MODELERS_TOKEN`. Neither reads `HF_TOKEN`.
412
+
400
413
 
401
414
  ## TensorBoard Integration
402
415
 
@@ -437,3 +437,4 @@ mutating tools (`train_start`, `export`) are gated behind `--allow-mutating`
437
437
  - **Subprocess Isolation:** Execution runs the Soup CLI as an isolated subprocess (`shell=False`, `stdin=DEVNULL`, `cwd` pinned to server startup directory). Child stdout/stderr is redirected to `.soup/mcp-runs/<run_id>.log` to avoid corrupting the MCP JSON-RPC stdio stream.
438
438
  - **Concurrency & Disconnects:** Enforces 1 active execution at a time, gated on a persisted run whose process is still alive — so a **restarted** server does not launch a second training while a child from a previous server is still running, and a stale record whose process is gone never blocks execution. A `launching` record (committed before the child process exists, pid not yet written) blocks restart capacity too: it is indistinguishable from "about to spawn", so treating it as live is the safe direction after a crash in that window. If a server crash leaves that row behind, `soup mcp runs reconcile --expunge-launching` removes rows older than five minutes and prints every removed `run_id`; use `--older-than-seconds N` to choose another positive threshold. The command refuses the whole operation if any candidate records a PID that is still alive. Launches run in background (fire-and-forget). Disconnecting the MCP client does not terminate an already-running subprocess.
439
439
  - **Config Snapshotting & Input Revalidation:** At plan time (`train_start`), the validated config is snapshotted to `.soup/mcp-runs/<run_id>/config.yaml`, and execution uses this snapshot rather than the original mutable config path. External protected inputs (such as datasets and model/checkpoint directories or files) are not frozen in the snapshot; instead, their content digests (computed via SHA-256 for regular files, or deterministic recursive content hashing over sorted relative file paths for directory trees, bounded by file-count and total-byte safety limits) are recorded at plan time and revalidated immediately before spawn. Modifying an external protected input between plan and execute invalidates the token. Modifying the original config path after planning has no effect because execution strictly uses the snapshotted config. Snapshotting freezes only the configuration itself, not external filesystem assets.
440
+ - **Every Local Input Is Pinned:** A train plan pins every local file or directory the run reads (model, datasets, reward/teacher/PRM models, reward `.py` files, unlearning sets); an input outside the working directory is refused at plan time, and an input that did not exist at plan time must still not exist at execution.
@@ -218,6 +218,8 @@ tasks:
218
218
  judge_model: ollama://llama3.1 # SSRF-allowlisted scheme
219
219
  ```
220
220
 
221
+ `judge_model` accepts `ollama://<model>`, `http://localhost:<port>/<model>` or `https://<host>/<model>`. An `https://` judge URL uses `OPENAI_API_KEY` only when its host is `api.openai.com`; other hosts are called as an OpenAI-compatible server without that key.
222
+
221
223
  Baselines may be a registry reference (`registry://<name-or-id>`), a file path, or omitted for the first run. Any structured exception (`ValueError`, `FileNotFoundError`, `OSError`) during the gate is treated as a regression under `on_regression: stop`.
222
224
 
223
225
 
@@ -516,6 +516,15 @@ output: ./output
516
516
  >
517
517
  > If that prints anything, the adapter is affected. From v0.72.1 a streamed adapter is byte-for-byte in the same layout as an ordinary LoRA run.
518
518
 
519
+ > **peft 0.21.0 (released 2026-09-15) saved a streamed adapter EMPTY on every Soup before the #1005 fix — re-run those trainings.** peft 0.21 selects the adapter tensors to save by the prefixes it reads off `model.named_modules()`; the streaming wrapper's module names carried an `.inner.` segment its saved keys did not, so `trainer.save_model()`, every `save_steps` checkpoint and `PeftModel.save_pretrained()` wrote a 40-byte `adapter_model.safetensors` holding **zero** tensors, training reported success, and `--resume` loaded nothing. The training itself was correct — only the file is empty, and nothing in it can be recovered. Check with:
520
+ >
521
+ > ```bash
522
+ > python -c "from safetensors.torch import load_file; \
523
+ > print(len(load_file('adapter_model.safetensors')))"
524
+ > ```
525
+ >
526
+ > `0` means the adapter is lost. Fixed on `main` by PR #1010 (the wrapper now reports canonical names, so peft 0.20 and 0.21 both save every tensor; no `peft<0.21` pin); the next release carries it. Until you run a Soup with that fix, `pip install "peft<0.21"` is the workaround.
527
+
519
528
  **Troubleshooting:**
520
529
  - **"trainable LoRA parameters remain on the meta device"** — PEFT attached an
521
530
  adapter without real storage and Soup refused the run before installing the
@@ -425,7 +425,7 @@ curl http://localhost:8000/v1/adapters
425
425
  # → {"adapters": [{"name": "chat", "active": true}, ...], "active": "chat"}
426
426
  ```
427
427
 
428
- Names are validated against `^[a-zA-Z0-9][a-zA-Z0-9-]*$`; activate/deactivate calls are thread-safe behind a lock.
428
+ Names are validated against `^[a-zA-Z0-9][a-zA-Z0-9-]*$`; activate/deactivate calls are thread-safe behind a lock. Activate/deactivate also check the `Host` and `Origin` headers (see [Server-Side Tool Endpoints](#server-side-tool-endpoints)).
429
429
 
430
430
  ### Multi-Tenant Vector Bank (`soup serve --bank`)
431
431
 
@@ -559,6 +559,8 @@ soup ui
559
559
 
560
560
  **Security:** The Web UI generates a random auth token at startup (printed to console). Every private endpoint — mutating (start/stop training, delete runs, inspect data, validate config) and reading (runs, metrics, system, recipes, SSE streams) — requires an `Authorization: Bearer <token>` header. `/` and `/api/health` stay open so the dashboard can load. CORS is restricted to the served origin. Data inspection is sandboxed to the working directory.
561
561
 
562
+ **Content policy.** Every Web UI response carries a `Content-Security-Policy` that allows scripts only from the UI's own origin and the pinned Chart.js file (no inline script, no `eval`), plus `X-Content-Type-Options: nosniff`, `Referrer-Policy: no-referrer` and `X-Frame-Options: DENY`. Chart.js is loaded with a Subresource Integrity hash, so the browser refuses it if the CDN serves different bytes. The UI's markup carries no inline event handlers, and every server- or dataset-derived value is escaped before it is rendered. The loopback-only `/docs`, `/docs/oauth2-redirect` and `/redoc` pages are the one exception to the policy header, because FastAPI's interactive docs start from an inline script.
563
+
562
564
  **Interactive API docs are loopback-only.** `/openapi.json`, `/docs`, `/docs/oauth2-redirect` and `/redoc` serve on a loopback bind and are **absent** (404) on any other, including `soup ui --public`. This is deliberate rather than incidental: the schema exposes no run data, configuration or logs, but it does describe every route, parameter and request/response shape, and on a LAN bind that is free reconnaissance. Gating them behind the token instead was rejected — `/docs` is a browser navigation and Swagger cannot attach a Bearer header to it, so gating would break the page for a developer while leaving `/openapi.json` readable by any HTTP client. If you need the schema while bound publicly, read it from a loopback instance of the same version.
563
565
 
564
566
  ```bash
@@ -767,3 +769,14 @@ Three POST routes are now available on `soup serve`:
767
769
  HTTP 501 when strict OS isolation is unavailable (including on Windows or restricted
768
770
  Linux containers).
769
771
 
772
+ Tool routes, `/v1/thumbs` and adapter activate/deactivate accept requests only when the
773
+ `Host` header names the bound address (any loopback name for a loopback bind) and any
774
+ `Origin` header names the same; otherwise they answer 421 or 403.
775
+
776
+ The generation routes (`/v1/chat/completions`, `/v1/messages`) and the adapter listing
777
+ (`GET /v1/adapters`) carry the narrower half of that check: a request whose `Origin` names
778
+ another site is refused with 403, so a page the operator merely visits cannot drive
779
+ generation on their server or enumerate the loaded adapters — CORS alone would only stop
780
+ that page *reading* the reply, not sending the request. Requests that carry no `Origin` at
781
+ all — curl, the OpenAI/Anthropic SDKs, a reverse proxy — are unaffected, and `Host` is not
782
+ checked on these routes, so a proxy can still front them under its own hostname.
@@ -646,6 +646,8 @@ The judge is Soup's own OpenAI-compatible `JudgeEvaluator` adapted to TRL's
646
646
  `BasePairwiseJudge` (swap-debiased: a winner is only recorded when both A,B and
647
647
  B,A orders agree). Recipe: `online-dpo-smollm2-135m`. Proof-of-mechanism was
648
648
  validated on SmolLM2-135M with a synthetic judge (not a production RLHF claim; #286).
649
+ An `https://` judge URL uses `OPENAI_API_KEY` only when its host is `api.openai.com`; other
650
+ hosts are called as an OpenAI-compatible server without that key.
649
651
 
650
652
 
651
653
  ## Weighted Multi-Objective Preference Loss
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.75.0"
7
+ version = "0.75.2"
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.75.0"
3
+ __version__ = "0.75.2"
@@ -18,7 +18,7 @@ from pathlib import Path
18
18
  from typing import Callable, Optional
19
19
 
20
20
  from soup_cli.cans.schema import DeployTarget, Manifest
21
- from soup_cli.cans.unpack import extract_can, inspect_can
21
+ from soup_cli.cans.unpack import extract_can, inspect_can, read_config
22
22
  from soup_cli.utils.paths import is_under_cwd
23
23
 
24
24
  _RUN_TIMEOUT_SECONDS = 60 * 60 * 24 # 24h max — generous; user kills with ^C
@@ -130,10 +130,27 @@ def _deploy_target(target: DeployTarget, extract_dir: Path) -> int:
130
130
  "--name", target.name,
131
131
  ])
132
132
  if target.kind == "gguf":
133
- # Already extracted — just confirm presence.
133
+ # Already extracted — just confirm presence, but verify the manifest's
134
+ # path really resolves inside extract_dir first. ``target.path`` comes
135
+ # from the can, so an absolute path (pathlib drops the left operand
136
+ # when the right one is absolute), a ``..`` segment, or a symlink
137
+ # planted in the can would otherwise reach an arbitrary file on disk.
138
+ # Same containment pattern as the kind=ollama branch above; the
139
+ # DeployTarget field validator is the first line, this is the second.
134
140
  if not target.path:
135
141
  raise ValueError("deploy_target kind=gguf requires 'path'")
136
- gguf_path = (extract_dir / target.path).resolve()
142
+ extract_real = os.path.realpath(str(extract_dir))
143
+ gguf_real = os.path.realpath(str(extract_dir / target.path))
144
+ try:
145
+ common = os.path.commonpath([extract_real, gguf_real])
146
+ except ValueError: # different drives on Windows — never contained
147
+ common = ""
148
+ if common != extract_real or gguf_real == extract_real:
149
+ raise ValueError(
150
+ f"deploy gguf path '{target.path}' escapes the can extract "
151
+ f"dir - refusing"
152
+ )
153
+ gguf_path = Path(gguf_real)
137
154
  if not gguf_path.exists():
138
155
  raise FileNotFoundError(f"deploy gguf path not found: {gguf_path}")
139
156
  return 0
@@ -180,6 +197,10 @@ def run_can(
180
197
 
181
198
  # Read manifest first — surface schema errors before any side effects.
182
199
  manifest = inspect_can(str(src))
200
+ # The extracted config.yaml is handed to ``soup train``, whose loader has
201
+ # no size or expansion limit of its own; read it through the capped reader
202
+ # first so an oversized or alias-amplified config is refused here.
203
+ read_config(str(src))
183
204
 
184
205
  if not yes:
185
206
  if confirm_callback is None:
@@ -8,6 +8,8 @@ from typing import Literal, Optional
8
8
 
9
9
  from pydantic import BaseModel, Field, field_validator
10
10
 
11
+ from soup_cli.utils.yaml_limits import check_expanded_nodes
12
+
11
13
  CAN_FORMAT_VERSION = 3 # v0.71.3 #182: attestations field (additive over v2)
12
14
  SUPPORTED_CAN_FORMAT_VERSIONS = (1, 2, 3)
13
15
 
@@ -28,6 +30,11 @@ def validate_attestation_statement(stmt: object) -> dict:
28
30
  """
29
31
  if not isinstance(stmt, dict):
30
32
  raise ValueError("attestation must be a dict (in-toto Statement)")
33
+ # Before json.dumps: a statement loaded from YAML may share references
34
+ # (anchors / aliases) whose serialised form is exponentially larger. Every
35
+ # node costs at least one byte of JSON, so a statement within the byte cap
36
+ # below has fewer nodes than _MAX_ATTESTATION_BYTES and always passes.
37
+ check_expanded_nodes(stmt, "attestation", limit=_MAX_ATTESTATION_BYTES)
31
38
  type_field = stmt.get("_type")
32
39
  predicate_type = stmt.get("predicateType")
33
40
  if not isinstance(type_field, str) or not type_field:
@@ -11,14 +11,54 @@ import yaml
11
11
 
12
12
  from soup_cli.cans.schema import Manifest
13
13
  from soup_cli.utils.paths import is_under_cwd
14
-
15
-
16
- def _read_text_member(tar: tarfile.TarFile, name: str) -> str:
17
- member = tar.getmember(name)
14
+ from soup_cli.utils.yaml_limits import check_yaml_expanded_size
15
+
16
+ #: Largest ``manifest.yaml`` read into memory. A manifest holds a handful of
17
+ #: short fields plus at most 64 attestations of <= 1 MiB each, so a real one is
18
+ #: far below this.
19
+ MAX_MANIFEST_BYTES = 16 * 1024 * 1024
20
+ #: Largest ``config.yaml`` read into memory; a training config is kilobytes.
21
+ MAX_CONFIG_BYTES = 1 * 1024 * 1024
22
+ #: Most members ``extract_can`` will write. ``soup can pack`` writes four.
23
+ MAX_EXTRACT_MEMBERS = 10_000
24
+ #: Largest total declared size of the regular files ``extract_can`` writes.
25
+ #: ``soup can pack`` / ``fork`` write only small text members and refuse a can
26
+ #: over 100 MB compressed, but a hand-assembled can may carry a GGUF for a
27
+ #: ``deploy_targets`` entry (``cans/run.py:_deploy_target``). GGUF weights are
28
+ #: already quantised and barely compress, and an 8B model at Q4_K_M is ~4.9 GB,
29
+ #: so 8 GiB covers that case with margin while bounding what a small gzip
30
+ #: stream can expand to on disk (deflate reaches ~1000:1 on repetitive input).
31
+ MAX_EXTRACT_BYTES = 8 * 1024 * 1024 * 1024
32
+
33
+
34
+ def _read_text_member(
35
+ tar: tarfile.TarFile, name: str, max_bytes: int,
36
+ ) -> tuple[str, int]:
37
+ """Return ``(text, byte_length)`` of a regular UTF-8 member, size-capped."""
38
+ try:
39
+ member = tar.getmember(name)
40
+ except KeyError as exc:
41
+ raise ValueError(f"can has no member '{name}'") from exc
42
+ if not member.isfile():
43
+ raise ValueError(f"member '{name}' in can is not a regular file")
44
+ if member.size > max_bytes:
45
+ raise ValueError(
46
+ f"member '{name}' in can is too large "
47
+ f"({member.size} > {max_bytes} bytes)"
48
+ )
18
49
  extracted = tar.extractfile(member)
19
50
  if extracted is None:
20
51
  raise ValueError(f"cannot read member '{name}' from can")
21
- return extracted.read().decode("utf-8")
52
+ # The header size is not trusted alone: the read itself is bounded.
53
+ raw = extracted.read(max_bytes + 1)
54
+ if len(raw) > max_bytes:
55
+ raise ValueError(
56
+ f"member '{name}' in can is too large (> {max_bytes} bytes)"
57
+ )
58
+ try:
59
+ return raw.decode("utf-8"), len(raw)
60
+ except UnicodeDecodeError as exc:
61
+ raise ValueError(f"member '{name}' in can is not valid UTF-8: {exc}") from exc
22
62
 
23
63
 
24
64
  def inspect_can(path: str) -> Manifest:
@@ -33,8 +73,11 @@ def inspect_can(path: str) -> Manifest:
33
73
  if not can_path.exists():
34
74
  raise FileNotFoundError(f"can not found: {path}")
35
75
  with tarfile.open(can_path, mode="r:gz") as tar:
36
- manifest_text = _read_text_member(tar, "manifest.yaml")
76
+ manifest_text, manifest_bytes = _read_text_member(
77
+ tar, "manifest.yaml", MAX_MANIFEST_BYTES,
78
+ )
37
79
  data = yaml.safe_load(manifest_text) or {}
80
+ check_yaml_expanded_size(data, "manifest.yaml", source_bytes=manifest_bytes)
38
81
  return Manifest(**data)
39
82
 
40
83
 
@@ -46,8 +89,9 @@ def read_config(path: str) -> dict[str, Any]:
46
89
  if not can_path.exists():
47
90
  raise FileNotFoundError(f"can not found: {path}")
48
91
  with tarfile.open(can_path, mode="r:gz") as tar:
49
- cfg_text = _read_text_member(tar, "config.yaml")
92
+ cfg_text, cfg_bytes = _read_text_member(tar, "config.yaml", MAX_CONFIG_BYTES)
50
93
  data = yaml.safe_load(cfg_text) or {}
94
+ check_yaml_expanded_size(data, "config.yaml", source_bytes=cfg_bytes)
51
95
  if not isinstance(data, dict):
52
96
  raise ValueError("config.yaml must deserialise to a mapping")
53
97
  return data
@@ -100,5 +144,30 @@ def extract_can(path: str, dest_dir: str) -> Path:
100
144
  dest = Path(dest_dir)
101
145
  dest.mkdir(parents=True, exist_ok=True)
102
146
  with tarfile.open(can_path, mode="r:gz") as tar:
147
+ _check_extract_bounds(tar)
103
148
  _safe_extract(tar, dest)
104
149
  return dest
150
+
151
+
152
+ def _check_extract_bounds(tar: tarfile.TarFile) -> None:
153
+ """Refuse a can whose member count or total file size is over the limits.
154
+
155
+ Runs before anything is written, so a refused can leaves no partial
156
+ output. Iterates lazily so the count stops the header scan early.
157
+ """
158
+ count = 0
159
+ total = 0
160
+ for member in tar:
161
+ count += 1
162
+ if count > MAX_EXTRACT_MEMBERS:
163
+ raise ValueError(
164
+ f"can has too many members (> {MAX_EXTRACT_MEMBERS}); "
165
+ "refusing to extract"
166
+ )
167
+ if member.isfile():
168
+ total += member.size
169
+ if total > MAX_EXTRACT_BYTES:
170
+ raise ValueError(
171
+ f"can expands to more than {MAX_EXTRACT_BYTES} bytes; "
172
+ "refusing to extract"
173
+ )