soup-cli 0.71.3__tar.gz → 0.71.5__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.
- {soup_cli-0.71.3 → soup_cli-0.71.5}/CHANGELOG.md +90 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/CONTRIBUTING.md +1 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/PKG-INFO +17 -14
- {soup_cli-0.71.3 → soup_cli-0.71.5}/README.md +16 -13
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/adapters-and-governance.md +35 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/backends-and-ops.md +5 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/commands.md +13 -6
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/data.md +12 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/evaluation.md +4 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/training.md +3 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/pyproject.toml +1 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/__init__.py +1 -1
- soup_cli-0.71.5/src/soup_cli/commands/_webhook_cli.py +71 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/ab.py +40 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/active_sample.py +28 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/adapters.py +225 -50
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/advise.py +21 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/data.py +74 -2
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/data_forge.py +45 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/history.py +14 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/ingest.py +25 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/loop.py +73 -5
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/prune_prompt.py +34 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/experiment/tracker.py +37 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/curriculum_callback.py +73 -5
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/registry/store.py +2 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_branch.py +119 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_merge.py +145 -7
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_pr.py +151 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/advise.py +194 -2
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/advise_history.py +10 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/cmaes_merge.py +149 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/curriculum_dynamic.py +43 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/drift_alarm.py +7 -105
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/loop_daemon.py +68 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/loop_iteration.py +104 -0
- soup_cli-0.71.5/src/soup_cli/utils/loop_stages.py +418 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/loop_state.py +7 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/peft_wiring.py +13 -1
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/prune_prompt.py +179 -4
- soup_cli-0.71.5/src/soup_cli/utils/webhooks.py +152 -0
- soup_cli-0.71.5/tests/test_v0714.py +1784 -0
- soup_cli-0.71.5/tests/test_v0715.py +1222 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.dockerignore +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.gitignore +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/AGENTS.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/CODEOWNERS +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/Dockerfile +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/LICENSE +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/NOTICE +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/SECURITY.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docker-compose.yml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/README.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/models.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/README.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/soup.png +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/pack.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/schema.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/cli.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/airgap.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/can.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/train.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/config/schema.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/airgap_bundle.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/annex_xi.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/energy.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/paths.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/templates/chat.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/templates/code.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/templates/medical.yaml +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/__init__.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/conftest.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_audio.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_bco.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_bench.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_callback.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_cans.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_chat.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_cli.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_config.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_cost.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_data.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_diff.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_display.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_errors.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_eval.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_export.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_formats.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_generate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_infer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_init.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_kto.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_loader.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_merge.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_moe.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_packing.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_a_wave2.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_performance.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_profile.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_progress.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_push.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_qat.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_registry.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_relora.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_replay.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_resume.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_runs.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_serve.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_tui.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ui.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_v0713.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_validator.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_vision.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_why.py +0 -0
- {soup_cli-0.71.3 → soup_cli-0.71.5}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,96 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.5] - 2026-06-02
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **`soup eval against` now reads eval metrics** — `ExperimentTracker.get_metric_series`
|
|
19
|
+
falls back to the `eval_results` table when the metric is not a per-step
|
|
20
|
+
training column (`loss` / `lr` / `grad_norm` / `speed` / `gpu_mem`). So
|
|
21
|
+
`soup eval against <base> --candidate <run> --metric task_accuracy` returns a
|
|
22
|
+
real score series (benchmark scores live in `eval_results`, not `metrics`)
|
|
23
|
+
instead of "Empty series". Per-step columns still read from `metrics` — no
|
|
24
|
+
regression for existing callers.
|
|
25
|
+
- **`soup advise` learns from past project outcomes** — `soup advise` now reads
|
|
26
|
+
this project's accepted-verdict history (`~/.soup/advise_history.jsonl`) and
|
|
27
|
+
biases the rubric: 3+ successful SFT precedents flip a marginal RAG call to
|
|
28
|
+
SFT; 3+ negative GRPO outcomes suppress GRPO in favour of SFT-on-traces; an
|
|
29
|
+
encouraged choice gets a small confidence nudge. Scoped per-project (one
|
|
30
|
+
project's record never biases another). No history → identical to before.
|
|
31
|
+
- **Slack/Discord webhooks on four more commands** — `--slack-url` / `--discord-url`
|
|
32
|
+
(SSRF-hardened, loopback-only HTTP, RFC1918 rejected, never crashes the
|
|
33
|
+
command) now ship on `soup ingest`, `soup prune-prompt`, `soup ab` (fires only
|
|
34
|
+
on a `reject_h0` / `accept_h0` decision, not `continue`), and
|
|
35
|
+
`soup data active-sample` — not just `soup drift-alarm`. The validator + sender
|
|
36
|
+
moved to a shared `soup_cli/utils/webhooks.py`.
|
|
37
|
+
- **Tokenizer-aware `soup prune-prompt`** — `--tokenizer <model_or_path>` detects
|
|
38
|
+
and strips the shared system-prompt prefix on **token** boundaries instead of
|
|
39
|
+
characters, so a multi-byte UTF-8 prefix can never be split mid-code-point.
|
|
40
|
+
Default (no `--tokenizer`) keeps the whitespace-character behaviour.
|
|
41
|
+
- **Curriculum bucketing by loss percentile** — `DynamicCurriculumCallback` now
|
|
42
|
+
buckets samples by the percentile rank of the live loss (or perplexity)
|
|
43
|
+
signal within a rolling window when `data.curriculum_metric` is `loss` /
|
|
44
|
+
`perplexity`, so a consistently-hard sample is routed to the same difficulty
|
|
45
|
+
bucket across recomputes. `length` and warm-up still use round-robin.
|
|
46
|
+
- **`--hub` on `soup data push` and `soup data forge`** — `soup data push
|
|
47
|
+
--hub modelscope|modelers` uploads a dataset via the matching SDK
|
|
48
|
+
(`repo_type=dataset`, commit message sanitised); `soup data forge --hub
|
|
49
|
+
<non-hf> --teacher owner/name` pre-fetches the teacher model from that hub
|
|
50
|
+
(and warns when the teacher is not a repo id so `--hub` is never silently
|
|
51
|
+
ignored). HF stays the default.
|
|
52
|
+
|
|
53
|
+
### Notes
|
|
54
|
+
- Live SaaS *pull* adapters for `soup ingest` (Langfuse / LangSmith / Helicone /
|
|
55
|
+
OpenPipe / OpenAI SDKs, issue #204) remain deferred: they need credentialed
|
|
56
|
+
vendor accounts with populated trace data to validate honestly. Tracked as an
|
|
57
|
+
open, `infra-blocked` (external-account) item. `soup ingest` continues to parse
|
|
58
|
+
the JSONL export you pull from your dashboard.
|
|
59
|
+
|
|
60
|
+
## [0.71.4] - 2026-06-02
|
|
61
|
+
|
|
62
|
+
### Added
|
|
63
|
+
- **Live canary verdict for `soup adapters merge`** — `--canary <suite.json>`
|
|
64
|
+
scores the merged adapter against the first input and classifies
|
|
65
|
+
**OK / MINOR / MAJOR** using the Quant-Lobotomy taxonomy (drop <2% OK, <5%
|
|
66
|
+
MINOR, else MAJOR). `--strict-verdict` exits 2 on MAJOR. Pre-scored
|
|
67
|
+
`{"baseline_scores","candidate_scores"}` suites run with no model load; a
|
|
68
|
+
`{"tasks":[...]}` suite uses an injectable scorer. Replaces the v0.57 `UNKNOWN`
|
|
69
|
+
stub.
|
|
70
|
+
- **Live evolutionary merge** — `soup adapters merge --strategy cmaes --eval
|
|
71
|
+
<suite> --budget <t>` now runs the full CMA-ES loop: each candidate is merged,
|
|
72
|
+
materialised, scored against the eval suite, and the best-weighted merge is
|
|
73
|
+
written to `--output`. Replaces the v0.67 plan-only stub.
|
|
74
|
+
- **Publish an adapter PR to GitHub** — `soup adapters pr <title> --base-sha
|
|
75
|
+
<hex> --adapter <path> --push owner/repo#N` posts the rendered PR Markdown as a
|
|
76
|
+
GitHub PR comment via `gh api` (argv-list, body over JSON stdin; no shell).
|
|
77
|
+
Token resolves from `GITHUB_TOKEN` / `GH_TOKEN`.
|
|
78
|
+
- **Pre-wired `soup loop` production stages** — `soup loop init --pre-wired` (or
|
|
79
|
+
`soup loop watch --pre-wired`) swaps the v0.58 no-op stage stubs for real
|
|
80
|
+
harvest (traces → preference pairs) → DPO train → eval-gate → canary-deploy
|
|
81
|
+
callables. `soup loop status` now shows the `pre_wired` flag.
|
|
82
|
+
- **Loop iterations as Soup Cans + Registry lineage** — `soup loop watch
|
|
83
|
+
--pack-cans` packs each successful iteration as a v0.26 Soup Can and appends a
|
|
84
|
+
Registry entry (tag `loop-iter`), chaining a real lineage DAG across
|
|
85
|
+
iterations visible through `soup history`. `soup loop replay <id> --extract
|
|
86
|
+
<dir>` unpacks a recorded iteration.
|
|
87
|
+
- **Branch pointers into the Registry** — `soup adapters branch <name>
|
|
88
|
+
--attach-to-registry <id>` links a branch snapshot to a Registry entry (shown
|
|
89
|
+
as a `branches` node in `soup history`); `soup adapters branch <name>
|
|
90
|
+
--from-registry <id>` derives a fresh snapshot's config + base from an entry.
|
|
91
|
+
|
|
92
|
+
### Security
|
|
93
|
+
- The backdoor-scan gate (v0.71.2 #192) and license-conflict gate (v0.60 Part E)
|
|
94
|
+
now run for **all** merge strategies, including `--strategy cmaes` (previously
|
|
95
|
+
bypassed because cmaes returned before the gates).
|
|
96
|
+
- `soup loop` canary deploy restricts `SOUP_LOOP_SERVE_ENDPOINT` to loopback /
|
|
97
|
+
RFC1918-private hosts (a serve endpoint is the operator's own box/LAN), beyond
|
|
98
|
+
the general webhook SSRF policy which permits any HTTPS host.
|
|
99
|
+
- `soup adapters pr --push` builds the `gh` child environment from an allowlist
|
|
100
|
+
so unrelated secrets (`HF_TOKEN` / `OPENAI_API_KEY` / …) never reach the
|
|
101
|
+
subprocess.
|
|
102
|
+
- The canary-suite JSON read uses `O_NOFOLLOW` + `os.fstat` (size cap enforced on
|
|
103
|
+
the same fd) to close the symlink/size-cap TOCTOU window.
|
|
104
|
+
|
|
15
105
|
## [0.71.3] - 2026-06-01
|
|
16
106
|
|
|
17
107
|
### Added
|
|
@@ -120,7 +120,7 @@ src/soup_cli/
|
|
|
120
120
|
templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
|
|
121
121
|
ui/ - Web UI (FastAPI + HTML/JS SPA)
|
|
122
122
|
|
|
123
|
-
tests/ - Test suite (
|
|
123
|
+
tests/ - Test suite (275 files, 12581 tests)
|
|
124
124
|
examples/ - Real-world config examples and datasets
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.71.
|
|
3
|
+
Version: 0.71.5
|
|
4
4
|
Summary: Fine-tune 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
|
|
@@ -183,19 +183,22 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
183
183
|
|
|
184
184
|
## What's New
|
|
185
185
|
|
|
186
|
-
**v0.71.
|
|
187
|
-
|
|
188
|
-
- **
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
- **
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
- **
|
|
195
|
-
|
|
196
|
-
-
|
|
197
|
-
|
|
198
|
-
|
|
186
|
+
**v0.71.5 — Ingest, data & prompt polish.** Sharper production-loop ergonomics:
|
|
187
|
+
|
|
188
|
+
- **Alternative model hubs for data** — `soup data push --hub modelscope|modelers` uploads a
|
|
189
|
+
local JSONL to ModelScope / Modelers, and `soup data forge --hub … --teacher owner/name`
|
|
190
|
+
pre-fetches the teacher from that hub.
|
|
191
|
+
- **Tokenizer-aware prompt pruning** — `soup prune-prompt --tokenizer <id-or-path>` finds the
|
|
192
|
+
shared *token* prefix and decodes only the remainder, so BPE multi-byte sequences never get
|
|
193
|
+
truncated mid-token the way char-slicing can.
|
|
194
|
+
- **Webhooks everywhere** — `--slack-url` / `--discord-url` now work on `soup ingest`,
|
|
195
|
+
`soup prune-prompt`, `soup ab`, and `soup data active-sample` (same SSRF-hardened validator as
|
|
196
|
+
`soup drift-alarm`). The A/B harness only pings when the sequential test actually decides.
|
|
197
|
+
- **Curriculum by difficulty percentile** — dynamic curriculum can bucket by `loss` /
|
|
198
|
+
`perplexity` percentile instead of length round-robin.
|
|
199
|
+
- **Smarter pre-flight `advise`** — `soup advise` now nudges its confidence using your prior
|
|
200
|
+
verdicts for the same project, and `soup runs replay` can plot a benchmark-score curve, not
|
|
201
|
+
just the loss curve.
|
|
199
202
|
|
|
200
203
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
201
204
|
|
|
@@ -49,19 +49,22 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
49
49
|
|
|
50
50
|
## What's New
|
|
51
51
|
|
|
52
|
-
**v0.71.
|
|
53
|
-
|
|
54
|
-
- **
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
- **
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
**v0.71.5 — Ingest, data & prompt polish.** Sharper production-loop ergonomics:
|
|
53
|
+
|
|
54
|
+
- **Alternative model hubs for data** — `soup data push --hub modelscope|modelers` uploads a
|
|
55
|
+
local JSONL to ModelScope / Modelers, and `soup data forge --hub … --teacher owner/name`
|
|
56
|
+
pre-fetches the teacher from that hub.
|
|
57
|
+
- **Tokenizer-aware prompt pruning** — `soup prune-prompt --tokenizer <id-or-path>` finds the
|
|
58
|
+
shared *token* prefix and decodes only the remainder, so BPE multi-byte sequences never get
|
|
59
|
+
truncated mid-token the way char-slicing can.
|
|
60
|
+
- **Webhooks everywhere** — `--slack-url` / `--discord-url` now work on `soup ingest`,
|
|
61
|
+
`soup prune-prompt`, `soup ab`, and `soup data active-sample` (same SSRF-hardened validator as
|
|
62
|
+
`soup drift-alarm`). The A/B harness only pings when the sequential test actually decides.
|
|
63
|
+
- **Curriculum by difficulty percentile** — dynamic curriculum can bucket by `loss` /
|
|
64
|
+
`perplexity` percentile instead of length round-robin.
|
|
65
|
+
- **Smarter pre-flight `advise`** — `soup advise` now nudges its confidence using your prior
|
|
66
|
+
verdicts for the same project, and `soup runs replay` can plot a benchmark-score curve, not
|
|
67
|
+
just the loss curve.
|
|
65
68
|
|
|
66
69
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
67
70
|
|
|
@@ -34,6 +34,8 @@ v0.57 shipped `adapters diff / merge / blame / branch`. v0.67 finishes the lifec
|
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
# 1. Evolutionary merge: search the simplex of merge weights via CMA-ES.
|
|
37
|
+
# v0.71.4 makes this a LIVE loop — each candidate is merged, scored against
|
|
38
|
+
# --eval, and the best blend is written to --output.
|
|
37
39
|
soup adapters merge \
|
|
38
40
|
adapter-finance/ adapter-medical/ adapter-legal/ \
|
|
39
41
|
--strategy cmaes \
|
|
@@ -43,6 +45,12 @@ soup adapters merge \
|
|
|
43
45
|
--max-generations 20 \
|
|
44
46
|
--output merged/
|
|
45
47
|
|
|
48
|
+
# 1b. One-shot merge with a live canary verdict (v0.71.4). Scores the merged
|
|
49
|
+
# adapter vs the first input → OK / MINOR / MAJOR; --strict-verdict exits 2
|
|
50
|
+
# on a MAJOR regression. A pre-scored canary suite needs no model load.
|
|
51
|
+
soup adapters merge adapter-a/ adapter-b/ -o merged/ \
|
|
52
|
+
--canary evals/canary.json --strict-verdict
|
|
53
|
+
|
|
46
54
|
# 2. Render the merge as a GitHub PR for review (eval deltas + sample diffs).
|
|
47
55
|
soup adapters pr "merge: 3-domain blend" \
|
|
48
56
|
--base-sha $(git rev-parse HEAD) \
|
|
@@ -52,6 +60,12 @@ soup adapters pr "merge: 3-domain blend" \
|
|
|
52
60
|
--dataset-diff data/diff.txt \
|
|
53
61
|
--format markdown -o pr.md
|
|
54
62
|
|
|
63
|
+
# 2b. Post it straight to a GitHub PR comment (v0.71.4). Auth via GITHUB_TOKEN
|
|
64
|
+
# / GH_TOKEN; uses `gh api` under the hood (no secret leaks to the child).
|
|
65
|
+
soup adapters pr "merge: 3-domain blend" \
|
|
66
|
+
--base-sha $(git rev-parse HEAD) --adapter merged/ \
|
|
67
|
+
--eval evals/deltas.json --push your-org/your-repo#42
|
|
68
|
+
|
|
55
69
|
# 3. Lock a reproducible run state. Closure = sha(base + dataset + env).
|
|
56
70
|
soup env lock # v0.64 — capture env hash
|
|
57
71
|
soup lock write \
|
|
@@ -93,6 +107,16 @@ soup loop status
|
|
|
93
107
|
# Run the daemon (foreground)
|
|
94
108
|
soup loop watch --poll-interval 300
|
|
95
109
|
|
|
110
|
+
# Pre-wired production stages (v0.71.4): real traces → DPO → eval-gate → canary,
|
|
111
|
+
# instead of the v0.58 no-op stubs. Opt in once via `loop init --pre-wired` or
|
|
112
|
+
# per-run via --pre-wired. Pack each iteration as a shareable Soup Can with
|
|
113
|
+
# Registry lineage via --pack-cans.
|
|
114
|
+
soup loop init registry://abc12 --eval evals/lock.json --baseline registry://prod --pre-wired
|
|
115
|
+
soup loop watch --pre-wired --pack-cans --poll-interval 300
|
|
116
|
+
|
|
117
|
+
# Unpack a recorded iteration's Soup Can for what-if analysis (v0.71.4)
|
|
118
|
+
soup loop replay iter-20260515T120000-abcdef01 --extract ./iter-dump
|
|
119
|
+
|
|
96
120
|
# Background subprocess (writes PID, no shell)
|
|
97
121
|
soup loop watch --detach
|
|
98
122
|
|
|
@@ -240,6 +264,14 @@ soup adapters blame ./run-v18 --dataset train.jsonl --layer q_proj.7 \
|
|
|
240
264
|
soup adapters branch v18 --config soup.yaml --base meta-llama/Llama-3.1-8B \
|
|
241
265
|
--dataset train.jsonl
|
|
242
266
|
|
|
267
|
+
# Link a branch into the Registry lineage DAG (v0.71.4) — shows as a
|
|
268
|
+
# `branches` node under the entry in `soup history`.
|
|
269
|
+
soup adapters branch v18 --config soup.yaml --base meta-llama/Llama-3.1-8B \
|
|
270
|
+
--attach-to-registry reg_20260601_abc123
|
|
271
|
+
|
|
272
|
+
# Or derive a fresh snapshot's config + base straight from a Registry entry (v0.71.4)
|
|
273
|
+
soup adapters branch v18-from-reg --from-registry reg_20260601_abc123
|
|
274
|
+
|
|
243
275
|
# Restore the snapshot's config (refuses if source SHA drifted)
|
|
244
276
|
soup adapters checkout v18 --output soup.yaml
|
|
245
277
|
|
|
@@ -264,7 +296,9 @@ soup adapters branches
|
|
|
264
296
|
- Branch pointers live under `~/.soup/branches/` (override via `SOUP_BRANCHES_DIR`, constrained to `$HOME` / `$CWD` / `$TMPDIR`).
|
|
265
297
|
- `soup adapters checkout` SHA-checks the source config — refuses to restore when the source has drifted from the snapshot, so reproducibility never silently lies.
|
|
266
298
|
|
|
267
|
-
**v0.66.0:** `soup adapters blame` is now LIVE — the v0.57 `NotImplementedError` stub (#171) is lifted via a DataInf-style influence-function approximation. Pass `--top-k 50` to control the reported top-influencer count; pass a real `probe_fn` (Python API) to feed real gradients, or use the default deterministic synthetic probe for offline planning.
|
|
299
|
+
**v0.66.0:** `soup adapters blame` is now LIVE — the v0.57 `NotImplementedError` stub (#171) is lifted via a DataInf-style influence-function approximation. Pass `--top-k 50` to control the reported top-influencer count; pass a real `probe_fn` (Python API) to feed real gradients, or use the default deterministic synthetic probe for offline planning.
|
|
300
|
+
|
|
301
|
+
**v0.71.4:** the merge verdict is now LIVE — `soup adapters merge … --canary suite.json` lifts the `MergeReport.verdict` `UNKNOWN` stub. A pre-scored `{"baseline_scores","candidate_scores"}` suite classifies the blend OK / MINOR / MAJOR with no model load; a `{"tasks":[...]}` suite uses an injectable scorer. `--strict-verdict` exits 2 on MAJOR. The backdoor-scan and license-conflict gates now run for **every** strategy, including `cmaes`. `soup adapters branch <name> --from-registry <id>` / `--attach-to-registry <id>` link training-env snapshots into the Registry lineage DAG (shown as a `branches` node in `soup history`).
|
|
268
302
|
|
|
269
303
|
|
|
270
304
|
## Soup Cans (Shareable Recipes)
|
|
@@ -459,6 +459,11 @@ Every completed run also stores an estimated cost (`$` per run) computed from th
|
|
|
459
459
|
captured GPU device name and duration. `soup runs show` renders `—` for CPU /
|
|
460
460
|
MPS / unknown GPUs (no fabricated zeros).
|
|
461
461
|
|
|
462
|
+
As of v0.71.5, the metric-series lookup that powers replay (`ExperimentTracker.get_metric_series`)
|
|
463
|
+
transparently falls back to the `eval_results` table when a metric has no per-step
|
|
464
|
+
rows — so you can plot a benchmark-score curve (e.g. `mmlu`, `gsm8k`) the same way
|
|
465
|
+
you plot `loss`, without caring which table holds the series.
|
|
466
|
+
|
|
462
467
|
### Tracker integrations (--tracker mlflow / swanlab / trackio)
|
|
463
468
|
|
|
464
469
|
```bash
|
|
@@ -90,10 +90,12 @@ soup data download user/ds --samples 1000 Stream first 1000 samples
|
|
|
90
90
|
soup data register --name my-ds --path d.jsonl --format alpaca Register dataset
|
|
91
91
|
soup data unregister --name my-ds Remove from registry
|
|
92
92
|
soup data push --input d.jsonl --hf-dataset user/name Upload local JSONL as HF dataset
|
|
93
|
+
soup data push --input d.jsonl --hf-dataset u/n --hub modelscope|modelers Upload to an alternative hub
|
|
93
94
|
soup data registry List all registered datasets
|
|
94
95
|
soup data demo List bundled demo JSONL fixtures
|
|
95
96
|
soup data demo alpaca_demo --output ./d.jsonl Copy a bundled demo JSONL fixture
|
|
96
97
|
soup data forge --docs ./docs --task sft --target-rows 1000 Synthetic data pipeline + provenance
|
|
98
|
+
soup data forge --docs ./docs --hub modelscope --teacher owner/name Pre-fetch the teacher from an alternative hub
|
|
97
99
|
soup data score --input rows.jsonl Composite quality scorecard (PII + toxicity + lang + edu)
|
|
98
100
|
soup data decontaminate --input rows.jsonl --benchmarks mmlu,gsm8k Drop benchmark-overlap rows
|
|
99
101
|
soup data toxicity --input rows.jsonl -o tox.jsonl Flag toxic rows (keyword baseline)
|
|
@@ -109,12 +111,12 @@ soup cost --config soup.yaml --gpu H100 Estimate training cost for specific
|
|
|
109
111
|
soup adapters list ./output/ Scan for LoRA adapters
|
|
110
112
|
soup adapters info ./output/checkpoint-500/ Show adapter metadata
|
|
111
113
|
soup adapters compare adapter1/ adapter2/ Compare two adapters
|
|
112
|
-
soup loop init <model> --eval <s> --baseline <b> Create .soup/loop.yaml (data flywheel)
|
|
113
|
-
soup loop status Counters + status
|
|
114
|
-
soup loop watch [--detach] [--max-iter N]
|
|
114
|
+
soup loop init <model> --eval <s> --baseline <b> [--pre-wired] Create .soup/loop.yaml (data flywheel; --pre-wired = real stages)
|
|
115
|
+
soup loop status Counters + status + pre_wired flag
|
|
116
|
+
soup loop watch [--detach] [--max-iter N] [--pre-wired] [--pack-cans] Harvest → train → gate → deploy daemon (pre-wired stages + Soup Can packing)
|
|
115
117
|
soup loop pause / soup loop resume Atomic status flip
|
|
116
118
|
soup loop canary <adapter> --traffic 5% Promote canary + auto-rollback on MAJOR
|
|
117
|
-
soup loop replay [<iter-id>]
|
|
119
|
+
soup loop replay [<iter-id>] [--extract <dir>] Replay / unpack a recorded iteration manifest
|
|
118
120
|
soup serve --model m --adapters chat=./c code=./d Multi-adapter serving
|
|
119
121
|
soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
|
|
120
122
|
soup migrate --from axolotl config.yml Import config from Axolotl
|
|
@@ -137,7 +139,7 @@ soup can publish r.can --hf-hub user/name Publish .can to HF Hub as dataset
|
|
|
137
139
|
soup runs List training runs
|
|
138
140
|
soup runs show <run_id> Run details + loss graph + cost
|
|
139
141
|
soup runs compare <run_1> <run_2> Compare two runs
|
|
140
|
-
soup runs replay <run_id> Replay summary + loss curve from history
|
|
142
|
+
soup runs replay <run_id> Replay summary + loss curve from history (also plots a benchmark-score curve when the metric lives in eval_results)
|
|
141
143
|
soup why [run_id] Explain training anomalies (heuristic)
|
|
142
144
|
soup tui Full-screen Textual dashboard (requires [tui] extra)
|
|
143
145
|
soup train --config soup.yaml --profile Record torch.profiler trace to <output>/profiles/
|
|
@@ -169,8 +171,10 @@ soup edit set --base <m> --method rome|memit|alphaedit --subject "..." --target
|
|
|
169
171
|
soup edit diff <before-run> <after-run> --probes p.jsonl Knowledge-injection diff visualizer
|
|
170
172
|
soup ingest --source langfuse|langsmith|helicone|openpipe|otel|openai-stored --logs <jsonl> Universal trace importer (6 SaaS adapters → normalised JSONL)
|
|
171
173
|
soup prune-prompt --input <jsonl> --output <jsonl> --min-frequency 0.95 Detect + strip shared system-prompt prefix
|
|
174
|
+
soup prune-prompt ... --tokenizer <id-or-path> Tokenizer-aware prefix detection (decodes remaining ids, boundary-safe)
|
|
172
175
|
soup data active-sample --input <jsonl> --output <jsonl> --budget N Top-N uncertain prod traces for human review
|
|
173
176
|
soup ab --input <jsonl> --metric latency|judge_score|retry_rate mSPRT sequential A/B (decision: continue / reject_h0 / accept_h0)
|
|
177
|
+
soup ingest|prune-prompt|ab|data active-sample ... --slack-url <https> | --discord-url <https> Shared SSRF-validated webhook on completion
|
|
174
178
|
soup drift-alarm --reference <jsonl> --live <jsonl> --threshold 0.2 Rolling-KL drift alarm (exit 3 on drift)
|
|
175
179
|
soup drift-alarm ... --slack-url <https> | --discord-url <https> Optional SSRF-validated webhook on drift detected
|
|
176
180
|
soup tunability --list List built-in candidate-base catalogue
|
|
@@ -188,8 +192,11 @@ soup probe interference <losses.json> [--output o.json] Pairwise N×N adapter i
|
|
|
188
192
|
soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0)
|
|
189
193
|
soup probe pack --list List bundled probe-pack bases (v0.66.0)
|
|
190
194
|
soup adapters blame ... --top-k 50 Live DataInf-style influence runner (v0.66.0, closes #171)
|
|
191
|
-
soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge (v0.67.0)
|
|
195
|
+
soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge — live loop (v0.67.0 schema / v0.71.4 live)
|
|
196
|
+
soup adapters merge ... --canary <suite.json> [--strict-verdict] Live OK/MINOR/MAJOR canary verdict, exit 2 on MAJOR (v0.71.4)
|
|
192
197
|
soup adapters pr <title> --base-sha <hex> --adapter <path> GitHub-shaped adapter PR Markdown / JSON (v0.67.0)
|
|
198
|
+
soup adapters pr <title> ... --push owner/repo#N Post the PR as a GitHub comment via gh api (v0.71.4)
|
|
199
|
+
soup adapters branch <name> --from-registry <id> | --attach-to-registry <id> Branch ↔ Registry lineage (v0.71.4)
|
|
193
200
|
soup adapters bisect <ckpt>... --eval-command "..." Binary search over training history (v0.67.0)
|
|
194
201
|
soup lock write --base-sha <h> --dataset-sha <h> --env-hash <h> Write soup.lock (v0.67.0)
|
|
195
202
|
soup lock write --base-sha <h> --dataset-sha <h> --env-lock soup-env.lock Auto-derive --env-hash from soup-env.lock (v0.71.1)
|
|
@@ -94,6 +94,14 @@ soup prune-prompt --input traces.jsonl --output pruned.jsonl --min-frequency 0.9
|
|
|
94
94
|
|
|
95
95
|
Binary-search over up-to-32 candidate templates finds the longest qualifying prefix (a longer threshold-meeting prefix may exist beyond the universal one — Soup does not early-exit on the 100% match). Two-pass file read with a 100 000-row DoS cap.
|
|
96
96
|
|
|
97
|
+
**Tokenizer-aware mode (v0.71.5).** Pass `--tokenizer <id-or-path>` (a HuggingFace repo id, a local path, or anything `AutoTokenizer.from_pretrained` accepts) to detect the shared prefix in *token* space and decode only the remaining ids:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
soup prune-prompt --input traces.jsonl --output pruned.jsonl --tokenizer Qwen/Qwen2.5-0.5B
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Char-level stripping can cut a BPE multi-byte sequence in half when the shared prefix ends mid-token; token-aware pruning finds the longest shared *token-id* prefix and decodes the remainder, so the boundary always lands on a real token. Per-row encoding is capped at 50 000 tokens. Omit `--tokenizer` to keep the original character-level behaviour.
|
|
104
|
+
|
|
97
105
|
|
|
98
106
|
## Active-Learning Sampler (`soup data active-sample`)
|
|
99
107
|
|
|
@@ -108,6 +116,8 @@ soup data active-sample --input traces.jsonl --output for-review.jsonl --budget
|
|
|
108
116
|
|
|
109
117
|
The output JSONL is a drop-in prompt set for `soup eval human` (v0.19). Budget is bounded `[1, 100 000]`.
|
|
110
118
|
|
|
119
|
+
**Webhooks (v0.71.5).** `soup ingest`, `soup prune-prompt`, `soup ab`, and `soup data active-sample` all accept `--slack-url` / `--discord-url` and POST a one-line summary on completion through the same SSRF-hardened validator as `soup drift-alarm` (scheme allowlist, loopback-only HTTP, RFC1918 / link-local / reserved / multicast rejected; the post never raises, so a flaky webhook can't fail the command). `soup ab` only fires when the sequential test actually decides (`reject_h0` / `accept_h0`), not while it's still `continue`-ing.
|
|
120
|
+
|
|
111
121
|
|
|
112
122
|
## Synthetic Data Generation
|
|
113
123
|
|
|
@@ -479,6 +489,8 @@ Three tasks supported: `sft` (Q&A pairs), `preference` (chosen/rejected), `tool`
|
|
|
479
489
|
|
|
480
490
|
Document discovery is one level deep over `.txt` / `.md` / `.json` / `.jsonl`; dotfiles + symlinked directories are skipped. All paths are cwd-contained, all writes are atomic via staged-tempfile + `os.replace`, and write targets are rejected if they're symlinks. **Judge providers are live**: `--judge-provider ollama` (localhost-only), `--judge-provider anthropic` (env-only API key), `--judge-provider vllm` (scheme-validated). Per-call judge exceptions logged at DEBUG.
|
|
481
491
|
|
|
492
|
+
**Alternative teacher hubs (v0.71.5).** `--hub modelscope|modelers` pre-fetches the `--teacher` from that hub when the teacher is a routable repo id (`owner/name`); `--hub hf` (default) is a no-op and leaves the teacher as a provenance label. If `--hub` is non-HF but `--teacher` is not a repo id (e.g. the default `local-judge`), Soup prints a loud yellow warning rather than silently dropping the flag.
|
|
493
|
+
|
|
482
494
|
|
|
483
495
|
## Data Quality Scorecard
|
|
484
496
|
|
|
@@ -82,6 +82,8 @@ soup advise compare
|
|
|
82
82
|
4. Task is `factual_lookup` with high output variance → **RAG**.
|
|
83
83
|
5. Otherwise → **SFT**.
|
|
84
84
|
|
|
85
|
+
**Cross-project confidence bias (v0.71.5).** When `~/.soup/advise_history.jsonl` holds ≥3 prior verdicts for the *same choice* in the *same project*, `soup advise` nudges its confidence (not its decision) toward what worked before: a net-positive precedent record (you accepted it AND its recorded outcome was good) bumps confidence up by a small constant; a net-negative one bumps it down. The rubric verdict itself never changes — only how sure Soup is. Verdicts must be `--record`ed for the bias to kick in.
|
|
86
|
+
|
|
85
87
|
**Why this command exists.** "Choose fine-tuning vs RAG vs prompt-engineering" is the most-mis-made decision in the space. Reddit, HN, IBM, and Google Cloud all converge on the same advice (start with prompts, escalate to RAG, fine-tune as last resort) and almost everyone ignores it because nobody has the data to prove their case is the exception. Soup `autopilot` picks hyperparameters AFTER you've decided to train; `soup advise` owns the layer above. No trainer library has an incentive to tell users *not to train* — Unsloth's funnel, Axolotl's hosted business, LLaMA-Factory's Alibaba alignment all monetise the training event.
|
|
86
88
|
|
|
87
89
|
|
|
@@ -213,6 +215,8 @@ soup ab --input ab.jsonl --metric judge_score --alpha 0.01 --beta 0.10 --effect-
|
|
|
213
215
|
|
|
214
216
|
Input rows look like `{"arm": "control", "latency": 1.23}` or `{"arm": "treatment", "judge_score": 0.91}`. Decision is one of `continue` (keep collecting samples), `reject_h0` (real difference detected), `accept_h0` (no significant difference). Composes with `soup loop canary` (v0.58) — promote or roll back as soon as the LLR clears a decision boundary.
|
|
215
217
|
|
|
218
|
+
`soup ab` accepts `--slack-url` / `--discord-url` (v0.71.5) and pings the webhook **only when the test actually decides** (`reject_h0` / `accept_h0`) — a still-running `continue` stays quiet so you're not paged on every peek. Same SSRF-hardened validator as `soup drift-alarm`.
|
|
219
|
+
|
|
216
220
|
|
|
217
221
|
## Drift Alarm (`soup drift-alarm`)
|
|
218
222
|
|
|
@@ -907,12 +907,15 @@ Layer dynamic re-weighting on top of the static `curriculum` bucketer. Every N s
|
|
|
907
907
|
training:
|
|
908
908
|
curriculum: true # static bucketer (v0.23.0)
|
|
909
909
|
curriculum_buckets: 4
|
|
910
|
+
curriculum_metric: perplexity # length (default) | loss | perplexity
|
|
910
911
|
curriculum_dynamic: true # NEW — dynamic re-weighting
|
|
911
912
|
curriculum_dynamic_recompute_steps: 50 # refresh every 50 global steps
|
|
912
913
|
curriculum_dynamic_floor: 0.05 # min weight per bucket
|
|
913
914
|
curriculum_dynamic_temperature: 1.0 # softmax temp on uncertainty
|
|
914
915
|
```
|
|
915
916
|
|
|
917
|
+
**Bucketing by difficulty percentile (v0.71.5).** When `curriculum_metric` is `loss` or `perplexity`, the dynamic callback assigns each step's sample to a bucket by its *rank* within a rolling 512-step window of the difficulty signal (perplexity = `exp(min(loss, 50))`), instead of the round-robin fallback used for `length`. This keeps the buckets calibrated to the live loss distribution rather than a static length sort. `length` (the default) keeps the round-robin assignment.
|
|
918
|
+
|
|
916
919
|
Visualise the recorded bucket-weight evolution with `soup runs curriculum-curve <run_id>`.
|
|
917
920
|
|
|
918
921
|
DDP / grad-accum safety: multi-rank launches must wire an `all_reduce` hook on per-bucket stats (a cross-validator rejects un-coordinated multi-rank runs upfront). Multi-trainer expansion beyond `sft` / `pretrain` is tracked for v0.48.1.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Shared CLI glue for the --slack-url / --discord-url webhook flags (v0.71.5 #207).
|
|
2
|
+
|
|
3
|
+
Keeps Typer + Rich Console concerns in the commands layer (``utils/webhooks``
|
|
4
|
+
stays import-light + framework-free). Used by ``ingest`` / ``prune-prompt`` /
|
|
5
|
+
``ab`` / ``data active-sample`` so the validate-then-deliver pattern is defined
|
|
6
|
+
once.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Optional, Tuple
|
|
12
|
+
|
|
13
|
+
import typer
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
from rich.markup import escape
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def validate_webhook_flags(
|
|
19
|
+
slack_url: Optional[str],
|
|
20
|
+
discord_url: Optional[str],
|
|
21
|
+
*,
|
|
22
|
+
console: Console,
|
|
23
|
+
) -> Tuple[Optional[str], Optional[str]]:
|
|
24
|
+
"""Validate webhook URLs at the CLI boundary (``typer.Exit(2)`` on bad).
|
|
25
|
+
|
|
26
|
+
Returns the (canonical) URLs. Mirrors the v0.63.0 ``drift-alarm``
|
|
27
|
+
early-rejection pattern so a typo'd / SSRF-y URL fails fast with a
|
|
28
|
+
friendly message instead of being silently swallowed at delivery time.
|
|
29
|
+
"""
|
|
30
|
+
from soup_cli.utils.webhooks import validate_webhook_url
|
|
31
|
+
|
|
32
|
+
out = []
|
|
33
|
+
for label, value in (("--slack-url", slack_url), ("--discord-url", discord_url)):
|
|
34
|
+
if value is None:
|
|
35
|
+
out.append(None)
|
|
36
|
+
continue
|
|
37
|
+
try:
|
|
38
|
+
out.append(validate_webhook_url(value))
|
|
39
|
+
except (TypeError, ValueError) as exc:
|
|
40
|
+
console.print(f"[red]{label}: {escape(str(exc))}[/]")
|
|
41
|
+
raise typer.Exit(2) from exc
|
|
42
|
+
return out[0], out[1]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def emit_webhooks(
|
|
46
|
+
slack_url: Optional[str],
|
|
47
|
+
discord_url: Optional[str],
|
|
48
|
+
*,
|
|
49
|
+
payload: dict,
|
|
50
|
+
console: Console,
|
|
51
|
+
) -> None:
|
|
52
|
+
"""POST the completion payload to any configured webhooks (best-effort).
|
|
53
|
+
|
|
54
|
+
Never raises (delegates to the never-raising
|
|
55
|
+
:func:`soup_cli.utils.webhooks.send_webhooks`). Prints a per-target
|
|
56
|
+
delivered/failed line so the operator sees whether the alert landed.
|
|
57
|
+
"""
|
|
58
|
+
if slack_url is None and discord_url is None:
|
|
59
|
+
return
|
|
60
|
+
from soup_cli.utils.webhooks import send_webhooks
|
|
61
|
+
|
|
62
|
+
for label, ok in send_webhooks(
|
|
63
|
+
payload, slack_url=slack_url, discord_url=discord_url
|
|
64
|
+
):
|
|
65
|
+
colour = "green" if ok else "yellow"
|
|
66
|
+
console.print(
|
|
67
|
+
f"[{colour}]{label} webhook: {'delivered' if ok else 'failed'}[/]"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
__all__ = ["emit_webhooks", "validate_webhook_flags"]
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
5
7
|
import typer
|
|
6
8
|
from rich.console import Console
|
|
7
9
|
from rich.markup import escape
|
|
8
10
|
from rich.panel import Panel
|
|
9
11
|
from rich.table import Table
|
|
10
12
|
|
|
13
|
+
from soup_cli.commands._webhook_cli import emit_webhooks, validate_webhook_flags
|
|
11
14
|
from soup_cli.utils.ab_test import (
|
|
12
15
|
MsprtConfig,
|
|
13
16
|
run_msprt,
|
|
@@ -35,6 +38,20 @@ def ab(
|
|
|
35
38
|
0.1, "--effect-size",
|
|
36
39
|
help="Minimum detectable difference in means.",
|
|
37
40
|
),
|
|
41
|
+
slack_url: Optional[str] = typer.Option(
|
|
42
|
+
None, "--slack-url",
|
|
43
|
+
help=(
|
|
44
|
+
"Optional Slack webhook URL — POSTed on a reject_h0 / accept_h0 "
|
|
45
|
+
"decision (not on continue). SSRF-validated."
|
|
46
|
+
),
|
|
47
|
+
),
|
|
48
|
+
discord_url: Optional[str] = typer.Option(
|
|
49
|
+
None, "--discord-url",
|
|
50
|
+
help=(
|
|
51
|
+
"Optional Discord webhook URL — POSTed on a reject_h0 / accept_h0 "
|
|
52
|
+
"decision (not on continue). SSRF-validated."
|
|
53
|
+
),
|
|
54
|
+
),
|
|
38
55
|
) -> None:
|
|
39
56
|
"""Sequential A/B test with early-stop guarantees (mSPRT)."""
|
|
40
57
|
try:
|
|
@@ -43,6 +60,10 @@ def ab(
|
|
|
43
60
|
console.print(f"[red]{escape(str(exc))}[/]")
|
|
44
61
|
raise typer.Exit(2) from exc
|
|
45
62
|
|
|
63
|
+
slack_url, discord_url = validate_webhook_flags(
|
|
64
|
+
slack_url, discord_url, console=console
|
|
65
|
+
)
|
|
66
|
+
|
|
46
67
|
try:
|
|
47
68
|
cfg = MsprtConfig(
|
|
48
69
|
metric=canonical, alpha=alpha, beta=beta, effect_size=effect_size,
|
|
@@ -101,5 +122,24 @@ def ab(
|
|
|
101
122
|
)
|
|
102
123
|
)
|
|
103
124
|
|
|
125
|
+
# Webhook only fires on a terminal decision (reject_h0 / accept_h0) —
|
|
126
|
+
# a `continue` verdict carries no actionable signal (issue #207).
|
|
127
|
+
if verdict.decision != "continue":
|
|
128
|
+
emit_webhooks(
|
|
129
|
+
slack_url,
|
|
130
|
+
discord_url,
|
|
131
|
+
payload={
|
|
132
|
+
"command": "ab",
|
|
133
|
+
"metric": canonical,
|
|
134
|
+
"decision": verdict.decision,
|
|
135
|
+
"log_likelihood_ratio": verdict.log_likelihood_ratio,
|
|
136
|
+
"n_control": verdict.n_control,
|
|
137
|
+
"n_treatment": verdict.n_treatment,
|
|
138
|
+
"mean_control": verdict.mean_control,
|
|
139
|
+
"mean_treatment": verdict.mean_treatment,
|
|
140
|
+
},
|
|
141
|
+
console=console,
|
|
142
|
+
)
|
|
143
|
+
|
|
104
144
|
|
|
105
145
|
__all__ = ["ab"]
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
5
7
|
import typer
|
|
6
8
|
from rich.console import Console
|
|
7
9
|
from rich.markup import escape
|
|
8
10
|
from rich.panel import Panel
|
|
9
11
|
|
|
12
|
+
from soup_cli.commands._webhook_cli import emit_webhooks, validate_webhook_flags
|
|
10
13
|
from soup_cli.utils.active_sampler import sample_uncertain_rows, validate_budget
|
|
11
14
|
|
|
12
15
|
console = Console()
|
|
@@ -24,6 +27,14 @@ def active_sample(
|
|
|
24
27
|
100, "--budget",
|
|
25
28
|
help="Max rows to surface for human review (1 - 100_000).",
|
|
26
29
|
),
|
|
30
|
+
slack_url: Optional[str] = typer.Option(
|
|
31
|
+
None, "--slack-url",
|
|
32
|
+
help="Optional Slack webhook URL — POSTed on completion. SSRF-validated.",
|
|
33
|
+
),
|
|
34
|
+
discord_url: Optional[str] = typer.Option(
|
|
35
|
+
None, "--discord-url",
|
|
36
|
+
help="Optional Discord webhook URL — POSTed on completion. SSRF-validated.",
|
|
37
|
+
),
|
|
27
38
|
) -> None:
|
|
28
39
|
"""Surface the most uncertain prod traces for human review."""
|
|
29
40
|
try:
|
|
@@ -32,6 +43,10 @@ def active_sample(
|
|
|
32
43
|
console.print(f"[red]{escape(str(exc))}[/]")
|
|
33
44
|
raise typer.Exit(2) from exc
|
|
34
45
|
|
|
46
|
+
slack_url, discord_url = validate_webhook_flags(
|
|
47
|
+
slack_url, discord_url, console=console
|
|
48
|
+
)
|
|
49
|
+
|
|
35
50
|
try:
|
|
36
51
|
plan = sample_uncertain_rows(
|
|
37
52
|
input_path,
|
|
@@ -55,5 +70,18 @@ def active_sample(
|
|
|
55
70
|
)
|
|
56
71
|
)
|
|
57
72
|
|
|
73
|
+
emit_webhooks(
|
|
74
|
+
slack_url,
|
|
75
|
+
discord_url,
|
|
76
|
+
payload={
|
|
77
|
+
"command": "active-sample",
|
|
78
|
+
"rows_selected": plan.rows_selected,
|
|
79
|
+
"rows_in": plan.rows_in,
|
|
80
|
+
"mean_uncertainty": plan.mean_uncertainty,
|
|
81
|
+
"budget": plan.budget,
|
|
82
|
+
},
|
|
83
|
+
console=console,
|
|
84
|
+
)
|
|
85
|
+
|
|
58
86
|
|
|
59
87
|
__all__ = ["active_sample"]
|