soup-cli 0.71.2__tar.gz → 0.71.4__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.2 → soup_cli-0.71.4}/CHANGELOG.md +80 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/CONTRIBUTING.md +3 -1
- {soup_cli-0.71.2 → soup_cli-0.71.4}/PKG-INFO +21 -14
- {soup_cli-0.71.2 → soup_cli-0.71.4}/README.md +15 -13
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/adapters-and-governance.md +71 -9
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/commands.md +15 -6
- {soup_cli-0.71.2 → soup_cli-0.71.4}/pyproject.toml +7 -2
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/__init__.py +1 -1
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/pack.py +4 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/schema.py +49 -2
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cli.py +110 -3
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/adapters.py +225 -50
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/airgap.py +60 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/can.py +40 -1
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/history.py +14 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/loop.py +73 -5
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/train.py +75 -10
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/registry/store.py +2 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_branch.py +119 -1
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_merge.py +145 -7
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_pr.py +151 -1
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/airgap_bundle.py +47 -1
- soup_cli-0.71.4/src/soup_cli/utils/annex_xi.py +458 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/cmaes_merge.py +149 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/energy.py +124 -3
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/loop_daemon.py +68 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/loop_iteration.py +104 -0
- soup_cli-0.71.4/src/soup_cli/utils/loop_stages.py +418 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/loop_state.py +7 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/paths.py +32 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_cans.py +2 -2
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_a_wave2.py +15 -4
- soup_cli-0.71.4/tests/test_v0713.py +1048 -0
- soup_cli-0.71.4/tests/test_v0714.py +1784 -0
- soup_cli-0.71.2/src/soup_cli/utils/annex_xi.py +0 -218
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.dockerignore +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/FUNDING.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/pull_request_template.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/workflows/ci.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/workflows/docker.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/workflows/publish.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.github/workflows/recipe-validation.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.gitignore +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/.pre-commit-config.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/AGENTS.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/CODEOWNERS +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/CODE_OF_CONDUCT.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/Dockerfile +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/LICENSE +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/NOTICE +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/SECURITY.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docker-compose.yml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/README.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/backends-and-ops.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/data.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/evaluation.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/models.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/peft-and-efficiency.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/performance-and-quantization.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/serving-and-export.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/docs/training.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/README.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/dpo_chat.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/dpo_example.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/grpo_reasoning.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/rlhf_step1_sft.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/rlhf_step2_reward.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/rlhf_step3_ppo.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/sft_basic.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/configs/vision_llama.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/data/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/data/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/data/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/data/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/synthetic_workflow.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/examples/synthetic_workflow.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/soup.png +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/soup_logo_svg.svg +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/__main__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/autopilot/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/autopilot/analyzer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/autopilot/decisions.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/autopilot/generate_config.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/publish.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/run.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/unpack.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/cans/verify.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/_eval_v0550.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/_eval_v0610.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/_eval_v0650.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/ab.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/active_sample.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/advise.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/agent.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/apple_adapter.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/attest.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/audit_log.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/autopilot.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/bench.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/bom.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/build.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/chat.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/compile_cmd.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/compile_tools.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/completions.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/cost.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/data.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/data_forge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/data_mix.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/data_score.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/delinearize_llama4.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/deploy.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/diagnose.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/distill_prompt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/doctor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/drift_alarm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/edit.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/env.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/eval.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/expect.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/export.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/fetch.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/generate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/infer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/ingest.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/init.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/iterative_dpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/license_advisor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/llama.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/local_rl.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/lock.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/merge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/migrate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/monitor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/plan.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/plugins.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/probe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/profile.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/prune_prompt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/push.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/quantize.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/quickstart.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/recipes.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/registry.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/runs.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/serve.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/steer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/sweep.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/tokenizer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/tui.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/tunability.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/ui.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/commands/why.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/config/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/config/loader.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/config/schema.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/augment.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/chat_templates.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/collators.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/formats.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/loader.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/loss_mask.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/providers/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/providers/_utils.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/providers/anthropic.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/providers/ollama.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/providers/vllm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/sft_format.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/code.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/conversation.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/preference.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/qa.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/reasoning.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/tool_calling.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/templates/verifiable.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/traces/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/traces/pair_builder.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/traces/parsers.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/traces/quality.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/data/validator.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/arena.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/calibrate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/custom.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/forgetting.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/gate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/human.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/judge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/leaderboard.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/eval/quant_check.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/experiment/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/experiment/tracker.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/migrate/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/migrate/axolotl.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/migrate/common.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/migrate/llamafactory.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/migrate/unsloth.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/callback.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/display.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/hf_push.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/plugin_callback.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/monitoring/trace_logger.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/plugins/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/py.typed +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/recipes/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/recipes/catalog.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/registry/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/registry/attach.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/registry/diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/registry/hashing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/audio.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/bco.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/chat.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/code.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/embedding.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/ipo.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/kto.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/longcontext.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/manifest.json +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/medical.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/moe.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/orpo.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/pretrain.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/reasoning.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/rlhf.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/simpo.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/tool-calling.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/templates/vision.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/bco.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/classifier.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/distill.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/dpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/embedding.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/grpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/ipo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/kto.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/mlx_dpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/mlx_grpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/mlx_routing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/mlx_sft.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/orpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/ppo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/preference.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/pretrain.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/prm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/reward_model.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/rewards.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/sft.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/simpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/trainer/unlearn.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/tui_app.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/app.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/plugins/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/static/app.js +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/static/index.html +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/static/logo.png +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/static/logo.svg +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/ui/static/style.css +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/_eval_text.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ab_test.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/activation_offload.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/active_sampler.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_bisect.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_scan.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/adapter_sign.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/advanced_precision.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/advise.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/advise_history.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/agent_forge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/agent_rollout.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/anthropic_messages.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/apple_adapter.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/attest.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/audit_log.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/auto_quant.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/backend_detect.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/batch_probe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/behavior_battery.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/bitnet.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/blame.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/block_expansion.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/bom.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/brain_rot.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/brain_rot_lang.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/build_dag.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/canary_discovery.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/canary_router.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/capability_suite.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/checklist_dsl.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/citation_faithful.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/classifier.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/compile_tools.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/completions.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/constants.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/convergence.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/crash.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/cross_doc_attn.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/curriculum.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/cut_ce.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/data_forge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/data_mix.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/data_pipeline.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/data_score.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/deepspeed.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/delinearize_llama4.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/demo_bundles.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/deploy_autopilot.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/deploy_measure.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/_common.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/badge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/contamination.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/format.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/memorization.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/refusal.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/report.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/diagnose/runner.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/distill.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/dpo_variants.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/drift_alarm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ebft_gdpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/echo_trap.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/edit_diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/edit_governor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/encoding.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/env_lock.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/errors.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/eval_design.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/eval_gate_hook.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/expectations.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/fetch_examples.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/flash_attn.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/fp8.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/freeze.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/fsdp.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/galore.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/gguf_quant.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/gpu.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/gpu_monitor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/grace_codebook.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/graceful_save.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/grad_accum.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/gradient_ckpt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/grpo_long_context.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/grpo_variants.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/hardware_fit.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/hf.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/hf_space.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/hubs.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ingest_sources.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/integrations.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/interference.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/irt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/iterative_dpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/jinja_analyzer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/kernel_picker.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/knowledge_edit.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/kv_cache.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/launcher.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/license_advisor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/license_matrix.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/liger.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/llama_proxy.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/llama_server_timings.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/local_rl.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/loftq_init.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/log_level.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/long_context.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/longlora.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/loop_budget.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/lr_finder.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/lr_groups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/magpie.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/metrics.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/mii.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/minillm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/mix_proxy.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/mixed_precision.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/mlx.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/moe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/moe_quant.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/mole_routing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/multipack.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/multipack_sampler.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/multipack_trainer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/namespace_pin.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/neat_packing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ngram_spec.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/nlg_metrics.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ollama.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/onboarding.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/optimizer_zoo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/peft_builder.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/peft_patches.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/peft_wiring.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/persona_hub.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/pipeline.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/preference_combine.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/prm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/probe_pack.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/profiler.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/profiling.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/profiling_v0_43.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/prompt_compile.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/prompt_distill.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/prune_prompt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/qat.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/qr_url.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/quality.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/quant_menu.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ra_dit.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/reasoning_effort.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/reasoning_parser.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/recipe_dag.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/recipe_run.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/registry.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/relora.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/replay.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/repro_receipt.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/reward_hacking.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ring_attention.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/rl_checkpoint.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/run_cost.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/sae_diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/save_formats.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/server_tools.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/sglang.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/shortcuts.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/signing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/sleeper_probe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/soup_lock.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/spec_pairing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/spike_recovery.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/sse_train_stream.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/steering.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/strict_safetensors.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/structured_output.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/sweep_config.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/tail_latency.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/terraform_plan.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/tool_outputs.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/topology.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/tracing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/trackers.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/train_event_buffer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/trainer_plugins.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/trust_remote.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/tts.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/tunability.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/ui_env.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/uld.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/unlearning.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/unlearning_eval.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/unsloth.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/v028_features.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/vector_bank.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/vllm.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/vscode_setup.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/warmup.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/src/soup_cli/utils/why.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/templates/chat.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/templates/code.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/templates/medical.yaml +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/__init__.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/conftest.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/qa/v053_qa.md +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_adapters.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_advanced_peft.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_assistant_mask.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_audio.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_auto_tuning.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_autopilot.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_awq_gptq_export.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_batch_probe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_bco.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_bench.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_brain_rot_multilingual.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_bugfixes.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_callback.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_chat.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_chat_template.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_cli.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_cli_subprocess.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_config.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_cost.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_crash_reporter.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_curriculum.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_data.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_data_augment.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_data_sample.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_data_split.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_data_tools.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_dataset_hub.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_dataset_registry.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_deepspeed.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_deploy_ollama.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_diff.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_display.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_doctor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_dpo_example.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_dpo_variants.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_embedding.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_errors.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_eval.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_eval_gate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_eval_platform.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_export.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_formats.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_fp8_recipe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_freeze_training.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_generate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_gpu.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_grpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_hf_integration.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_infer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_inference_advanced.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_init.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ipo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_jinja_analyzer.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_kto.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_loader.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_log_level.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_loss_watchdog.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_merge.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_migrate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_mlx_backend.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_moe.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_multi_adapter.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_multi_gpu.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_multipack_config.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_multipack_invariants.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_multipack_sampler.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_neat_packing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_neftune_rslora.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_onnx_tensorrt_export.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_orpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_packing.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_a_wave1.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_part_f_hardening.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_peft_methods.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_peft_patches.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_performance.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_pissa_init.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ppo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_preference_dispatcher.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_preference_multi.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_preference_multi_runtime.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_pretrain.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_profile.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_profiling.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_progress.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_push.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_qat.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_quality_filter.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_quant_check.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_quant_menu.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_quickstart.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_rank_pattern.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_recipes.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_recipes_v031.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_refusal_multilingual.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_registry.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_relora.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_replay.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_resume.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_rlvr.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_run_cost.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_runs.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_serve.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_server_generate.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_sglang_serve.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_simpo.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_smoke_train.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_speculative_decoding.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_sweep.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_synth_data_pro.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_templates_yaml.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_tensorboard.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_tool_calling.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_trace_to_pref.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_tracker.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_trainer_coverage_v035.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_trainer_init.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_training_intelligence.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_training_speed.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_trust_remote_code.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_tui.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ui.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ui_chat.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ui_config_builder.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ui_live_monitor.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_ui_metrics.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_unsloth.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0401_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0401_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0401_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0402_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0402_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0403_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0403_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0403_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0404_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0404_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0405_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0406_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0410_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0410_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0410_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0420.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0430_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0430_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0430_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0430_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0440_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0440_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0440_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0440_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0440_review_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0450.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0460_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0460_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0470_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0470_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0480_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0480_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0490.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0500_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0500_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0500_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0500_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0500_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0510.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0520.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0530.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v05310.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v05311.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0531_109.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0531_139.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0531_142.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0531_82.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0532.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0533.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0534.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0535.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0536.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0537.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0538.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0539.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0540.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0550.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0550_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0560.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0570_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0570_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0570_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0570_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0580.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0590.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0600_part_f.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0610_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0610_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0610_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0610_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0610_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0620_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0630_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0631_206.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0640_part_f.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0650_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_cli.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0660_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0670_part_f.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_followups.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0680_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0690_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0690_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0690_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0690_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0690_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_a.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_b.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_c.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_d.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_e.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0700_part_f.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_v0712.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_validator.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_vision.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_vllm_serve.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_why.py +0 -0
- {soup_cli-0.71.2 → soup_cli-0.71.4}/tests/test_windows_encoding.py +0 -0
|
@@ -12,6 +12,86 @@ reproducing 70+ versions of notes.
|
|
|
12
12
|
|
|
13
13
|
## [Unreleased]
|
|
14
14
|
|
|
15
|
+
## [0.71.4] - 2026-06-02
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Live canary verdict for `soup adapters merge`** — `--canary <suite.json>`
|
|
19
|
+
scores the merged adapter against the first input and classifies
|
|
20
|
+
**OK / MINOR / MAJOR** using the Quant-Lobotomy taxonomy (drop <2% OK, <5%
|
|
21
|
+
MINOR, else MAJOR). `--strict-verdict` exits 2 on MAJOR. Pre-scored
|
|
22
|
+
`{"baseline_scores","candidate_scores"}` suites run with no model load; a
|
|
23
|
+
`{"tasks":[...]}` suite uses an injectable scorer. Replaces the v0.57 `UNKNOWN`
|
|
24
|
+
stub.
|
|
25
|
+
- **Live evolutionary merge** — `soup adapters merge --strategy cmaes --eval
|
|
26
|
+
<suite> --budget <t>` now runs the full CMA-ES loop: each candidate is merged,
|
|
27
|
+
materialised, scored against the eval suite, and the best-weighted merge is
|
|
28
|
+
written to `--output`. Replaces the v0.67 plan-only stub.
|
|
29
|
+
- **Publish an adapter PR to GitHub** — `soup adapters pr <title> --base-sha
|
|
30
|
+
<hex> --adapter <path> --push owner/repo#N` posts the rendered PR Markdown as a
|
|
31
|
+
GitHub PR comment via `gh api` (argv-list, body over JSON stdin; no shell).
|
|
32
|
+
Token resolves from `GITHUB_TOKEN` / `GH_TOKEN`.
|
|
33
|
+
- **Pre-wired `soup loop` production stages** — `soup loop init --pre-wired` (or
|
|
34
|
+
`soup loop watch --pre-wired`) swaps the v0.58 no-op stage stubs for real
|
|
35
|
+
harvest (traces → preference pairs) → DPO train → eval-gate → canary-deploy
|
|
36
|
+
callables. `soup loop status` now shows the `pre_wired` flag.
|
|
37
|
+
- **Loop iterations as Soup Cans + Registry lineage** — `soup loop watch
|
|
38
|
+
--pack-cans` packs each successful iteration as a v0.26 Soup Can and appends a
|
|
39
|
+
Registry entry (tag `loop-iter`), chaining a real lineage DAG across
|
|
40
|
+
iterations visible through `soup history`. `soup loop replay <id> --extract
|
|
41
|
+
<dir>` unpacks a recorded iteration.
|
|
42
|
+
- **Branch pointers into the Registry** — `soup adapters branch <name>
|
|
43
|
+
--attach-to-registry <id>` links a branch snapshot to a Registry entry (shown
|
|
44
|
+
as a `branches` node in `soup history`); `soup adapters branch <name>
|
|
45
|
+
--from-registry <id>` derives a fresh snapshot's config + base from an entry.
|
|
46
|
+
|
|
47
|
+
### Security
|
|
48
|
+
- The backdoor-scan gate (v0.71.2 #192) and license-conflict gate (v0.60 Part E)
|
|
49
|
+
now run for **all** merge strategies, including `--strategy cmaes` (previously
|
|
50
|
+
bypassed because cmaes returned before the gates).
|
|
51
|
+
- `soup loop` canary deploy restricts `SOUP_LOOP_SERVE_ENDPOINT` to loopback /
|
|
52
|
+
RFC1918-private hosts (a serve endpoint is the operator's own box/LAN), beyond
|
|
53
|
+
the general webhook SSRF policy which permits any HTTPS host.
|
|
54
|
+
- `soup adapters pr --push` builds the `gh` child environment from an allowlist
|
|
55
|
+
so unrelated secrets (`HF_TOKEN` / `OPENAI_API_KEY` / …) never reach the
|
|
56
|
+
subprocess.
|
|
57
|
+
- The canary-suite JSON read uses `O_NOFOLLOW` + `os.fstat` (size cap enforced on
|
|
58
|
+
the same fd) to close the symlink/size-cap TOCTOU window.
|
|
59
|
+
|
|
60
|
+
## [0.71.3] - 2026-06-01
|
|
61
|
+
|
|
62
|
+
### Added
|
|
63
|
+
- **Energy & CO2 measurement for training** — `soup train --track-energy` wraps
|
|
64
|
+
the training window in a codecarbon **offline** tracker (no IP-geolocation
|
|
65
|
+
network call) and reports kWh / CO2 / grid intensity, feeding those numbers
|
|
66
|
+
into `--annex-xi`. New `EnergyTracker` context manager; graceful no-op when
|
|
67
|
+
codecarbon is absent (`pip install soup-cli[carbon]`). `--energy-country`
|
|
68
|
+
picks the ISO-3166 alpha-3 grid for the CO2 estimate (default `USA`).
|
|
69
|
+
- **PDF Annex XI/XII documents** — `soup train --annex-xi report.pdf` now renders
|
|
70
|
+
a reportlab PDF (a `.md` path still renders markdown). `pip install
|
|
71
|
+
soup-cli[pdf]`.
|
|
72
|
+
- **Auto-populated training-corpus domains in Annex XI/XII** — the top crawled
|
|
73
|
+
domains (with shares) are now extracted from the training JSONL and listed in
|
|
74
|
+
the EU AI Act docs, replacing the previous empty placeholder.
|
|
75
|
+
- **Soup Can manifest v3 with embedded attestations** — `soup can pack --attest
|
|
76
|
+
<statement.json>` (repeatable) embeds in-toto Statements into a v3 can
|
|
77
|
+
manifest; v1/v2 cans still load. Each statement is shape- and size-validated.
|
|
78
|
+
- **Local audit log auto-instrumentation** — every `soup` command now appends one
|
|
79
|
+
HIPAA/SOC2-shaped record to `~/.soup/audit.jsonl` (secrets redacted, args
|
|
80
|
+
capped). Opt out per-invocation with `--no-audit-log` or globally with
|
|
81
|
+
`SOUP_NO_AUDIT_LOG=1`. Tail/rotate with `soup audit-log`.
|
|
82
|
+
- **Reproducibility receipt in airgap bundles** — `soup airgap-bundle
|
|
83
|
+
--repro-receipt <receipt.json>` embeds an SR 11-7 receipt as
|
|
84
|
+
`repro-receipt.json`; auto-detected from `<model>/repro-receipt.json` when not
|
|
85
|
+
supplied.
|
|
86
|
+
|
|
87
|
+
### Security
|
|
88
|
+
- `soup can pack --attest` now rejects oversize attestation files by their raw
|
|
89
|
+
size *before* parsing them into memory (defence against memory-exhaustion).
|
|
90
|
+
- The new file-loading paths (attestation JSON, airgap receipt, training-corpus
|
|
91
|
+
scan, PDF write) are all cwd-contained + TOCTOU symlink-rejected and
|
|
92
|
+
size-capped; the audit auto-log redacts `hf_`/`sk-`/`Bearer` tokens and never
|
|
93
|
+
crashes the CLI on a broken log.
|
|
94
|
+
|
|
15
95
|
## [0.71.2] - 2026-06-01
|
|
16
96
|
|
|
17
97
|
### Added
|
|
@@ -33,6 +33,8 @@ This installs:
|
|
|
33
33
|
pulled in too (since v0.71.0 these are an opt-in extra, not core deps)
|
|
34
34
|
- `cryptography` — `[dev]` also pulls it in (it's the `[sign]` extra) so the
|
|
35
35
|
ed25519 signing tests (`soup adapters sign` / `soup attest`) run in CI
|
|
36
|
+
- `reportlab` — `[dev]` also pulls it in (it's the `[pdf]` extra) so the
|
|
37
|
+
Annex XI/XII PDF tests (`soup train --annex-xi *.pdf`) run in CI
|
|
36
38
|
|
|
37
39
|
### 3. Verify Setup
|
|
38
40
|
|
|
@@ -118,7 +120,7 @@ src/soup_cli/
|
|
|
118
120
|
templates/ - 17 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0)
|
|
119
121
|
ui/ - Web UI (FastAPI + HTML/JS SPA)
|
|
120
122
|
|
|
121
|
-
tests/ - Test suite (
|
|
123
|
+
tests/ - Test suite (274 files, 12474 tests)
|
|
122
124
|
examples/ - Real-world config examples and datasets
|
|
123
125
|
```
|
|
124
126
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soup-cli
|
|
3
|
-
Version: 0.71.
|
|
3
|
+
Version: 0.71.4
|
|
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
|
|
@@ -39,6 +39,8 @@ Requires-Dist: librosa>=0.10.0; extra == 'audio'
|
|
|
39
39
|
Requires-Dist: soundfile>=0.12.0; extra == 'audio'
|
|
40
40
|
Provides-Extra: awq
|
|
41
41
|
Requires-Dist: autoawq>=0.2.0; extra == 'awq'
|
|
42
|
+
Provides-Extra: carbon
|
|
43
|
+
Requires-Dist: codecarbon>=2.0.0; extra == 'carbon'
|
|
42
44
|
Provides-Extra: cce
|
|
43
45
|
Requires-Dist: cut-cross-entropy>=24.10.0; extra == 'cce'
|
|
44
46
|
Provides-Extra: data
|
|
@@ -59,6 +61,7 @@ Requires-Dist: peft>=0.7.0; extra == 'dev'
|
|
|
59
61
|
Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
|
|
60
62
|
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
61
63
|
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
64
|
+
Requires-Dist: reportlab>=4.0.0; extra == 'dev'
|
|
62
65
|
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
63
66
|
Requires-Dist: torch>=2.0.0; extra == 'dev'
|
|
64
67
|
Requires-Dist: transformers<5.0.0,>=4.36.0; extra == 'dev'
|
|
@@ -80,6 +83,8 @@ Requires-Dist: mlx-lm>=0.20.0; extra == 'mlx'
|
|
|
80
83
|
Requires-Dist: mlx>=0.20.0; extra == 'mlx'
|
|
81
84
|
Provides-Extra: onnx
|
|
82
85
|
Requires-Dist: optimum[onnxruntime]>=1.16.0; extra == 'onnx'
|
|
86
|
+
Provides-Extra: pdf
|
|
87
|
+
Requires-Dist: reportlab>=4.0.0; extra == 'pdf'
|
|
83
88
|
Provides-Extra: qat
|
|
84
89
|
Requires-Dist: torchao>=0.4.0; extra == 'qat'
|
|
85
90
|
Provides-Extra: remote
|
|
@@ -178,19 +183,21 @@ infrastructure instead of improving models. Soup fixes that.
|
|
|
178
183
|
|
|
179
184
|
## What's New
|
|
180
185
|
|
|
181
|
-
**v0.71.
|
|
182
|
-
|
|
183
|
-
- **
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
- **
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
186
|
+
**v0.71.4 — Adapter lifecycle + loop wiring.** The merge, PR, and continuous-loop surfaces go live:
|
|
187
|
+
|
|
188
|
+
- **Canary verdict on merge** — `soup adapters merge … --canary suite.json` scores the merged
|
|
189
|
+
adapter and reports **OK / MINOR / MAJOR**; `--strict-verdict` exits non-zero on a MAJOR
|
|
190
|
+
regression. Works with no model load using a pre-scored canary suite.
|
|
191
|
+
- **Evolutionary merge for real** — `soup adapters merge --strategy cmaes --eval suite --budget 1h`
|
|
192
|
+
now runs the full CMA-ES search (merge → score → optimise) and writes the best blend, instead of
|
|
193
|
+
just printing a plan.
|
|
194
|
+
- **Publish an adapter PR** — `soup adapters pr <title> --base-sha <hex> --adapter <path> --push
|
|
195
|
+
owner/repo#42` posts the rendered PR straight to a GitHub PR comment.
|
|
196
|
+
- **Continuous fine-tuning loop, wired up** — `soup loop watch --pre-wired` runs the real
|
|
197
|
+
traces → DPO → eval-gate → canary pipeline; `--pack-cans` snapshots every iteration as a
|
|
198
|
+
shareable Soup Can with Registry lineage (`soup loop replay <id> --extract dir`).
|
|
199
|
+
- **Branches ↔ Registry** — `soup adapters branch <name> --attach-to-registry <id>` /
|
|
200
|
+
`--from-registry <id>` links training-env snapshots into the Registry lineage DAG.
|
|
194
201
|
|
|
195
202
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
196
203
|
|
|
@@ -49,19 +49,21 @@ 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.4 — Adapter lifecycle + loop wiring.** The merge, PR, and continuous-loop surfaces go live:
|
|
53
|
+
|
|
54
|
+
- **Canary verdict on merge** — `soup adapters merge … --canary suite.json` scores the merged
|
|
55
|
+
adapter and reports **OK / MINOR / MAJOR**; `--strict-verdict` exits non-zero on a MAJOR
|
|
56
|
+
regression. Works with no model load using a pre-scored canary suite.
|
|
57
|
+
- **Evolutionary merge for real** — `soup adapters merge --strategy cmaes --eval suite --budget 1h`
|
|
58
|
+
now runs the full CMA-ES search (merge → score → optimise) and writes the best blend, instead of
|
|
59
|
+
just printing a plan.
|
|
60
|
+
- **Publish an adapter PR** — `soup adapters pr <title> --base-sha <hex> --adapter <path> --push
|
|
61
|
+
owner/repo#42` posts the rendered PR straight to a GitHub PR comment.
|
|
62
|
+
- **Continuous fine-tuning loop, wired up** — `soup loop watch --pre-wired` runs the real
|
|
63
|
+
traces → DPO → eval-gate → canary pipeline; `--pack-cans` snapshots every iteration as a
|
|
64
|
+
shareable Soup Can with Registry lineage (`soup loop replay <id> --extract dir`).
|
|
65
|
+
- **Branches ↔ Registry** — `soup adapters branch <name> --attach-to-registry <id>` /
|
|
66
|
+
`--from-registry <id>` links training-env snapshots into the Registry lineage DAG.
|
|
65
67
|
|
|
66
68
|
Full history: [CHANGELOG.md](CHANGELOG.md) · [GitHub Releases](https://github.com/MakazhanAlpamys/Soup/releases).
|
|
67
69
|
|
|
@@ -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)
|
|
@@ -275,6 +309,9 @@ Share a reproducible recipe as a single `.can` file — a tarball of the manifes
|
|
|
275
309
|
# Pack a registry entry into a .can
|
|
276
310
|
soup can pack --entry-id llama31-chat-v1 --out ./llama31-chat.can
|
|
277
311
|
|
|
312
|
+
# Embed in-toto attestations into the manifest (v3 cans; repeatable)
|
|
313
|
+
soup can pack --entry-id llama31-chat-v1 --out ./signed.can --attest att.json
|
|
314
|
+
|
|
278
315
|
# Preview the manifest without extracting
|
|
279
316
|
soup can inspect ./llama31-chat.can
|
|
280
317
|
|
|
@@ -358,29 +395,45 @@ Render an EU AI Act Annex XI (technical documentation, Sections 1+2) or Annex XI
|
|
|
358
395
|
(Article 53(1)(d) public training summary) directly from a training run:
|
|
359
396
|
|
|
360
397
|
```bash
|
|
361
|
-
soup train --config soup.yaml --annex-xi annex.md
|
|
398
|
+
soup train --config soup.yaml --annex-xi annex.md # markdown
|
|
399
|
+
soup train --config soup.yaml --annex-xi annex.pdf # PDF (pip install soup-cli[pdf])
|
|
400
|
+
soup train --config soup.yaml --track-energy --annex-xi annex.md # + measured kWh/CO2
|
|
362
401
|
```
|
|
363
402
|
|
|
364
403
|
Top-10 domains by share, modality breakdown, training compute / kWh / CO₂, model
|
|
365
|
-
description, base model, run id.
|
|
366
|
-
|
|
367
|
-
|
|
404
|
+
description, base model, run id. A `.pdf` output path renders a reportlab PDF (a `.md`
|
|
405
|
+
path renders markdown). The **top crawled domains** are auto-extracted from the training
|
|
406
|
+
JSONL (`cfg.data.train`). With `--track-energy`, the measured energy is recorded in the
|
|
407
|
+
doc. Operator-controlled fields are escape-neutralised (`|[](){}!<>` + newline / CR / tab)
|
|
408
|
+
so a malicious model name can't inject a forged heading into downstream renderers.
|
|
409
|
+
|
|
410
|
+
### Energy & CO₂ measurement (`--track-energy`)
|
|
411
|
+
|
|
412
|
+
`soup train --track-energy` wraps the training window in a codecarbon **offline** tracker
|
|
413
|
+
(no IP-geolocation network call). It reports kWh / CO₂ / grid intensity and feeds them into
|
|
414
|
+
`--annex-xi`. `--energy-country <ISO3>` picks the grid for the CO₂ estimate (default `USA`;
|
|
415
|
+
the kWh figure itself is country-independent). Requires `pip install soup-cli[carbon]`;
|
|
416
|
+
without it, `--track-energy` is a graceful no-op.
|
|
368
417
|
|
|
369
418
|
|
|
370
419
|
## Audit Log (`soup audit-log`)
|
|
371
420
|
|
|
372
|
-
|
|
373
|
-
via `SOUP_AUDIT_LOG_PATH`, containment-checked to
|
|
421
|
+
**Every `soup` command** now appends one HIPAA/SOC2-shaped record to the JSONL audit log at
|
|
422
|
+
`~/.soup/audit.jsonl` (override via `SOUP_AUDIT_LOG_PATH`, containment-checked to
|
|
423
|
+
`$HOME / $CWD / $TMPDIR`). Opt out per-invocation with `soup --no-audit-log <cmd>` or
|
|
424
|
+
globally with `SOUP_NO_AUDIT_LOG=1`. Tail or rotate:
|
|
374
425
|
|
|
375
426
|
```bash
|
|
376
427
|
soup audit-log tail --limit 50 # Rich table view
|
|
377
428
|
soup audit-log tail --json # raw JSONL for SIEM ingestion
|
|
378
429
|
soup audit-log rotate --cap-mb 100 # force a rotation pass
|
|
430
|
+
soup --no-audit-log version # skip the audit line for this command
|
|
379
431
|
```
|
|
380
432
|
|
|
381
433
|
PII redaction across **every** string field (`hf_*` / `sk-*` / `Bearer …` → `<redacted>`)
|
|
382
434
|
via the v0.40.3 `_SECRET_RE` policy. POSIX `O_NOFOLLOW` + `0o600` perms, atomic-append,
|
|
383
|
-
rotation at 100 MiB with symlink rejection at the backup path.
|
|
435
|
+
rotation at 100 MiB with symlink rejection at the backup path. The auto-instrumentation is
|
|
436
|
+
best-effort — a broken audit log never crashes the CLI.
|
|
384
437
|
|
|
385
438
|
|
|
386
439
|
## Reproducibility Receipt (`soup train --repro-receipt`)
|
|
@@ -490,7 +543,16 @@ merge with exit 3 unless you pass `--allow-unscanned`.
|
|
|
490
543
|
|
|
491
544
|
Single signed tarball with model + datasets + wheels + CUDA kernels +
|
|
492
545
|
embedded `manifest.json` listing SHA-256 per file. Sized for one-way
|
|
493
|
-
physical-media transfer through a data diode.
|
|
546
|
+
physical-media transfer through a data diode. A reproducibility receipt is
|
|
547
|
+
embedded as a top-level `repro-receipt.json` when you pass
|
|
548
|
+
`--repro-receipt <receipt.json>` (or auto-detected from
|
|
549
|
+
`<model>/repro-receipt.json`):
|
|
550
|
+
|
|
551
|
+
```bash
|
|
552
|
+
soup airgap-bundle --model ./out --output bundle.tar --repro-receipt repro.json
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
Default 100 GiB cap;
|
|
494
556
|
refuses oversize. Deterministic dataset labeling by sorted basename
|
|
495
557
|
(NOT argv order) so the same inputs in different argv order produce
|
|
496
558
|
identical manifests. TOCTOU defence: `os.lstat + S_ISLNK` re-check on
|
|
@@ -109,12 +109,12 @@ soup cost --config soup.yaml --gpu H100 Estimate training cost for specific
|
|
|
109
109
|
soup adapters list ./output/ Scan for LoRA adapters
|
|
110
110
|
soup adapters info ./output/checkpoint-500/ Show adapter metadata
|
|
111
111
|
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]
|
|
112
|
+
soup loop init <model> --eval <s> --baseline <b> [--pre-wired] Create .soup/loop.yaml (data flywheel; --pre-wired = real stages)
|
|
113
|
+
soup loop status Counters + status + pre_wired flag
|
|
114
|
+
soup loop watch [--detach] [--max-iter N] [--pre-wired] [--pack-cans] Harvest → train → gate → deploy daemon (pre-wired stages + Soup Can packing)
|
|
115
115
|
soup loop pause / soup loop resume Atomic status flip
|
|
116
116
|
soup loop canary <adapter> --traffic 5% Promote canary + auto-rollback on MAJOR
|
|
117
|
-
soup loop replay [<iter-id>]
|
|
117
|
+
soup loop replay [<iter-id>] [--extract <dir>] Replay / unpack a recorded iteration manifest
|
|
118
118
|
soup serve --model m --adapters chat=./c code=./d Multi-adapter serving
|
|
119
119
|
soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
|
|
120
120
|
soup migrate --from axolotl config.yml Import config from Axolotl
|
|
@@ -157,7 +157,13 @@ soup adapters check-safetensors <adapter> [--strict] Refuse pickle / PyTorch-cl
|
|
|
157
157
|
soup adapters merge ... [--license <id>] [--license-override <reason>] [--allow-unscanned] License + backdoor-scan gates (auto-detect license; scan FAIL refused)
|
|
158
158
|
soup attest emit ... [--sign ed25519 --key <pem>] [-o att.json] in-toto/SLSA-3 attestation (+ .sig sidecar)
|
|
159
159
|
soup attest verify <statement> --signature <sig> [--public-key <pem>] Verify ed25519 attestation signature
|
|
160
|
-
soup airgap-bundle --model <m> --output <out.tar> Signed tarball for data-diode transfer
|
|
160
|
+
soup airgap-bundle --model <m> --output <out.tar> [--repro-receipt <r.json>] Signed tarball for data-diode transfer (embeds repro-receipt)
|
|
161
|
+
soup train --config soup.yaml --annex-xi <out.md|out.pdf> EU AI Act Annex XI/XII doc (markdown or PDF; top_domains auto-filled)
|
|
162
|
+
soup train --config soup.yaml --track-energy [--energy-country USA] codecarbon offline kWh/CO2 → annex-xi (pip install soup-cli[carbon])
|
|
163
|
+
soup train --config soup.yaml --repro-receipt <out.json> SR 11-7 reproducibility receipt
|
|
164
|
+
soup can pack --entry-id <id> --out r.can --attest <statement.json> Embed in-toto Statements into a v3 can manifest
|
|
165
|
+
soup audit-log tail / rotate Tail / rotate the per-command HIPAA/SOC2 audit log (~/.soup/audit.jsonl)
|
|
166
|
+
soup --no-audit-log <cmd> / SOUP_NO_AUDIT_LOG=1 Opt out of the per-command audit line
|
|
161
167
|
soup eval unlearning <run-id> --benchmark tofu|muse|wmdp Forget Quality + Model Utility + PrivLeak verdict
|
|
162
168
|
soup edit set --base <m> --method rome|memit|alphaedit --subject "..." --target "..." Surgical knowledge edit (--plan-only available)
|
|
163
169
|
soup edit diff <before-run> <after-run> --probes p.jsonl Knowledge-injection diff visualizer
|
|
@@ -182,8 +188,11 @@ soup probe interference <losses.json> [--output o.json] Pairwise N×N adapter i
|
|
|
182
188
|
soup probe pack <base> [--output o.json] Per-base calibrated probe pack manifest (v0.66.0)
|
|
183
189
|
soup probe pack --list List bundled probe-pack bases (v0.66.0)
|
|
184
190
|
soup adapters blame ... --top-k 50 Live DataInf-style influence runner (v0.66.0, closes #171)
|
|
185
|
-
soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge (v0.67.0)
|
|
191
|
+
soup adapters merge ... --strategy cmaes --eval <s> --budget 1h CMA-ES evolutionary merge — live loop (v0.67.0 schema / v0.71.4 live)
|
|
192
|
+
soup adapters merge ... --canary <suite.json> [--strict-verdict] Live OK/MINOR/MAJOR canary verdict, exit 2 on MAJOR (v0.71.4)
|
|
186
193
|
soup adapters pr <title> --base-sha <hex> --adapter <path> GitHub-shaped adapter PR Markdown / JSON (v0.67.0)
|
|
194
|
+
soup adapters pr <title> ... --push owner/repo#N Post the PR as a GitHub comment via gh api (v0.71.4)
|
|
195
|
+
soup adapters branch <name> --from-registry <id> | --attach-to-registry <id> Branch ↔ Registry lineage (v0.71.4)
|
|
187
196
|
soup adapters bisect <ckpt>... --eval-command "..." Binary search over training history (v0.67.0)
|
|
188
197
|
soup lock write --base-sha <h> --dataset-sha <h> --env-hash <h> Write soup.lock (v0.67.0)
|
|
189
198
|
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)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "soup-cli"
|
|
7
|
-
version = "0.71.
|
|
7
|
+
version = "0.71.4"
|
|
8
8
|
description = "Fine-tune LLMs in one command. No SSH, no config hell."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -54,7 +54,7 @@ wandb = ["wandb>=0.15.0,<0.18.0"]
|
|
|
54
54
|
# Self-references `[train]` so CI / contributors get the full training stack
|
|
55
55
|
# (CI runs `pip install -e ".[dev]"`; without this every test would fail at
|
|
56
56
|
# `import torch`).
|
|
57
|
-
dev = ["soup-cli[train]", "cryptography>=41.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
|
|
57
|
+
dev = ["soup-cli[train]", "cryptography>=41.0.0", "reportlab>=4.0.0", "pytest>=7.0", "ruff>=0.1.0", "pytest-cov>=4.0", "httpx>=0.24.0", "mypy>=1.8.0", "pre-commit>=3.5.0"]
|
|
58
58
|
ui = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
59
59
|
serve = ["fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
60
60
|
serve-fast = ["vllm>=0.4.0", "fastapi>=0.104.0", "uvicorn>=0.24.0"]
|
|
@@ -89,6 +89,11 @@ data-pro = ["langdetect>=1.0.9", "presidio-analyzer>=2.2.0"]
|
|
|
89
89
|
# adapters sign`. Pure-offline; Sigstore keyless (OIDC + Fulcio/Rekor network)
|
|
90
90
|
# stays infra-blocked and is NOT bundled here.
|
|
91
91
|
sign = ["cryptography>=41.0.0"]
|
|
92
|
+
# v0.71.3 #181 — reportlab PDF rendering for `soup train --annex-xi *.pdf`.
|
|
93
|
+
pdf = ["reportlab>=4.0.0"]
|
|
94
|
+
# v0.71.3 #180 — codecarbon offline energy/CO2 measurement for
|
|
95
|
+
# `soup train --track-energy` (offline; no IP-geolocation network call).
|
|
96
|
+
carbon = ["codecarbon>=2.0.0"]
|
|
92
97
|
|
|
93
98
|
[project.scripts]
|
|
94
99
|
soup = "soup_cli.cli:run"
|
|
@@ -29,6 +29,7 @@ def _add_text(tar: tarfile.TarFile, name: str, content: str) -> None:
|
|
|
29
29
|
def pack_entry(
|
|
30
30
|
*, entry_id: str, out_path: str, author: str = "unknown",
|
|
31
31
|
description: Optional[str] = None,
|
|
32
|
+
attestations: Optional[list[dict]] = None,
|
|
32
33
|
) -> Path:
|
|
33
34
|
"""Pack a registry entry as a ``.can`` tarball.
|
|
34
35
|
|
|
@@ -38,6 +39,8 @@ def pack_entry(
|
|
|
38
39
|
at call time.
|
|
39
40
|
author: author handle baked into the manifest.
|
|
40
41
|
description: optional free-form description.
|
|
42
|
+
attestations: optional list of embedded in-toto Statements (v0.71.3
|
|
43
|
+
#182). Each is shape-validated by the manifest schema.
|
|
41
44
|
|
|
42
45
|
Returns:
|
|
43
46
|
The absolute path to the written file.
|
|
@@ -66,6 +69,7 @@ def pack_entry(
|
|
|
66
69
|
base_hash=entry.get("entry_hash", ""),
|
|
67
70
|
description=description or entry.get("notes"),
|
|
68
71
|
tags=list(entry.get("tags", [])),
|
|
72
|
+
attestations=list(attestations or []),
|
|
69
73
|
)
|
|
70
74
|
|
|
71
75
|
out.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -2,18 +2,48 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import re
|
|
6
7
|
from typing import Literal, Optional
|
|
7
8
|
|
|
8
9
|
from pydantic import BaseModel, Field, field_validator
|
|
9
10
|
|
|
10
|
-
CAN_FORMAT_VERSION =
|
|
11
|
-
SUPPORTED_CAN_FORMAT_VERSIONS = (1, 2)
|
|
11
|
+
CAN_FORMAT_VERSION = 3 # v0.71.3 #182: attestations field (additive over v2)
|
|
12
|
+
SUPPORTED_CAN_FORMAT_VERSIONS = (1, 2, 3)
|
|
12
13
|
|
|
13
14
|
_NAME_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_\-.]{0,127}$")
|
|
14
15
|
_HF_NAME_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_\-./]{0,127}$")
|
|
15
16
|
_HF_REPO_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_\-.]{0,95}/[A-Za-z0-9][A-Za-z0-9_\-.]{0,95}$")
|
|
16
17
|
|
|
18
|
+
# v0.71.3 #182 — caps on embedded in-toto attestations.
|
|
19
|
+
_MAX_ATTESTATIONS = 64
|
|
20
|
+
_MAX_ATTESTATION_BYTES = 1024 * 1024 # 1 MiB per statement
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def validate_attestation_statement(stmt: object) -> dict:
|
|
24
|
+
"""Validate one embedded in-toto Statement dict (v0.71.3 #182).
|
|
25
|
+
|
|
26
|
+
Shape-only: must be a dict carrying ``_type`` (str) and ``predicateType``
|
|
27
|
+
(str), and serialise to <= 1 MiB. Returns the statement unchanged.
|
|
28
|
+
"""
|
|
29
|
+
if not isinstance(stmt, dict):
|
|
30
|
+
raise ValueError("attestation must be a dict (in-toto Statement)")
|
|
31
|
+
type_field = stmt.get("_type")
|
|
32
|
+
predicate_type = stmt.get("predicateType")
|
|
33
|
+
if not isinstance(type_field, str) or not type_field:
|
|
34
|
+
raise ValueError("attestation missing a non-empty '_type' string")
|
|
35
|
+
if not isinstance(predicate_type, str) or not predicate_type:
|
|
36
|
+
raise ValueError("attestation missing a non-empty 'predicateType' string")
|
|
37
|
+
try:
|
|
38
|
+
size = len(json.dumps(stmt).encode("utf-8"))
|
|
39
|
+
except (TypeError, ValueError) as exc:
|
|
40
|
+
raise ValueError(f"attestation is not JSON-serialisable: {exc}") from exc
|
|
41
|
+
if size > _MAX_ATTESTATION_BYTES:
|
|
42
|
+
raise ValueError(
|
|
43
|
+
f"attestation too large ({size} > {_MAX_ATTESTATION_BYTES} bytes)"
|
|
44
|
+
)
|
|
45
|
+
return stmt
|
|
46
|
+
|
|
17
47
|
|
|
18
48
|
class DeployTarget(BaseModel):
|
|
19
49
|
"""One declarative deploy target embedded in a can manifest (v2+).
|
|
@@ -116,6 +146,23 @@ class Manifest(BaseModel):
|
|
|
116
146
|
default_factory=list,
|
|
117
147
|
description="Optional declarative deploy targets (v2+)",
|
|
118
148
|
)
|
|
149
|
+
attestations: list[dict] = Field(
|
|
150
|
+
default_factory=list,
|
|
151
|
+
description="Optional embedded in-toto Statements (v3+)",
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
@field_validator("attestations", mode="before")
|
|
155
|
+
@classmethod
|
|
156
|
+
def _valid_attestations(cls, value: object) -> list[dict]:
|
|
157
|
+
if value is None:
|
|
158
|
+
return []
|
|
159
|
+
if not isinstance(value, list):
|
|
160
|
+
raise ValueError("attestations must be a list of in-toto Statements")
|
|
161
|
+
if len(value) > _MAX_ATTESTATIONS:
|
|
162
|
+
raise ValueError(
|
|
163
|
+
f"too many attestations ({len(value)} > {_MAX_ATTESTATIONS})"
|
|
164
|
+
)
|
|
165
|
+
return [validate_attestation_statement(s) for s in value]
|
|
119
166
|
|
|
120
167
|
@field_validator("can_format_version")
|
|
121
168
|
@classmethod
|