soup-cli 0.75.1__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.1 → soup_cli-0.75.2}/CHANGELOG.md +22 -0
  2. {soup_cli-0.75.1 → soup_cli-0.75.2}/PKG-INFO +15 -22
  3. {soup_cli-0.75.1 → soup_cli-0.75.2}/README.md +14 -21
  4. {soup_cli-0.75.1 → soup_cli-0.75.2}/README.tr.md +17 -25
  5. {soup_cli-0.75.1 → soup_cli-0.75.2}/pyproject.toml +1 -1
  6. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/__init__.py +1 -1
  7. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/generate.py +12 -4
  8. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ship.py +25 -14
  9. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/schema.py +16 -1
  10. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/vllm.py +4 -0
  11. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/gate.py +9 -1
  12. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/judge.py +10 -1
  13. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/app.py +18 -3
  14. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/net_guard.py +81 -0
  15. soup_cli-0.75.2/tests/test_issue616_net_guard_is_shared.py +436 -0
  16. soup_cli-0.75.2/tests/test_outbound_endpoint_ip_literals.py +734 -0
  17. soup_cli-0.75.1/tests/test_issue616_net_guard_is_shared.py +0 -208
  18. {soup_cli-0.75.1 → soup_cli-0.75.2}/.dockerignore +0 -0
  19. {soup_cli-0.75.1 → soup_cli-0.75.2}/.gitattributes +0 -0
  20. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/FUNDING.yml +0 -0
  21. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  22. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  23. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  24. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/constraints/transformers-floor.txt +0 -0
  25. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/pull_request_template.md +0 -0
  26. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/ci.yml +0 -0
  27. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/dependency-drift.yml +0 -0
  28. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/docker.yml +0 -0
  29. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/publish.yml +0 -0
  30. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/recipe-repo-ids.yml +0 -0
  31. {soup_cli-0.75.1 → soup_cli-0.75.2}/.github/workflows/recipe-validation.yml +0 -0
  32. {soup_cli-0.75.1 → soup_cli-0.75.2}/.gitignore +0 -0
  33. {soup_cli-0.75.1 → soup_cli-0.75.2}/.mailmap +0 -0
  34. {soup_cli-0.75.1 → soup_cli-0.75.2}/.pre-commit-config.yaml +0 -0
  35. {soup_cli-0.75.1 → soup_cli-0.75.2}/AGENTS.md +0 -0
  36. {soup_cli-0.75.1 → soup_cli-0.75.2}/CODEOWNERS +0 -0
  37. {soup_cli-0.75.1 → soup_cli-0.75.2}/CODE_OF_CONDUCT.md +0 -0
  38. {soup_cli-0.75.1 → soup_cli-0.75.2}/CONTRIBUTING.md +0 -0
  39. {soup_cli-0.75.1 → soup_cli-0.75.2}/CONTRIBUTORS.md +0 -0
  40. {soup_cli-0.75.1 → soup_cli-0.75.2}/Dockerfile +0 -0
  41. {soup_cli-0.75.1 → soup_cli-0.75.2}/LICENSE +0 -0
  42. {soup_cli-0.75.1 → soup_cli-0.75.2}/NOTICE +0 -0
  43. {soup_cli-0.75.1 → soup_cli-0.75.2}/SECURITY.md +0 -0
  44. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/README.md +0 -0
  45. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/bench_validator.py +0 -0
  46. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-395-second-stack-vram.md +0 -0
  47. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-655-pinned-store-accounting.md +0 -0
  48. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-674-quest-w4a4-sft.md +0 -0
  49. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-h100-validation.md +0 -0
  50. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-qwen4-ple-m4-max.md +0 -0
  51. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.0-layer-streaming.md +0 -0
  52. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.2-nf4.md +0 -0
  53. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.3-breadth.md +0 -0
  54. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.72.4-preference-losses.md +0 -0
  55. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.73.1-measured-vram-fit.md +0 -0
  56. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/gate-v0.73.2-leg2-scoring.md +0 -0
  57. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/bitexact.py +0 -0
  58. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/bnb_repro.py +0 -0
  59. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/fsdp_sharding_probe.py +0 -0
  60. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/issue331_qlora_scope.py +0 -0
  61. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/issue395_second_stack_vram.py +0 -0
  62. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/harness/mlx_sft_smoke.py +0 -0
  63. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/probe-v0.73.0-what-bounds-streaming.md +0 -0
  64. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/run-m1-8gb-mlx-sft.md +0 -0
  65. {soup_cli-0.75.1 → soup_cli-0.75.2}/benchmarks/run-t4-colab-free-tier.md +0 -0
  66. {soup_cli-0.75.1 → soup_cli-0.75.2}/changelog.d/README.md +0 -0
  67. {soup_cli-0.75.1 → soup_cli-0.75.2}/docker-compose.yml +0 -0
  68. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/README.md +0 -0
  69. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/adapters-and-governance.md +0 -0
  70. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/assets/layer-streaming.gif +0 -0
  71. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/assets/web-ui-new-training.png +0 -0
  72. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/autodistill.md +0 -0
  73. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/backends-and-ops.md +0 -0
  74. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/commands.md +0 -0
  75. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/compliance.md +0 -0
  76. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/data.md +0 -0
  77. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/evaluation.md +0 -0
  78. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/models.md +0 -0
  79. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/peft-and-efficiency.md +0 -0
  80. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/performance-and-quantization.md +0 -0
  81. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/serving-and-export.md +0 -0
  82. {soup_cli-0.75.1 → soup_cli-0.75.2}/docs/training.md +0 -0
  83. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/README.md +0 -0
  84. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/dpo_chat.yaml +0 -0
  85. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/dpo_example.yaml +0 -0
  86. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/grpo_reasoning.yaml +0 -0
  87. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step1_sft.yaml +0 -0
  88. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step2_reward.yaml +0 -0
  89. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  90. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/sft_basic.yaml +0 -0
  91. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/configs/vision_llama.yaml +0 -0
  92. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/README.md +0 -0
  93. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/alpaca_tiny.jsonl +0 -0
  94. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/chat_preferences.jsonl +0 -0
  95. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/dpo_sample.jsonl +0 -0
  96. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/data/reasoning_math.jsonl +0 -0
  97. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/reward_hacking/rewards.py +0 -0
  98. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/synthetic_workflow.md +0 -0
  99. {soup_cli-0.75.1 → soup_cli-0.75.2}/examples/synthetic_workflow.yaml +0 -0
  100. {soup_cli-0.75.1 → soup_cli-0.75.2}/notebooks/proof-4gb.ipynb +0 -0
  101. {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/__init__.py +0 -0
  102. {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/assemble_changelog.py +0 -0
  103. {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/autodistill_b1_hardware_smoke.py +0 -0
  104. {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/check_recipe_repo_ids.py +0 -0
  105. {soup_cli-0.75.1 → soup_cli-0.75.2}/scripts/generate_recipe_snapshot.py +0 -0
  106. {soup_cli-0.75.1 → soup_cli-0.75.2}/soup.png +0 -0
  107. {soup_cli-0.75.1 → soup_cli-0.75.2}/soup_logo_svg.svg +0 -0
  108. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/__main__.py +0 -0
  109. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/__init__.py +0 -0
  110. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/capture.py +0 -0
  111. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/contract.py +0 -0
  112. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/fingerprints.py +0 -0
  113. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/mlx_worker.py +0 -0
  114. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autodistill/publisher.py +0 -0
  115. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/__init__.py +0 -0
  116. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/analyzer.py +0 -0
  117. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/decisions.py +0 -0
  118. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/autopilot/generate_config.py +0 -0
  119. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/__init__.py +0 -0
  120. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/pack.py +0 -0
  121. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/publish.py +0 -0
  122. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/run.py +0 -0
  123. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/schema.py +0 -0
  124. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/unpack.py +0 -0
  125. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cans/verify.py +0 -0
  126. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cli.py +0 -0
  127. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/__init__.py +0 -0
  128. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/_common.py +0 -0
  129. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/lambda_labs.py +0 -0
  130. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/cloud/modal.py +0 -0
  131. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/__init__.py +0 -0
  132. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0550.py +0 -0
  133. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0610.py +0 -0
  134. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v0650.py +0 -0
  135. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_eval_v07110.py +0 -0
  136. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/_webhook_cli.py +0 -0
  137. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ab.py +0 -0
  138. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/active_sample.py +0 -0
  139. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/adapters.py +0 -0
  140. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/advise.py +0 -0
  141. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/agent.py +0 -0
  142. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/airgap.py +0 -0
  143. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/apple_adapter.py +0 -0
  144. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/attest.py +0 -0
  145. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/audit_log.py +0 -0
  146. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/autopilot.py +0 -0
  147. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/bench.py +0 -0
  148. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/bom.py +0 -0
  149. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/build.py +0 -0
  150. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/can.py +0 -0
  151. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/card.py +0 -0
  152. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/chat.py +0 -0
  153. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ci.py +0 -0
  154. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/compile_cmd.py +0 -0
  155. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/compile_tools.py +0 -0
  156. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/completions.py +0 -0
  157. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/cost.py +0 -0
  158. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data.py +0 -0
  159. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_canary.py +0 -0
  160. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_doctor.py +0 -0
  161. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_forge.py +0 -0
  162. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_mix.py +0 -0
  163. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_score.py +0 -0
  164. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/data_topics.py +0 -0
  165. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  166. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/deploy.py +0 -0
  167. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/diagnose.py +0 -0
  168. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/diff.py +0 -0
  169. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/distill_prompt.py +0 -0
  170. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/doctor.py +0 -0
  171. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/draft.py +0 -0
  172. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/drift_alarm.py +0 -0
  173. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/edit.py +0 -0
  174. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/env.py +0 -0
  175. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/eval.py +0 -0
  176. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/expect.py +0 -0
  177. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/export.py +0 -0
  178. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/fetch.py +0 -0
  179. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/history.py +0 -0
  180. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/infer.py +0 -0
  181. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ingest.py +0 -0
  182. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/init.py +0 -0
  183. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/iterative_dpo.py +0 -0
  184. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/license_advisor.py +0 -0
  185. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/llama.py +0 -0
  186. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/local_rl.py +0 -0
  187. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/lock.py +0 -0
  188. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/loop.py +0 -0
  189. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/mcp.py +0 -0
  190. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/merge.py +0 -0
  191. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  192. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/migrate.py +0 -0
  193. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/monitor.py +0 -0
  194. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/plan.py +0 -0
  195. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/plugins.py +0 -0
  196. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/probe.py +0 -0
  197. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/profile.py +0 -0
  198. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/prune_prompt.py +0 -0
  199. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/push.py +0 -0
  200. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/quantize.py +0 -0
  201. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/quickstart.py +0 -0
  202. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ra_dit.py +0 -0
  203. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/recipes.py +0 -0
  204. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/registry.py +0 -0
  205. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/reward.py +0 -0
  206. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/runs.py +0 -0
  207. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/serve.py +0 -0
  208. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/shrink.py +0 -0
  209. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/spectrum.py +0 -0
  210. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/steer.py +0 -0
  211. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/sweep.py +0 -0
  212. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tokenizer.py +0 -0
  213. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/train.py +0 -0
  214. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tui.py +0 -0
  215. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/tunability.py +0 -0
  216. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/ui.py +0 -0
  217. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/commands/why.py +0 -0
  218. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/__init__.py +0 -0
  219. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/backend_support.py +0 -0
  220. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/loader.py +0 -0
  221. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/config/unknown_keys.py +0 -0
  222. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/__init__.py +0 -0
  223. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  224. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  225. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  226. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  227. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  228. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  229. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  230. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  231. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/format_json.jsonl +0 -0
  232. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/over_refusal.jsonl +0 -0
  233. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/safety.jsonl +0 -0
  234. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +0 -0
  235. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  236. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  237. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  238. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  239. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/augment.py +0 -0
  240. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/chat_templates.py +0 -0
  241. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/collators.py +0 -0
  242. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/formats.py +0 -0
  243. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/loader.py +0 -0
  244. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/loss_mask.py +0 -0
  245. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/__init__.py +0 -0
  246. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/_utils.py +0 -0
  247. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/anthropic.py +0 -0
  248. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/providers/ollama.py +0 -0
  249. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/sft_format.py +0 -0
  250. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/__init__.py +0 -0
  251. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/code.py +0 -0
  252. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/conversation.py +0 -0
  253. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/preference.py +0 -0
  254. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/qa.py +0 -0
  255. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/reasoning.py +0 -0
  256. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/tool_calling.py +0 -0
  257. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/templates/verifiable.py +0 -0
  258. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/__init__.py +0 -0
  259. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/pair_builder.py +0 -0
  260. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/parsers.py +0 -0
  261. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/traces/quality.py +0 -0
  262. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/data/validator.py +0 -0
  263. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/__init__.py +0 -0
  264. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/_common.py +0 -0
  265. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/calculator.py +0 -0
  266. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/guess_number.py +0 -0
  267. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/envs/retrieval_qa.py +0 -0
  268. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/__init__.py +0 -0
  269. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/aider_polyglot.py +0 -0
  270. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/arena.py +0 -0
  271. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  272. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/calibrate.py +0 -0
  273. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  274. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/custom.py +0 -0
  275. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/forgetting.py +0 -0
  276. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/gate_suites.py +0 -0
  277. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/human.py +0 -0
  278. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/leaderboard.py +0 -0
  279. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/eval/quant_check.py +0 -0
  280. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/experiment/__init__.py +0 -0
  281. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/experiment/tracker.py +0 -0
  282. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/__init__.py +0 -0
  283. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/execution.py +0 -0
  284. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/registry.py +0 -0
  285. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/mcp_server/server.py +0 -0
  286. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/__init__.py +0 -0
  287. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/axolotl.py +0 -0
  288. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/common.py +0 -0
  289. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/llamafactory.py +0 -0
  290. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/migrate/unsloth.py +0 -0
  291. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/__init__.py +0 -0
  292. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/callback.py +0 -0
  293. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  294. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/display.py +0 -0
  295. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  296. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/hf_push.py +0 -0
  297. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  298. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/monitoring/trace_logger.py +0 -0
  299. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/plugins/__init__.py +0 -0
  300. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/py.typed +0 -0
  301. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/recipes/__init__.py +0 -0
  302. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/recipes/catalog.py +0 -0
  303. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/__init__.py +0 -0
  304. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/attach.py +0 -0
  305. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/diff.py +0 -0
  306. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/hashing.py +0 -0
  307. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/registry/store.py +0 -0
  308. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/__init__.py +0 -0
  309. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/audio.yaml +0 -0
  310. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/bco.yaml +0 -0
  311. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/chat.yaml +0 -0
  312. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/code.yaml +0 -0
  313. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/embedding.yaml +0 -0
  314. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  315. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  316. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  317. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  318. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/hipaa.yaml +0 -0
  319. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/ipo.yaml +0 -0
  320. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/kto.yaml +0 -0
  321. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/longcontext.yaml +0 -0
  322. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/manifest.json +0 -0
  323. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/medical.yaml +0 -0
  324. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/moe.yaml +0 -0
  325. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/orpo.yaml +0 -0
  326. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/pretrain.yaml +0 -0
  327. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/reasoning.yaml +0 -0
  328. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/rlhf.yaml +0 -0
  329. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/simpo.yaml +0 -0
  330. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/soc2.yaml +0 -0
  331. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  332. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/tool-calling.yaml +0 -0
  333. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/templates/vision.yaml +0 -0
  334. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/__init__.py +0 -0
  335. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/_trl_compat.py +0 -0
  336. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/asr.py +0 -0
  337. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/bco.py +0 -0
  338. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/bitnet.py +0 -0
  339. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/classifier.py +0 -0
  340. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/distill.py +0 -0
  341. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/dpo.py +0 -0
  342. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/embedding.py +0 -0
  343. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/grpo.py +0 -0
  344. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/ipo.py +0 -0
  345. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/kto.py +0 -0
  346. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  347. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  348. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_masking.py +0 -0
  349. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_optim.py +0 -0
  350. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_routing.py +0 -0
  351. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mlx_sft.py +0 -0
  352. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/mole_routing.py +0 -0
  353. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/online_dpo.py +0 -0
  354. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/orpo.py +0 -0
  355. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/ppo.py +0 -0
  356. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/preference.py +0 -0
  357. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/pretrain.py +0 -0
  358. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/prm.py +0 -0
  359. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/raft.py +0 -0
  360. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/reward_model.py +0 -0
  361. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/rewards.py +0 -0
  362. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/sft.py +0 -0
  363. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/simpo.py +0 -0
  364. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/stream_setup.py +0 -0
  365. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/tts.py +0 -0
  366. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/trainer/unlearn.py +0 -0
  367. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/tui_app.py +0 -0
  368. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/__init__.py +0 -0
  369. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/plugins/__init__.py +0 -0
  370. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/app.js +0 -0
  371. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/index.html +0 -0
  372. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.png +0 -0
  373. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/logo.svg +0 -0
  374. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/safe_html.js +0 -0
  375. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/ui/static/style.css +0 -0
  376. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/__init__.py +0 -0
  377. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/_eval_text.py +0 -0
  378. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ab_test.py +0 -0
  379. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/activation_offload.py +0 -0
  380. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/active_sampler.py +0 -0
  381. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  382. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_bisect.py +0 -0
  383. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_branch.py +0 -0
  384. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_diff.py +0 -0
  385. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_fuse.py +0 -0
  386. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_merge.py +0 -0
  387. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_pr.py +0 -0
  388. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_scan.py +0 -0
  389. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/adapter_sign.py +0 -0
  390. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advanced_precision.py +0 -0
  391. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advise.py +0 -0
  392. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/advise_history.py +0 -0
  393. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_forge.py +0 -0
  394. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_rollout.py +0 -0
  395. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/agent_sandbox.py +0 -0
  396. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/airgap_bundle.py +0 -0
  397. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/annex_xi.py +0 -0
  398. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/anthropic_messages.py +0 -0
  399. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/apple_adapter.py +0 -0
  400. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/argv_redaction.py +0 -0
  401. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/asr_metrics.py +0 -0
  402. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/attest.py +0 -0
  403. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/audit_log.py +0 -0
  404. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/auto_quant.py +0 -0
  405. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/backend_detect.py +0 -0
  406. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/batch_probe.py +0 -0
  407. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/behavior_battery.py +0 -0
  408. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n.py +0 -0
  409. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_artifact.py +0 -0
  410. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_checkpoint.py +0 -0
  411. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/best_of_n_stream.py +0 -0
  412. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/bitnet.py +0 -0
  413. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/blame.py +0 -0
  414. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/block_expansion.py +0 -0
  415. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/bom.py +0 -0
  416. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot.py +0 -0
  417. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  418. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/build_dag.py +0 -0
  419. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary.py +0 -0
  420. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary_discovery.py +0 -0
  421. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/canary_router.py +0 -0
  422. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/capability_suite.py +0 -0
  423. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/checklist_dsl.py +0 -0
  424. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  425. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ci_workflow.py +0 -0
  426. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/citation_faithful.py +0 -0
  427. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/classifier.py +0 -0
  428. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cmaes_merge.py +0 -0
  429. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/compile_tools.py +0 -0
  430. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/completions.py +0 -0
  431. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/constants.py +0 -0
  432. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/convergence.py +0 -0
  433. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/crash.py +0 -0
  434. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  435. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum.py +0 -0
  436. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  437. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/cut_ce.py +0 -0
  438. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_doctor.py +0 -0
  439. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_forge.py +0 -0
  440. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_lint.py +0 -0
  441. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_mix.py +0 -0
  442. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_pipeline.py +0 -0
  443. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/data_score.py +0 -0
  444. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deepspeed.py +0 -0
  445. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  446. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/demo_bundles.py +0 -0
  447. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  448. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/deploy_measure.py +0 -0
  449. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/__init__.py +0 -0
  450. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/_common.py +0 -0
  451. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/badge.py +0 -0
  452. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/citation.py +0 -0
  453. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  454. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  455. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/format.py +0 -0
  456. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/live.py +0 -0
  457. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  458. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  459. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  460. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/report.py +0 -0
  461. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/diagnose/runner.py +0 -0
  462. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/distill.py +0 -0
  463. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/dpo_variants.py +0 -0
  464. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/draft.py +0 -0
  465. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/drift_alarm.py +0 -0
  466. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  467. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/echo_trap.py +0 -0
  468. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_diff.py +0 -0
  469. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_governor.py +0 -0
  470. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/edit_kernels.py +0 -0
  471. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/embed.py +0 -0
  472. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/encoding.py +0 -0
  473. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/energy.py +0 -0
  474. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/env_lock.py +0 -0
  475. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/errors.py +0 -0
  476. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_design.py +0 -0
  477. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  478. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  479. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/evolve.py +0 -0
  480. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/expectations.py +0 -0
  481. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fetch_examples.py +0 -0
  482. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/flash_attn.py +0 -0
  483. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fp8.py +0 -0
  484. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/freeze.py +0 -0
  485. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp.py +0 -0
  486. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  487. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/galore.py +0 -0
  488. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gguf_quant.py +0 -0
  489. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gpu.py +0 -0
  490. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gpu_monitor.py +0 -0
  491. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grace_codebook.py +0 -0
  492. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/graceful_save.py +0 -0
  493. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grad_accum.py +0 -0
  494. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  495. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_long_context.py +0 -0
  496. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/grpo_variants.py +0 -0
  497. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hardware_fit.py +0 -0
  498. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/harm_probe.py +0 -0
  499. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hf.py +0 -0
  500. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hf_space.py +0 -0
  501. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/hubs.py +0 -0
  502. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_pull.py +0 -0
  503. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ingest_sources.py +0 -0
  504. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/integrations.py +0 -0
  505. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/interference.py +0 -0
  506. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/interference_live.py +0 -0
  507. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/irt.py +0 -0
  508. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/iterative_dpo.py +0 -0
  509. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  510. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/kernel_picker.py +0 -0
  511. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/knowledge_edit.py +0 -0
  512. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/kv_cache.py +0 -0
  513. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/launcher.py +0 -0
  514. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_shard.py +0 -0
  515. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream.py +0 -0
  516. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/layer_stream_runtime.py +0 -0
  517. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/license_advisor.py +0 -0
  518. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/license_matrix.py +0 -0
  519. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/liger.py +0 -0
  520. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lisa.py +0 -0
  521. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/live_eval.py +0 -0
  522. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/llama_proxy.py +0 -0
  523. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/llama_server_timings.py +0 -0
  524. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_request_guard.py +0 -0
  525. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl.py +0 -0
  526. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  527. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loftq_init.py +0 -0
  528. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/log_level.py +0 -0
  529. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/long_context.py +0 -0
  530. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/longlora.py +0 -0
  531. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_budget.py +0 -0
  532. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_daemon.py +0 -0
  533. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_iteration.py +0 -0
  534. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_stages.py +0 -0
  535. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/loop_state.py +0 -0
  536. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lr_finder.py +0 -0
  537. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/lr_groups.py +0 -0
  538. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/magpie.py +0 -0
  539. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/metrics.py +0 -0
  540. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mii.py +0 -0
  541. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/minillm.py +0 -0
  542. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mix_proxy.py +0 -0
  543. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mixed_precision.py +0 -0
  544. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mlx.py +0 -0
  545. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mod.py +0 -0
  546. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/moe.py +0 -0
  547. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/moe_quant.py +0 -0
  548. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/mole_routing.py +0 -0
  549. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack.py +0 -0
  550. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_sampler.py +0 -0
  551. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/multipack_trainer.py +0 -0
  552. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/namespace_pin.py +0 -0
  553. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/neat_packing.py +0 -0
  554. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ngram_spec.py +0 -0
  555. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/nlg_metrics.py +0 -0
  556. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ollama.py +0 -0
  557. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/onboarding.py +0 -0
  558. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  559. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/oq_affine.py +0 -0
  560. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/paths.py +0 -0
  561. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_builder.py +0 -0
  562. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_patches.py +0 -0
  563. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/peft_wiring.py +0 -0
  564. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/persona_hub.py +0 -0
  565. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/pipeline.py +0 -0
  566. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/plotext_compat.py +0 -0
  567. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/preference_combine.py +0 -0
  568. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prm.py +0 -0
  569. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prm_reward.py +0 -0
  570. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/probe_kernel.py +0 -0
  571. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/probe_pack.py +0 -0
  572. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/process_liveness.py +0 -0
  573. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiler.py +0 -0
  574. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiling.py +0 -0
  575. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  576. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_compile.py +0 -0
  577. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prompt_distill.py +0 -0
  578. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/prune_prompt.py +0 -0
  579. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qat.py +0 -0
  580. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qr_url.py +0 -0
  581. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/quality.py +0 -0
  582. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/quant_menu.py +0 -0
  583. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_compat.py +0 -0
  584. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/qwen4_ple.py +0 -0
  585. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit.py +0 -0
  586. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ra_dit_run.py +0 -0
  587. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/raft.py +0 -0
  588. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_effort.py +0 -0
  589. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reasoning_parser.py +0 -0
  590. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_dag.py +0 -0
  591. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/recipe_run.py +0 -0
  592. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/registry.py +0 -0
  593. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rehearsal.py +0 -0
  594. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/relora.py +0 -0
  595. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/replay.py +0 -0
  596. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/repro_receipt.py +0 -0
  597. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hack_control.py +0 -0
  598. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_hacking.py +0 -0
  599. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_stress.py +0 -0
  600. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/reward_synth.py +0 -0
  601. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ring_attention.py +0 -0
  602. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  603. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  604. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/run_cost.py +0 -0
  605. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sae_diff.py +0 -0
  606. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/safe_regex.py +0 -0
  607. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/save_formats.py +0 -0
  608. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/seeding.py +0 -0
  609. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/semdedup.py +0 -0
  610. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/server_tools.py +0 -0
  611. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sglang.py +0 -0
  612. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ship_verdict.py +0 -0
  613. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/shortcuts.py +0 -0
  614. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/shrink.py +0 -0
  615. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/signing.py +0 -0
  616. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sleeper_probe.py +0 -0
  617. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/soup_lock.py +0 -0
  618. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spec_pairing.py +0 -0
  619. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spectrum_scan.py +0 -0
  620. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/spike_recovery.py +0 -0
  621. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sse_train_stream.py +0 -0
  622. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/steering.py +0 -0
  623. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/strict_safetensors.py +0 -0
  624. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/structured_output.py +0 -0
  625. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/sweep_config.py +0 -0
  626. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tail_latency.py +0 -0
  627. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/terminal.py +0 -0
  628. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/terraform_plan.py +0 -0
  629. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tool_outputs.py +0 -0
  630. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/topics.py +0 -0
  631. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/topology.py +0 -0
  632. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tracing.py +0 -0
  633. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trackers.py +0 -0
  634. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/train_event_buffer.py +0 -0
  635. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trainer_plugins.py +0 -0
  636. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/trust_remote.py +0 -0
  637. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/truth_probe.py +0 -0
  638. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tts.py +0 -0
  639. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tts_codec.py +0 -0
  640. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/tunability.py +0 -0
  641. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/ui_env.py +0 -0
  642. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/uld.py +0 -0
  643. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  644. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning.py +0 -0
  645. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unlearning_eval.py +0 -0
  646. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/unsloth.py +0 -0
  647. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/v028_features.py +0 -0
  648. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vector_bank.py +0 -0
  649. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vllm.py +0 -0
  650. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/vscode_setup.py +0 -0
  651. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/warmup.py +0 -0
  652. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/webhooks.py +0 -0
  653. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/why.py +0 -0
  654. {soup_cli-0.75.1 → soup_cli-0.75.2}/src/soup_cli/utils/yaml_limits.py +0 -0
  655. {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/chat.yaml +0 -0
  656. {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/code.yaml +0 -0
  657. {soup_cli-0.75.1 → soup_cli-0.75.2}/templates/medical.yaml +0 -0
  658. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/__init__.py +0 -0
  659. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/_windows_ci.py +0 -0
  660. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/conftest.py +0 -0
  661. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/capture_token.json +0 -0
  662. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/consumption_ledger.json +0 -0
  663. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/plan.json +0 -0
  664. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/shard_manifest.json +0 -0
  665. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/autodistill/v1/student_rollout_capture_token.json +0 -0
  666. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/issue204_langfuse_observations_v2_page.json +0 -0
  667. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/fixtures/recipe_config_snapshots.json +0 -0
  668. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/mcp_roundtrip.py +0 -0
  669. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v053_qa.md +0 -0
  670. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v07114_qa.md +0 -0
  671. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/qa/v0716_qa.md +0 -0
  672. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_adapter_trusted_key_backend.py +0 -0
  673. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_adapters.py +0 -0
  674. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_advanced_peft.py +0 -0
  675. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_align_trainable_dtype.py +0 -0
  676. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_argv_redaction_bundled_shorts.py +0 -0
  677. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_assistant_mask.py +0 -0
  678. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_audio.py +0 -0
  679. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_audit_log_option_masking.py +0 -0
  680. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_auto_tuning.py +0 -0
  681. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_autopilot.py +0 -0
  682. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_awq_gptq_export.py +0 -0
  683. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_batch_probe.py +0 -0
  684. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bco.py +0 -0
  685. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bench.py +0 -0
  686. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_brain_rot_multilingual.py +0 -0
  687. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_bugfixes.py +0 -0
  688. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_build_dag.py +0 -0
  689. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_callback.py +0 -0
  690. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_deploy_target_containment.py +0 -0
  691. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_output_control_bytes.py +0 -0
  692. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_can_read_limits.py +0 -0
  693. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cans.py +0 -0
  694. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_chat.py +0 -0
  695. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_chat_template.py +0 -0
  696. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli.py +0 -0
  697. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_help_assertions_are_ansi_safe.py +0 -0
  698. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_startup_is_light.py +0 -0
  699. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cli_subprocess.py +0 -0
  700. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cloud_output_dir_containment.py +0 -0
  701. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_critical.py +0 -0
  702. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_deferred.py +0 -0
  703. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_high.py +0 -0
  704. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_medium_low.py +0 -0
  705. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_code_review_recurring.py +0 -0
  706. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_config.py +0 -0
  707. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_config_regex_limits.py +0 -0
  708. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_contributing_test_counts_are_digit_free.py +0 -0
  709. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_cost.py +0 -0
  710. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_crash_reporter.py +0 -0
  711. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_curriculum.py +0 -0
  712. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data.py +0 -0
  713. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_augment.py +0 -0
  714. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_sample.py +0 -0
  715. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_split.py +0 -0
  716. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_data_tools.py +0 -0
  717. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dataset_hub.py +0 -0
  718. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dataset_registry.py +0 -0
  719. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_deepspeed.py +0 -0
  720. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_demo_bundle_metadata.py +0 -0
  721. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_deploy_ollama.py +0 -0
  722. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_device_map_distributed.py +0 -0
  723. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_diff.py +0 -0
  724. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_display.py +0 -0
  725. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_doctor.py +0 -0
  726. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dpo_example.py +0 -0
  727. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_dpo_variants.py +0 -0
  728. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_embedding.py +0 -0
  729. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_errors.py +0 -0
  730. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval.py +0 -0
  731. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval_gate.py +0 -0
  732. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_eval_platform.py +0 -0
  733. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_examples_configs.py +0 -0
  734. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_export.py +0 -0
  735. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_formats.py +0 -0
  736. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_fp8_recipe.py +0 -0
  737. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_freeze_training.py +0 -0
  738. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_generate.py +0 -0
  739. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_gpu.py +0 -0
  740. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_grpo.py +0 -0
  741. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_hf_integration.py +0 -0
  742. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_hub_push_credentials.py +0 -0
  743. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_infer.py +0 -0
  744. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_inference_advanced.py +0 -0
  745. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_init.py +0 -0
  746. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ipo.py +0 -0
  747. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue1005_peft021_canonical_names.py +0 -0
  748. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue1005_peft021_review_round.py +0 -0
  749. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue144_gguf_export.py +0 -0
  750. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue204_langfuse_pull.py +0 -0
  751. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_display_bridge.py +0 -0
  752. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_harness_bridge.py +0 -0
  753. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue23_mlx_val_loss_producer.py +0 -0
  754. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue264_cloud.py +0 -0
  755. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue296_network_transport.py +0 -0
  756. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_kwargs.py +0 -0
  757. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue300_online_dpo_train.py +0 -0
  758. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue302_vision_pad_token.py +0 -0
  759. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue304_cross_tokenizer.py +0 -0
  760. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue305_mixed_rank_arithmetic.py +0 -0
  761. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue308_callback_subclass.py +0 -0
  762. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue316_refusal_apostrophe.py +0 -0
  763. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue316_suites.py +0 -0
  764. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue320_lazy_callback_import.py +0 -0
  765. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue322_mcp2_compat.py +0 -0
  766. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue323_trl_kwarg_drift.py +0 -0
  767. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue327_logits_estimate.py +0 -0
  768. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue330_mix_recipe_train_loadable.py +0 -0
  769. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue332_vllm_prompt.py +0 -0
  770. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue334_fa3_detection.py +0 -0
  771. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue336_deepspeed_lora.py +0 -0
  772. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue339_load_dtype.py +0 -0
  773. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue341_seed_and_fullft.py +0 -0
  774. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue348_calibrated_logits_wiring.py +0 -0
  775. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue349_measured_fit.py +0 -0
  776. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue350_fsdp_qlora.py +0 -0
  777. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue352_fsdp_peft_checkpoint.py +0 -0
  778. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue353_mlx_seed_warning.py +0 -0
  779. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue353_seed_every_task.py +0 -0
  780. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue359_deepspeed_guard_coverage.py +0 -0
  781. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue360_sglang_prompt_finish_reason.py +0 -0
  782. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue367_live_eval_quantization.py +0 -0
  783. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue369_canonical_named_parameters.py +0 -0
  784. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue372_no_reexec_hint.py +0 -0
  785. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue373_fsdp_sharding_probe.py +0 -0
  786. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue374_stream_disk_preflight.py +0 -0
  787. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue377_lisa_train_embeddings.py +0 -0
  788. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue382_windows_ci_guard_is_shared.py +0 -0
  789. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue385_stream_dtype.py +0 -0
  790. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue389_torchao_error.py +0 -0
  791. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue390_expandable_segments_reason.py +0 -0
  792. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue392_mlx_target_keys.py +0 -0
  793. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue394_mlx_runtime_isolation.py +0 -0
  794. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue401_orphaned_run_reconcile.py +0 -0
  795. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue402_restart_capacity.py +0 -0
  796. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue404_baseline_scorer_stamp.py +0 -0
  797. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue423_mlx_device_detection.py +0 -0
  798. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue424_windows_liveness.py +0 -0
  799. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue427_qwen35_text_modality.py +0 -0
  800. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue433_meta_adapter_guard.py +0 -0
  801. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue441_coerce_token_ids.py +0 -0
  802. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue443_interleave_wiring.py +0 -0
  803. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue459_interleave_streaming_hub.py +0 -0
  804. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue477_qwen38_catalog.py +0 -0
  805. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue487_changelog_fragments.py +0 -0
  806. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue491_frozen_base_load_dtype.py +0 -0
  807. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue502_qwen35_transformers5.py +0 -0
  808. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue505_launching_window_blocks_restart.py +0 -0
  809. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue524_launching_reconcile.py +0 -0
  810. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue531_stream_base_provenance.py +0 -0
  811. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue532_supervised_token_guard.py +0 -0
  812. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue533_offline_hf_materialization.py +0 -0
  813. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue534_apple_nvme.py +0 -0
  814. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue546_transient_finite_metric.py +0 -0
  815. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue549_bon_resume.py +0 -0
  816. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue550_bon_offline.py +0 -0
  817. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue555_bon_stream_resume.py +0 -0
  818. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue563_mps_bf16_training.py +0 -0
  819. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue565_grpo_reward_metadata.py +0 -0
  820. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue567_grpo_mps_bf16.py +0 -0
  821. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue571_qwen4_exp.py +0 -0
  822. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue573_qwen4_expert_lora.py +0 -0
  823. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_capture.py +0 -0
  824. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_contract.py +0 -0
  825. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_fingerprints.py +0 -0
  826. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_mlx_worker.py +0 -0
  827. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue580_autodistill_publisher.py +0 -0
  828. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue599_telemetry_dns_ssrf.py +0 -0
  829. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue600_abbreviated_ipv4_ssrf.py +0 -0
  830. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue602_qwen4_ple_streaming.py +0 -0
  831. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue621_recipe_snapshot.py +0 -0
  832. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue623_stream_pin_allocation.py +0 -0
  833. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue627_unknown_config_keys.py +0 -0
  834. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue633_ansi_in_highlighted_output.py +0 -0
  835. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue634_mlx_resume.py +0 -0
  836. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue636_torch_floor.py +0 -0
  837. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue642_sweep_dry_run.py +0 -0
  838. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue649_batch_probe_peak_gate.py +0 -0
  839. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue654_batch_probe_uncovered_branches.py +0 -0
  840. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue676_non_dict_messages.py +0 -0
  841. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue677_recipe_repo_id_guard.py +0 -0
  842. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue681_uld_id_compat.py +0 -0
  843. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue682_uld_loss_label_mask.py +0 -0
  844. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue683_mlx_response_masking.py +0 -0
  845. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue684_mlx_grad_accumulation.py +0 -0
  846. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue685_mlx_grad_checkpoint.py +0 -0
  847. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue686_mlx_optimizer_schedule.py +0 -0
  848. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue687_ui_auth.py +0 -0
  849. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue688_ui_drain.py +0 -0
  850. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue689_hub_streaming.py +0 -0
  851. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue690_embedding_trainer_attrs.py +0 -0
  852. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue691_sft_packing.py +0 -0
  853. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue695_validate_agrees_with_loader.py +0 -0
  854. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue700_embedding_lora_zero.py +0 -0
  855. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue721_ppo_config_forwarding.py +0 -0
  856. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue723_sequence_gspo.py +0 -0
  857. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue724_loraplus_optimizer.py +0 -0
  858. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue724_loraplus_wiring_coverage.py +0 -0
  859. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue731_ui_docs_bind.py +0 -0
  860. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue748_config_fields_reach_a_consumer.py +0 -0
  861. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue752_cli_commands_called_as_functions.py +0 -0
  862. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue755_backend_support_registry.py +0 -0
  863. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue771_validator_fast_path.py +0 -0
  864. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue775_path_containment_ratchet.py +0 -0
  865. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue781_inference_bos.py +0 -0
  866. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue811_data_validate_exit_codes.py +0 -0
  867. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue91_aider_eval.py +0 -0
  868. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_issue99_apple_monitor.py +0 -0
  869. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_jinja_analyzer.py +0 -0
  870. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_judge_key_scoping.py +0 -0
  871. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_kto.py +0 -0
  872. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_lambda_submit_interrupt.py +0 -0
  873. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_loader.py +0 -0
  874. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_local_request_guard.py +0 -0
  875. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_log_level.py +0 -0
  876. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_loss_watchdog.py +0 -0
  877. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_capacity_all_runs.py +0 -0
  878. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_digest_no_follow.py +0 -0
  879. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_execute.py +0 -0
  880. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_plan_inputs.py +0 -0
  881. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mcp_post_spawn_failure.py +0 -0
  882. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_merge.py +0 -0
  883. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_migrate.py +0 -0
  884. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mii_serve.py +0 -0
  885. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_backend.py +0 -0
  886. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_dispatch.py +0 -0
  887. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_mlx_max_grad_norm.py +0 -0
  888. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_modal_stub_outputs.py +0 -0
  889. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_moe.py +0 -0
  890. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multi_adapter.py +0 -0
  891. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multi_gpu.py +0 -0
  892. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_config.py +0 -0
  893. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_ffd_placement.py +0 -0
  894. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_invariants.py +0 -0
  895. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_multipack_sampler.py +0 -0
  896. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_neat_packing.py +0 -0
  897. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_neftune_rslora.py +0 -0
  898. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_no_foreign_license_headers.py +0 -0
  899. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_onnx_tensorrt_export.py +0 -0
  900. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_orpo.py +0 -0
  901. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_packing.py +0 -0
  902. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_a_wave1.py +0 -0
  903. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_a_wave2.py +0 -0
  904. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_b.py +0 -0
  905. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_c.py +0 -0
  906. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_d.py +0 -0
  907. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_e.py +0 -0
  908. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_part_f_hardening.py +0 -0
  909. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_peft_methods.py +0 -0
  910. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_peft_patches.py +0 -0
  911. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_performance.py +0 -0
  912. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_pissa_init.py +0 -0
  913. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_plotext_compat.py +0 -0
  914. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ppo.py +0 -0
  915. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_dispatcher.py +0 -0
  916. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_multi.py +0 -0
  917. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_preference_multi_runtime.py +0 -0
  918. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_pretrain.py +0 -0
  919. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_profile.py +0 -0
  920. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_profiling.py +0 -0
  921. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_progress.py +0 -0
  922. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_push.py +0 -0
  923. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_qat.py +0 -0
  924. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quality_filter.py +0 -0
  925. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quant_check.py +0 -0
  926. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quant_menu.py +0 -0
  927. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_quickstart.py +0 -0
  928. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_qwen35_streaming.py +0 -0
  929. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_rank_pattern.py +0 -0
  930. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_readme_translation_sync.py +0 -0
  931. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipe_count_is_synced.py +0 -0
  932. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipes.py +0 -0
  933. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_recipes_v031.py +0 -0
  934. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_refusal_multilingual.py +0 -0
  935. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_registry.py +0 -0
  936. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_relora.py +0 -0
  937. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_replay.py +0 -0
  938. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_requires_python_bound.py +0 -0
  939. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_resume.py +0 -0
  940. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_review_fixes_v07133.py +0 -0
  941. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_rlvr.py +0 -0
  942. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_run_cost.py +0 -0
  943. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_runs.py +0 -0
  944. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_runs_clean_keep_weights.py +0 -0
  945. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_safe_regex.py +0 -0
  946. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_semantic_split.py +0 -0
  947. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_serve.py +0 -0
  948. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_serve_local_request_guard.py +0 -0
  949. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_server_generate.py +0 -0
  950. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sglang_serve.py +0 -0
  951. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sglang_trust_contract.py +0 -0
  952. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_simpo.py +0 -0
  953. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_smoke_train.py +0 -0
  954. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_speculative_decoding.py +0 -0
  955. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_stream_multi_gpu_guard.py +0 -0
  956. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_sweep.py +0 -0
  957. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_synth_data_pro.py +0 -0
  958. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_telemetry_ssrf.py +0 -0
  959. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_templates_yaml.py +0 -0
  960. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tensorboard.py +0 -0
  961. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tool_calling.py +0 -0
  962. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trace_to_pref.py +0 -0
  963. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tracker.py +0 -0
  964. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trainer_coverage_v035.py +0 -0
  965. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trainer_init.py +0 -0
  966. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_training_intelligence.py +0 -0
  967. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_training_speed.py +0 -0
  968. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_transformers_floor_compat.py +0 -0
  969. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trl_preference_config_contract.py +0 -0
  970. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trl_version_compat.py +0 -0
  971. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_trust_remote_code.py +0 -0
  972. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_tui.py +0 -0
  973. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui.py +0 -0
  974. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_chat.py +0 -0
  975. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_config_builder.py +0 -0
  976. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_live_monitor.py +0 -0
  977. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_metrics.py +0 -0
  978. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_rendering_escapes.py +0 -0
  979. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_ui_security_headers.py +0 -0
  980. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_unsloth.py +0 -0
  981. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_c.py +0 -0
  982. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_d.py +0 -0
  983. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0401_part_e.py +0 -0
  984. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0402_part_a.py +0 -0
  985. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0402_part_b.py +0 -0
  986. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_a.py +0 -0
  987. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_b.py +0 -0
  988. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0403_part_c.py +0 -0
  989. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0404_part_a.py +0 -0
  990. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0404_part_b.py +0 -0
  991. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0405_part_a.py +0 -0
  992. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0406_part_a.py +0 -0
  993. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_a.py +0 -0
  994. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_b.py +0 -0
  995. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0410_part_c.py +0 -0
  996. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0420.py +0 -0
  997. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_a.py +0 -0
  998. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_b.py +0 -0
  999. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_c.py +0 -0
  1000. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0430_part_d.py +0 -0
  1001. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_a.py +0 -0
  1002. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_b.py +0 -0
  1003. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_c.py +0 -0
  1004. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_part_d.py +0 -0
  1005. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0440_review_followups.py +0 -0
  1006. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0450.py +0 -0
  1007. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0460_part_a.py +0 -0
  1008. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0460_part_b.py +0 -0
  1009. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0470_part_a.py +0 -0
  1010. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0470_part_b.py +0 -0
  1011. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0480_part_a.py +0 -0
  1012. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0480_part_b.py +0 -0
  1013. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0490.py +0 -0
  1014. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_a.py +0 -0
  1015. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_b.py +0 -0
  1016. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_c.py +0 -0
  1017. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_d.py +0 -0
  1018. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0500_part_e.py +0 -0
  1019. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0510.py +0 -0
  1020. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0520.py +0 -0
  1021. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0530.py +0 -0
  1022. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v05310.py +0 -0
  1023. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v05311.py +0 -0
  1024. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_109.py +0 -0
  1025. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_139.py +0 -0
  1026. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_142.py +0 -0
  1027. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0531_82.py +0 -0
  1028. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0532.py +0 -0
  1029. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0533.py +0 -0
  1030. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0534.py +0 -0
  1031. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0535.py +0 -0
  1032. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0536.py +0 -0
  1033. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0537.py +0 -0
  1034. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0538.py +0 -0
  1035. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0539.py +0 -0
  1036. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0540.py +0 -0
  1037. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0550.py +0 -0
  1038. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0550_followups.py +0 -0
  1039. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0560.py +0 -0
  1040. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_a.py +0 -0
  1041. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_b.py +0 -0
  1042. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_c.py +0 -0
  1043. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0570_part_d.py +0 -0
  1044. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0580.py +0 -0
  1045. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0590.py +0 -0
  1046. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_a.py +0 -0
  1047. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_b.py +0 -0
  1048. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_c.py +0 -0
  1049. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_d.py +0 -0
  1050. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_e.py +0 -0
  1051. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0600_part_f.py +0 -0
  1052. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_a.py +0 -0
  1053. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_b.py +0 -0
  1054. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_c.py +0 -0
  1055. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_d.py +0 -0
  1056. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0610_part_e.py +0 -0
  1057. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_followups.py +0 -0
  1058. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_a.py +0 -0
  1059. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_b.py +0 -0
  1060. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_c.py +0 -0
  1061. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_d.py +0 -0
  1062. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0620_part_e.py +0 -0
  1063. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_followups.py +0 -0
  1064. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_a.py +0 -0
  1065. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_b.py +0 -0
  1066. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_c.py +0 -0
  1067. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_d.py +0 -0
  1068. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0630_part_e.py +0 -0
  1069. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0631_206.py +0 -0
  1070. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_followups.py +0 -0
  1071. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_a.py +0 -0
  1072. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_b.py +0 -0
  1073. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_c.py +0 -0
  1074. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_d.py +0 -0
  1075. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_e.py +0 -0
  1076. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0640_part_f.py +0 -0
  1077. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_followups.py +0 -0
  1078. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_a.py +0 -0
  1079. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_b.py +0 -0
  1080. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_c.py +0 -0
  1081. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_d.py +0 -0
  1082. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0650_part_e.py +0 -0
  1083. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_cli.py +0 -0
  1084. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_followups.py +0 -0
  1085. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_a.py +0 -0
  1086. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_b.py +0 -0
  1087. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_c.py +0 -0
  1088. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_d.py +0 -0
  1089. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0660_part_e.py +0 -0
  1090. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_followups.py +0 -0
  1091. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_a.py +0 -0
  1092. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_b.py +0 -0
  1093. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_c.py +0 -0
  1094. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_d.py +0 -0
  1095. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_e.py +0 -0
  1096. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0670_part_f.py +0 -0
  1097. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_followups.py +0 -0
  1098. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_a.py +0 -0
  1099. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_b.py +0 -0
  1100. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_c.py +0 -0
  1101. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_d.py +0 -0
  1102. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0680_part_e.py +0 -0
  1103. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_a.py +0 -0
  1104. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_b.py +0 -0
  1105. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_c.py +0 -0
  1106. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_d.py +0 -0
  1107. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0690_part_e.py +0 -0
  1108. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_a.py +0 -0
  1109. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_b.py +0 -0
  1110. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_c.py +0 -0
  1111. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_d.py +0 -0
  1112. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_e.py +0 -0
  1113. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0700_part_f.py +0 -0
  1114. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07110.py +0 -0
  1115. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07111.py +0 -0
  1116. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07112.py +0 -0
  1117. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07113.py +0 -0
  1118. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07114.py +0 -0
  1119. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07115.py +0 -0
  1120. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07116.py +0 -0
  1121. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07117.py +0 -0
  1122. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07118.py +0 -0
  1123. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07119.py +0 -0
  1124. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0712.py +0 -0
  1125. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07120.py +0 -0
  1126. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07121.py +0 -0
  1127. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07122.py +0 -0
  1128. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07123.py +0 -0
  1129. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07124.py +0 -0
  1130. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07125.py +0 -0
  1131. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07126.py +0 -0
  1132. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07127.py +0 -0
  1133. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07128.py +0 -0
  1134. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07129.py +0 -0
  1135. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0713.py +0 -0
  1136. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07130.py +0 -0
  1137. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07131.py +0 -0
  1138. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07132.py +0 -0
  1139. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07133.py +0 -0
  1140. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07134.py +0 -0
  1141. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07135.py +0 -0
  1142. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07136.py +0 -0
  1143. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07137.py +0 -0
  1144. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07138.py +0 -0
  1145. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07139.py +0 -0
  1146. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0714.py +0 -0
  1147. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07140.py +0 -0
  1148. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07141.py +0 -0
  1149. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07141_telemetry_prompt.py +0 -0
  1150. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0715.py +0 -0
  1151. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0716.py +0 -0
  1152. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0717.py +0 -0
  1153. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0718.py +0 -0
  1154. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v0719.py +0 -0
  1155. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07200.py +0 -0
  1156. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07201.py +0 -0
  1157. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07202.py +0 -0
  1158. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07203.py +0 -0
  1159. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07204.py +0 -0
  1160. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07300.py +0 -0
  1161. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_v07302.py +0 -0
  1162. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_val_loss_end_to_end.py +0 -0
  1163. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_validator.py +0 -0
  1164. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_version_sync.py +0 -0
  1165. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_vision.py +0 -0
  1166. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_vllm_serve.py +0 -0
  1167. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_warmup.py +0 -0
  1168. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_why.py +0 -0
  1169. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_windows_encoding.py +0 -0
  1170. {soup_cli-0.75.1 → soup_cli-0.75.2}/tests/test_yaml_expanded_limit.py +0 -0
@@ -12,6 +12,28 @@ 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
+
15
37
  ## [0.75.1] - 2026-09-21
16
38
 
17
39
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: soup-cli
3
- Version: 0.75.1
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,27 +241,20 @@ infrastructure instead of improving models. Soup fixes that.
241
241
 
242
242
  ## What's New
243
243
 
244
- **v0.75.1 — hardening, and cloud runs that keep what they produced.** A maintenance
245
- release on top of v0.75.0: no new training features, and a few defaults that change when
246
- you upgrade.
247
-
248
- - **Hardening across the CLI, the inference server, the Web UI, MCP execution, config
249
- parsing and `.can` handling.** Details in an advisory published with this release.
250
- - **`soup runs clean` gained `--no-keep-weights`**, which deletes whole non-best
251
- checkpoints rather than only their optimizer and scheduler states. `--keep-weights`
252
- stays the default and now means the same thing on every supported Click version — on
253
- Click 8.1 it used to delete whole checkpoints anyway.
254
- - **Cloud runs keep their outputs.** `soup train --cloud modal` writes run outputs to the
255
- `soup-outputs` Modal volume and downloads them into your local output directory when the
256
- run ends, including after a failed run; checkpoints used to disappear with the container.
257
- - **Ctrl+C on `soup train --cloud lambda --cloud-submit` waits for the controller** to
258
- terminate the Lambda instance. The controller was previously killed a quarter of a
259
- second later, which could leave a paid instance running (Linux/macOS).
260
- - **Upgrading changes a few defaults.** `soup push --hub modelscope` and `--hub modelers`
261
- read `MODELSCOPE_API_TOKEN` and `MODELERS_TOKEN` rather than `HF_TOKEN`, so one hub's
262
- token is never offered to another; and an `https` judge URL whose host is not
263
- `api.openai.com` is treated as an OpenAI-compatible server and called without
264
- `OPENAI_API_KEY`.
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`.
265
258
 
266
259
  > Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
267
260
  > crash in the native extension before Soup runs at all.
@@ -87,27 +87,20 @@ infrastructure instead of improving models. Soup fixes that.
87
87
 
88
88
  ## What's New
89
89
 
90
- **v0.75.1 — hardening, and cloud runs that keep what they produced.** A maintenance
91
- release on top of v0.75.0: no new training features, and a few defaults that change when
92
- you upgrade.
93
-
94
- - **Hardening across the CLI, the inference server, the Web UI, MCP execution, config
95
- parsing and `.can` handling.** Details in an advisory published with this release.
96
- - **`soup runs clean` gained `--no-keep-weights`**, which deletes whole non-best
97
- checkpoints rather than only their optimizer and scheduler states. `--keep-weights`
98
- stays the default and now means the same thing on every supported Click version — on
99
- Click 8.1 it used to delete whole checkpoints anyway.
100
- - **Cloud runs keep their outputs.** `soup train --cloud modal` writes run outputs to the
101
- `soup-outputs` Modal volume and downloads them into your local output directory when the
102
- run ends, including after a failed run; checkpoints used to disappear with the container.
103
- - **Ctrl+C on `soup train --cloud lambda --cloud-submit` waits for the controller** to
104
- terminate the Lambda instance. The controller was previously killed a quarter of a
105
- second later, which could leave a paid instance running (Linux/macOS).
106
- - **Upgrading changes a few defaults.** `soup push --hub modelscope` and `--hub modelers`
107
- read `MODELSCOPE_API_TOKEN` and `MODELERS_TOKEN` rather than `HF_TOKEN`, so one hub's
108
- token is never offered to another; and an `https` judge URL whose host is not
109
- `api.openai.com` is treated as an OpenAI-compatible server and called without
110
- `OPENAI_API_KEY`.
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`.
111
104
 
112
105
  > Python **3.10–3.12** only. On 3.13+, pip used to resolve untested PyTorch wheels that
113
106
  > crash in the native extension before Soup runs at all.
@@ -1,4 +1,4 @@
1
- <!-- synced-from: README.md sha256:b524929506f026bba7a1f4522d3273328123c696a31b72dd1c7c4bee993a8fd4 -->
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,30 +88,22 @@ yerine altyapıyla boğuşarak geçiriyor. Soup bunu çözer.
88
88
 
89
89
  ## Yenilikler
90
90
 
91
- **v0.75.1 — sıkılaştırma ve ürettiğini koruyan bulut çalıştırmaları.** v0.75.0'ın üzerine
92
- bir bakım sürümü: yeni eğitim özelliği yok, ama yükseltirken değişen birkaç varsayılan var.
93
-
94
- - **CLI, çıkarım sunucusu, Web arayüzü, MCP yürütmesi, yapılandırma ayrıştırması ve `.can`
95
- işlemesi genelinde sıkılaştırma.** Ayrıntılar bu sürümle birlikte yayımlanan bir danışma
96
- belgesinde.
97
- - **`soup runs clean` artık `--no-keep-weights` seçeneğini kabul ediyor**; bu seçenek, en
98
- iyi olmayan kontrol noktalarını yalnızca optimizer ve zamanlayıcı durumlarıyla değil
99
- bütünüyle siliyor. `--keep-weights` varsayılan olarak kalıyor ve artık desteklenen her
100
- Click sürümünde aynı anlama geliyor — Click 8.1'de eskiden kontrol noktalarının tamamını
101
- yine de siliyordu.
102
- - **Bulut çalıştırmaları çıktılarını koruyor.** `soup train --cloud modal`, çalıştırma
103
- çıktılarını `soup-outputs` Modal birimine yazıyor ve çalıştırma bittiğinde — başarısız
104
- bir çalıştırmadan sonra da — yerel çıktı dizininize indiriyor; kontrol noktaları eskiden
105
- kapsayıcıyla birlikte kayboluyordu.
106
- - **`soup train --cloud lambda --cloud-submit` sırasında Ctrl+C artık denetleyicinin**
107
- Lambda örneğini sonlandırmasını bekliyor. Denetleyici eskiden çeyrek saniye sonra
108
- öldürülüyordu, bu da ücretli bir örneğin çalışmaya devam etmesine yol açabiliyordu
109
- (Linux/macOS).
110
- - **Yükseltmek birkaç varsayılanı değiştiriyor.** `soup push --hub modelscope` ve
111
- `--hub modelers`, `HF_TOKEN` yerine `MODELSCOPE_API_TOKEN` ve `MODELERS_TOKEN` okuyor;
112
- böylece bir hub'ın belirteci hiçbir zaman başka bir hub'a sunulmuyor. Ayrıca ana
113
- makinesi `api.openai.com` olmayan bir `https` yargıç URL'si, OpenAI uyumlu bir sunucu
114
- olarak kabul edilip `OPENAI_API_KEY` olmadan çağrılıyor.
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.
115
107
 
116
108
  > Yalnızca Python **3.10–3.12**. 3.13+ sürümlerinde pip, Soup daha hiç çalışmadan yerel
117
109
  > eklentide çöken, test edilmemiş PyTorch tekerleklerini çözümlüyordu.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.75.1"
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.1"
3
+ __version__ = "0.75.2"
@@ -710,17 +710,21 @@ def _generate_openai(
710
710
 
711
711
  base_url = api_base or "https://api.openai.com/v1"
712
712
 
713
- # Validate api_base to prevent SSRF (block non-HTTPS remote URLs)
713
+ # Validate api_base to prevent SSRF (block non-HTTPS remote URLs and
714
+ # private / link-local / reserved IP literals; 0.0.0.0 is not loopback)
714
715
  if api_base:
715
716
  from urllib.parse import urlparse
716
717
 
718
+ from soup_cli.utils.net_guard import LOOPBACK_HOSTS, refuse_private_ip_literal
719
+
717
720
  parsed = urlparse(api_base)
718
- is_local = parsed.hostname in ("localhost", "127.0.0.1", "::1", "0.0.0.0")
721
+ is_local = parsed.hostname in LOOPBACK_HOSTS
719
722
  if not is_local and parsed.scheme != "https":
720
723
  raise ValueError(
721
724
  f"api_base must use HTTPS for remote APIs (got {parsed.scheme}://). "
722
725
  "HTTP is only allowed for localhost."
723
726
  )
727
+ refuse_private_ip_literal(parsed.hostname, label="api_base")
724
728
 
725
729
  if generation_prompt is None:
726
730
  generation_prompt = _build_generation_prompt(prompt, count, fmt, seed_examples)
@@ -849,21 +853,25 @@ def _generate_server(
849
853
 
850
854
  base_url = api_base or "http://localhost:8000/v1"
851
855
 
852
- # Validate api_base to prevent SSRF — only allow http/https, block remote non-HTTPS
856
+ # Validate api_base to prevent SSRF — only allow http/https, block remote
857
+ # non-HTTPS and private / link-local / reserved IP literals
853
858
  if api_base:
854
859
  from urllib.parse import urlparse
855
860
 
861
+ from soup_cli.utils.net_guard import LOOPBACK_HOSTS, refuse_private_ip_literal
862
+
856
863
  parsed = urlparse(api_base)
857
864
  if parsed.scheme not in ("http", "https"):
858
865
  raise ValueError(
859
866
  f"api_base must use HTTP or HTTPS scheme (got {parsed.scheme}://)"
860
867
  )
861
- is_local = parsed.hostname in ("localhost", "127.0.0.1", "::1", "0.0.0.0")
868
+ is_local = parsed.hostname in LOOPBACK_HOSTS
862
869
  if not is_local and parsed.scheme != "https":
863
870
  raise ValueError(
864
871
  f"api_base must use HTTPS for remote APIs (got {parsed.scheme}://). "
865
872
  "HTTP is only allowed for localhost."
866
873
  )
874
+ refuse_private_ip_literal(parsed.hostname, label="api_base")
867
875
 
868
876
  # Strip trailing /v1 if present (we add it to the endpoint path)
869
877
  base_url = base_url.rstrip("/")
@@ -167,12 +167,22 @@ def _validate_judge_model_url(url: str) -> None:
167
167
  """SSRF guard for --judge-model: urlparse hostname check (not startswith).
168
168
 
169
169
  Blocks the ``http://localhost.attacker.com`` prefix-bypass that a bare
170
- ``startswith("http://localhost")`` check would allow through.
170
+ ``startswith("http://localhost")`` check would allow through, and refuses a
171
+ private / link-local / reserved IP literal as a usage error before any
172
+ measurement runs.
171
173
  """
172
174
  from urllib.parse import urlparse
173
175
 
176
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
177
+
174
178
  parsed = urlparse(url)
175
- if parsed.scheme in ("ollama", "https"):
179
+ if parsed.scheme == "ollama":
180
+ return
181
+ if parsed.scheme == "https":
182
+ try:
183
+ refuse_private_ip_literal(parsed.hostname, label="--judge-model")
184
+ except ValueError as exc:
185
+ _fail(str(exc), _EXIT_USAGE)
176
186
  return
177
187
  if parsed.scheme == "http" and parsed.hostname in ("localhost", "127.0.0.1"):
178
188
  return
@@ -1004,21 +1014,22 @@ def _verdict_live(
1004
1014
  # would be an unbounded number of full model passes.
1005
1015
  noise_floor_runs = _validate_noise_floor_flag(noise_floor_runs)
1006
1016
 
1017
+ # Judge modes need a judge model. Validate it BEFORE the base and tuned
1018
+ # models load and before the noise floor is measured (it scores the leg-1
1019
+ # task axis through the judge as well, #403) — a missing or refused judge
1020
+ # URL is a usage error, not a runtime one discovered after a model load.
1021
+ if task_mode == "judge_score":
1022
+ if not judge_model:
1023
+ _fail("--task-mode judge_score needs --judge-model <url>", _EXIT_USAGE)
1024
+ _validate_judge_model_url(judge_model)
1025
+ elif task_mode == "pairwise":
1026
+ if not judge_model:
1027
+ _fail("--task-mode pairwise needs --judge-model <url>", _EXIT_USAGE)
1028
+ _validate_judge_model_url(judge_model)
1029
+
1007
1030
  tuned_id = tuned if tuned else base
1008
1031
  try:
1009
1032
  base_gen, tuned_gen = _resolve_generators(base, tuned, adapter, device, quantization)
1010
- # Judge modes need a judge model. Validate it BEFORE measuring the
1011
- # noise floor, which now scores the leg-1 task axis through the judge as
1012
- # well (#403) — a missing / malformed judge is a usage error (exit 2),
1013
- # not a runtime one discovered mid-measurement.
1014
- if task_mode == "judge_score":
1015
- if not judge_model:
1016
- _fail("--task-mode judge_score needs --judge-model <url>", _EXIT_USAGE)
1017
- _validate_judge_model_url(judge_model)
1018
- elif task_mode == "pairwise":
1019
- if not judge_model:
1020
- _fail("--task-mode pairwise needs --judge-model <url>", _EXIT_USAGE)
1021
- _validate_judge_model_url(judge_model)
1022
1033
 
1023
1034
  measured_floor: Optional[NoiseFloor] = None
1024
1035
  if noise_floor_runs is not None:
@@ -1449,7 +1449,12 @@ class TrainingConfig(BaseModel):
1449
1449
  @field_validator("online_dpo_judge", mode="before")
1450
1450
  @classmethod
1451
1451
  def _validate_online_dpo_judge_field(cls, value: Any) -> Optional[str]:
1452
- """v0.71.31 — shape-only validation (SSRF enforced at trainer setup)."""
1452
+ """v0.71.31 — shape validation; the full SSRF policy runs at trainer setup.
1453
+
1454
+ A private / link-local / reserved IP literal in an http(s) judge URL is
1455
+ refused here as well, so a shared soup.yaml naming one fails at load
1456
+ instead of after the model download.
1457
+ """
1453
1458
  if value is None:
1454
1459
  return None
1455
1460
  if isinstance(value, bool) or not isinstance(value, str):
@@ -1462,6 +1467,16 @@ class TrainingConfig(BaseModel):
1462
1467
  raise ValueError("online_dpo_judge must not contain null bytes")
1463
1468
  if len(value) > 512:
1464
1469
  raise ValueError("online_dpo_judge must be <= 512 chars")
1470
+ from urllib.parse import urlparse
1471
+
1472
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
1473
+
1474
+ try:
1475
+ parsed = urlparse(value)
1476
+ except ValueError as exc:
1477
+ raise ValueError("online_dpo_judge is not a valid URL") from exc
1478
+ if parsed.scheme in ("http", "https"):
1479
+ refuse_private_ip_literal(parsed.hostname, label="online_dpo_judge")
1465
1480
  return value
1466
1481
 
1467
1482
  # v0.71.32 — ASR (Whisper) fine-tuning knobs.
@@ -18,9 +18,12 @@ def validate_vllm_url(base_url: str) -> None:
18
18
  Reuses the same validation as the server provider:
19
19
  - Scheme must be http or https
20
20
  - HTTP is only allowed for localhost
21
+ - A private / link-local / reserved IP literal is refused on any scheme
21
22
 
22
23
  Raises ValueError if validation fails.
23
24
  """
25
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
26
+
24
27
  parsed = urlparse(base_url)
25
28
  if parsed.scheme not in ("http", "https"):
26
29
  raise ValueError(
@@ -36,6 +39,7 @@ def validate_vllm_url(base_url: str) -> None:
36
39
  f"vLLM URL must use HTTPS for remote servers (got {parsed.scheme}://). "
37
40
  "HTTP is only allowed for localhost."
38
41
  )
42
+ refuse_private_ip_literal(parsed.hostname, label="vLLM URL")
39
43
 
40
44
 
41
45
  def generate_vllm(
@@ -94,7 +94,15 @@ class GateTask(BaseModel):
94
94
  # Allowlist of schemes — SSRF hardening consistent with the project.
95
95
  parsed = urlparse(value)
96
96
 
97
- if parsed.scheme in ("ollama","https"):
97
+ if parsed.scheme == "ollama":
98
+ return value
99
+
100
+ if parsed.scheme == "https":
101
+ # A private IP literal is refused when the suite is parsed, so a
102
+ # suite file cannot name one any more than --judge-model can.
103
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
104
+
105
+ refuse_private_ip_literal(parsed.hostname, label="judge_model URL")
98
106
  return value
99
107
 
100
108
  if (parsed.scheme == "http" and parsed.hostname in {"localhost", "127.0.0.1"}):
@@ -127,10 +127,17 @@ def load_rubric(path: Path) -> dict:
127
127
 
128
128
 
129
129
  def validate_judge_api_base(api_base: Optional[str]) -> None:
130
- """SSRF protection for judge API base URL."""
130
+ """SSRF protection for judge API base URL.
131
+
132
+ ``JudgeEvaluator`` calls this when it is constructed, so every judge it
133
+ builds is checked, whether the URL came from ``--api-base`` or from a
134
+ config file.
135
+ """
131
136
  if api_base is None:
132
137
  return
133
138
 
139
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
140
+
134
141
  parsed = urlparse(api_base)
135
142
  if parsed.scheme not in ("http", "https"):
136
143
  raise ValueError(
@@ -146,6 +153,8 @@ def validate_judge_api_base(api_base: Optional[str]) -> None:
146
153
  "HTTP is only allowed for localhost. "
147
154
  "Use HTTPS for remote URLs."
148
155
  )
156
+ # ...and no private / link-local / reserved IP literal on either scheme.
157
+ refuse_private_ip_literal(parsed.hostname, label="judge URL")
149
158
 
150
159
 
151
160
  def _build_judge_prompt(
@@ -944,17 +944,26 @@ def create_app(host: str = "127.0.0.1", port: int = 7860):
944
944
 
945
945
  from fastapi.responses import StreamingResponse
946
946
 
947
+ from soup_cli.utils.net_guard import refuse_private_ip_literal
948
+
947
949
  # Validate messages
948
950
  if not req.messages:
949
951
  raise HTTPException(status_code=400, detail="messages cannot be empty")
950
952
 
951
- # SSRF protection: localhost-only HTTP, HTTPS for remote
952
- parsed = urlparse(req.endpoint)
953
+ # SSRF protection: localhost-only HTTP, HTTPS for remote, and no
954
+ # private / link-local / reserved IP literal on either scheme.
955
+ # 0.0.0.0 is the bind-any wildcard, not a loopback address.
956
+ try:
957
+ parsed = urlparse(req.endpoint)
958
+ except ValueError:
959
+ # e.g. an unbalanced or non-IPv6 bracketed host: a bad request,
960
+ # not a server error.
961
+ raise HTTPException(status_code=400, detail="endpoint is not a valid URL") from None
953
962
  if parsed.scheme == "http":
954
963
  import ipaddress as _ipaddr
955
964
 
956
965
  host = parsed.hostname or ""
957
- is_local = host in ("localhost", "0.0.0.0")
966
+ is_local = host == "localhost"
958
967
  if not is_local:
959
968
  try:
960
969
  addr = _ipaddr.ip_address(host)
@@ -971,6 +980,12 @@ def create_app(host: str = "127.0.0.1", port: int = 7860):
971
980
  status_code=400,
972
981
  detail="Only HTTP (localhost) or HTTPS endpoints allowed",
973
982
  )
983
+ try:
984
+ refuse_private_ip_literal(parsed.hostname, label="endpoint")
985
+ except ValueError as exc:
986
+ # The message is fixed text (the label is a constant); the
987
+ # endpoint itself is never echoed back.
988
+ raise HTTPException(status_code=400, detail=str(exc)) from None
974
989
 
975
990
  # Validate bounds
976
991
  if req.max_tokens > 16384:
@@ -46,6 +46,33 @@ import ipaddress
46
46
  LOOPBACK_HOSTS = frozenset({"localhost", "127.0.0.1", "::1"})
47
47
 
48
48
 
49
+ def _ascii_spellings(host: str) -> list[str]:
50
+ """``host`` plus the ASCII forms an HTTP client may turn it into.
51
+
52
+ A client IDNA-encodes a non-ASCII host before it resolves it: urllib and
53
+ :mod:`socket` through the stdlib codec (IDNA 2003, whose nameprep step
54
+ NFKC-folds and drops characters such as the soft hyphen), httpx through the
55
+ ``idna`` package (IDNA 2008). Both treat U+3002, U+FF0E and U+FF61 as label
56
+ separators, so text that is not an IP literal as written -- ``10.0.0.1``
57
+ with U+3002 IDEOGRAPHIC FULL STOP in place of each dot, for instance -- can
58
+ be one once encoded. A form that fails to encode is skipped.
59
+ """
60
+ if host.isascii():
61
+ return [host]
62
+ spellings = [host]
63
+ try:
64
+ spellings.append(host.encode("idna").decode("ascii"))
65
+ except UnicodeError:
66
+ pass
67
+ try:
68
+ import idna # noqa: PLC0415 — the encoder httpx uses; optional here
69
+
70
+ spellings.append(idna.encode(host.lower()).decode("ascii"))
71
+ except (ImportError, UnicodeError): # idna.IDNAError is a UnicodeError
72
+ pass
73
+ return spellings
74
+
75
+
49
76
  def parse_ip_literal(host: str) -> ipaddress.IPv4Address | ipaddress.IPv6Address | None:
50
77
  """Parse ``host`` as an IP literal, or ``None`` if it isn't one.
51
78
 
@@ -55,7 +82,22 @@ def parse_ip_literal(host: str) -> ipaddress.IPv4Address | ipaddress.IPv6Address
55
82
  library :func:`socket.inet_aton`. The latter is a pure in-process
56
83
  string parser — no DNS lookup is performed. A hostname (``"localhost"``,
57
84
  ``"evil.example.com"``) returns ``None`` rather than being resolved.
85
+
86
+ A non-ASCII host is also read in the ASCII forms a client would connect to
87
+ (see :func:`_ascii_spellings`), and the first form that is an IP literal is
88
+ returned, so ``10.0.0.1`` written with ideographic full stops parses as
89
+ ``10.0.0.1``.
58
90
  """
91
+ for spelling in _ascii_spellings(host):
92
+ addr = _parse_ascii_ip_literal(spelling)
93
+ if addr is not None:
94
+ return addr
95
+ return None
96
+
97
+
98
+ def _parse_ascii_ip_literal(
99
+ host: str,
100
+ ) -> ipaddress.IPv4Address | ipaddress.IPv6Address | None:
59
101
  import socket # noqa: PLC0415 — lazy import (stdlib, negligible cost)
60
102
 
61
103
  clean_host = host.rstrip(".")
@@ -77,6 +119,13 @@ def is_private_or_link_local(host: str) -> bool:
77
119
  multicast / unspecified IP — the union of every guard's policy in this
78
120
  repo, since consolidating stops being safe the moment a caller's
79
121
  predicate is quietly narrower than the shared one it now uses.
122
+
123
+ Also any address ``ipaddress`` does not consider globally reachable
124
+ (``not is_global``) — that adds RFC 6598 shared address space,
125
+ ``100.64.0.0/10``, which is neither ``is_private`` nor ``is_global`` —
126
+ and the deprecated IPv6 site-local block ``fec0::/10``, which
127
+ ``ipaddress`` still reports as global. ``is_reserved`` stays: NAT64
128
+ ``64:ff9b::/96`` IS ``is_global``.
80
129
  """
81
130
  addr = parse_ip_literal(host)
82
131
  if addr is None:
@@ -91,4 +140,36 @@ def is_private_or_link_local(host: str) -> bool:
91
140
  or addr.is_unspecified
92
141
  or addr.is_reserved
93
142
  or addr.is_multicast
143
+ or not addr.is_global
144
+ or getattr(addr, "is_site_local", False)
94
145
  )
146
+
147
+
148
+ def refuse_private_ip_literal(host: str | None, *, label: str) -> None:
149
+ """Raise ``ValueError`` if an outbound endpoint's host is a non-public IP.
150
+
151
+ ``host`` is a URL's ``hostname``. It is refused when it is an IP literal, in
152
+ any spelling :func:`parse_ip_literal` accepts (IPv4-mapped IPv6 included),
153
+ that :func:`is_private_or_link_local` classifies as non-public, on every
154
+ scheme. Loopback stays allowed, because a server on the same machine
155
+ (Ollama, vLLM, ``soup serve``) is a supported target. A hostname passes
156
+ unchanged and is NOT resolved, so this narrows which addresses a URL can
157
+ name directly; it does not make internal services unreachable by name. An
158
+ empty or missing host passes too: the caller's scheme check owns that case.
159
+ ``label`` names the setting in the message.
160
+ """
161
+ clean = (host or "").strip().lower().rstrip(".")
162
+ if clean.startswith("[") and clean.endswith("]"):
163
+ clean = clean[1:-1]
164
+ if not clean or clean in LOOPBACK_HOSTS:
165
+ return
166
+ addr = parse_ip_literal(clean)
167
+ if addr is None:
168
+ return
169
+ mapped = getattr(addr, "ipv4_mapped", None)
170
+ if (mapped if mapped is not None else addr).is_loopback:
171
+ return
172
+ if is_private_or_link_local(clean):
173
+ raise ValueError(
174
+ f"{label}: private/link-local/reserved IP hosts are not allowed (SSRF protection)"
175
+ )