{"repo":"MakazhanAlpamys/Soup","free":true,"listed":false,"github":"https://github.com/MakazhanAlpamys/Soup","clone":"git clone https://github.com/MakazhanAlpamys/Soup.git","description":"Fine-tune LLMs from one YAML. Layer streaming trains an 8B model on a 4 GB laptop GPU.","language":"Python","stars":1956,"topics":["cli","consumer-gpu","dpo","fine-tuning","gguf","huggingface","llm","llmops","local-ai","local-llm","lora","low-vram","machine-learning","ollama","peft","python","pytorch","qlora","sft","transformers"],"license":"Apache-2.0","category":"llmops","readme_excerpt":"<p align=\"center\">\n  <img src=\"soup.png\" alt=\"Soup\" width=\"280\">\n</p>\n\n<h1 align=\"center\">Soup</h1>\n\n<p align=\"center\">\n  <strong>Fine-tune and post-train LLMs in one command. No SSH, no config hell.</strong>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://trysoup.dev\">Website</a> &middot;\n  <a href=\"#quick-start\">Quick Start</a> &middot;\n  <a href=\"#configuration\">Config</a> &middot;\n  <a href=\"#documentation\">Docs</a> &middot;\n  <a href=\"docs/commands.md\">Commands</a> &middot;\n  <a href=\"docs/models.md\">Models</a> &middot;\n  <a href=\"https://discord.gg/8RgVbFA6Zq\">Discord</a> &middot;\n  <a href=\"https://www.producthunt.com/products/soup-cli\">Product Hunt</a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://pypi.org/project/soup-cli/\"><img src=\"https://img.shields.io/pypi/v/soup-cli?color=blue\" alt=\"PyPI\"></a>\n  <a href=\"https://pepy.tech/project/soup-cli\"><img src=\"https://img.shields.io/pepy/dt/soup-cli?color=blue\" alt=\"Downloads\"></a>\n  <img src=\"https://img.shields.io/badge/python-3.10--3.12-blue\" alt=\"Python 3.10-3.12\">\n  <img src=\"https://img.shields.io/badge/license-Apache--2.0-blue\" alt=\"Apache-2.0 License\">\n  <a href=\"https://github.com/MakazhanAlpamys/Soup/actions\"><img src=\"https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/MakazhanAlpamys/65fdc943f85f3b2c46ecddb415c2b779/raw/soup_tests.json\" alt=\"Tests\"></a>\n  <a href=\"https://github.com/MakazhanAlpamys/Soup/actions\"><img src=\"https://github.com/MakazhanAlpamys/Soup/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"></a>\n  <a href=\"https://trysoup.dev\"><img src=\"https://img.shields.io/badge/website-trysoup.dev-blue\" alt=\"Website\"></a>\n  <a href=\"https://discord.gg/8RgVbFA6Zq\"><img src=\"https://img.shields.io/badge/Discord-join-5865F2?logo=discord&logoColor=white\" alt=\"Discord\"></a>\n  <a href=\"https://doi.org/10.5281/zenodo.21771064\"><img src=\"https://img.shields.io/badge/DOI-10.5281%2Fzenodo.21771064-blue?logo=zenodo&logoColor=white\" alt=\"DOI: 10.5281/zenodo.21771064\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.producthunt.com/products/soup-cli?embed=true&amp;utm_source=badge-featured&amp;utm_medium=badge&amp;utm_campaign=badge-soup-cli\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1217869&amp;theme=dark\">\n      <img src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1217869&amp;theme=light\" alt=\"Soup CLI - Fine-tune an 8B LLM on a 4 GB laptop GPU | Product Hunt\" width=\"250\" height=\"54\">\n    </picture>\n  </a>\n</p>\n\n---\n\nSoup turns the pain of LLM fine-tuning into a simple workflow. One config, one command, done.\n\n```bash\npip install \"soup-cli[train]\"   # add [train] to fine-tune; bare `soup-cli` is the light CLI\nsoup init --template chat\nsoup train\n```\n\n**Fine-tune an 8B model on a 4 GB laptop GPU.** Layer streaming keeps the frozen base out of\nVRAM and feeds it to the GPU one decoder layer at a time. Measured on an RTX 3050 Laptop 4 GB:\nLlama-3.1-8B-Instruct + NF4 at **119.6 tok/s, 3.32 GB peak** — bit-exact against a normal\nresident run, and reproduced independently on an H100 at 113.00 tok/s in the same 3.32 GB.\n(The tok/s figure was measured on v0.72.2, before the v0.73.0 correctness repair that cost\n−4.8% at 32B; it has not been re-run on a 4 GB card since.) Opt-in (`stream_layers: true`)\nand still BETA —\n[how it works](docs/performance-and-quantization.md#layer-streaming-beta-v0720-nf4-v0722-disk--wider-archs-v0723-preference-losses-v0724) ·\n[all measurements](benchmarks/) · [paper](https://doi.org/10.5281/zenodo.21771064) ·\n**[check it yourself on a free Colab T4](notebooks/proof-4gb.ipynb)** (caps the process to\n4 GB, then asserts a streamed model is bit-identical to a normal one)\n\n<p align=\"center\">\n  <a href=\"https://youtu.be/T1LCErE943E\"><img src=\"docs/assets/layer-streaming.gif\" alt=\"soup train pre-flight for Llama-3.1-8B on a 4 GB card: a 3.60 GB base store pinned in RAM across 32 layers and two 113 MB VRAM buffers, then a measured peak of 3.32 GB at 119.6 tok/s, stopping short of the 4 GB line\"></a><br>\n  <sub>Llama-3.1-8B-Instruct + NF4, LoRA, batch 1, seq 512 on an RTX 3050 Laptop 4 GB — <b>3.32 GB peak, 119.6 tok/s</b>. <a href=\"https://youtu.be/T1LCErE943E\">Full video (90s)</a></sub>\n</p>\n\n## Why Soup?\n\nTraining LLMs is still painful. Even experienced teams spend 30-50% of their time fighting\ninfrastructure instead of improving models. Soup fixes that.\n\n- **Zero SSH.** Never SSH into a broken GPU box again.\n- **One config.** A simple YAML file is all you need.\n- **Auto everything.** Batch size, GPU detection, quantization — handled.\n- **Works locally.** Train on your own GPU with QLoRA. No cloud required.\n\n## What's New\n\n**v0.73.2 — the release gate stops lying in both directions.** `soup ship` answers one\nquestion: did this model get better, or did I break it? Two of its suites were ranking by\nthe wrong thing, and one whole failure direction had no detector at all.\n\n- **A suite scored 0.225 for a model that got it right 40/40.** `mini_tool_call` was\n  ranking *brace hygiene*: the model emitted one closing brace short, so the parse fell\n  back to the inner object and the scorer rejected it for lacking the outer key. And\n  `mini_mmlu` scored Llama-3.1-8B at **0.423 — below a 0.5B** — because the extractor did\n  not know `\\boxed{C}` and the prompt never asked for a letter. Both fixed; 0.423 → 0.731.\n- **New: a benign-prompt axis.** Leg 2 flagged a *drop* in refusal rate and had no reverse,\n  so a tune that refuses everything read as a monotone safety improvement. Two models with\n  byte-identical scores on all seven shipped suites, one of which refuses every benign\n  request, were indistinguishable to the gate. `mini_over_refusal` is its mirror; paired\n  with the safety suite, neither can be gamed alone.\n- **New: `soup ship --noise-floor N`** re-runs the base model N times and refuses to call\n  any delta smaller than the measured spread significant. Greedy decoding is not\n  deterministic on GPU — same model, no adapter, five runs spread **0.015–0.020** against a\n  0.05 threshold, and four of six paired deltas in that session sat inside the floor. It\n  **sizes** the effect; it does not calibrate a threshold, and the release says so.\n- **A caller error was indistinguishable from a regression.** A non-callable generator\n  scored `0.0` on three suites and raised on the others — and in leg 2 a 0.0 reads as\n  \"failed every item\", i.e. it failed in the direction that looks like a finding.\n- Also: `soup data split --stratify-semantic` (#388) and `soup mcp serve --allow-execute`\n  (#391), both from outside contributors.\n\nThe measurement record for the previous release's VRAM work, published as written —\nincluding the **three readings withdrawn during it** — is\n[`benchmarks/gate-v0.73.1-measured-vram-fit.md`](benchmarks/gate-v0.73.1-measured-vram-fit.md).\n\n```yaml\n# soup.yaml — then just `soup train --config soup.yaml`\ntraining:\n  stream_layers: true      # base streams out of VRAM; only the adapter trains\n  quantization: 4bit       # NF4 — ~4x smaller store, so 8B fits a 4 GB card\n  batch_size: 4            # bigger batches amortise the weight read\n  stream_source: auto      # RAM when it fits, NVMe disk when it does not\n  seed: 1234               # new in v0.73.0\n```\n\n> Python **3.10–3.12** only. v0.73.0 adds the upper bound that was missing: on 3.13+, pip\n> used to resolve untested PyTorch wheels that crash in the native extension before Soup\n> runs at all.\n\n<details>\n<summary>Previous release — v0.72.4, align on a laptop (DPO / ORPO / SimPO / KTO over layer streaming)</summary>\n\nLayer streaming used to support supervised fine-tuning only; v0.72.4 opened it to the\npreference losses. The risk was one thing: DPO needs a reference model, and a second copy\nwould double memory and defeat the point. Soup uses *the same streamed base with its\nadapters switched off* — measured at **0.914×** the SFT peak, where forcing a real second\ninstance cost **+730 MB, exactly one copy of the weights**. Bit-exact against a normal\nnon-streamed run for all four. Honest cost: free in *memory*, not in *time* — DPO reads the\nlayer stack **1.52×** as often per step. `grpo` / `ppo` stay excluded on purpose.\n\n> **Trained with `stream_layers: true` on v0.72.0?** That adapter is inert — its tensors were\n> saved under keys with an extra `.inner.` segment, so every loader returned the untuned base.\n> Fixed in v0.72.1; re-run or re-save. Check with:\n> `python -c \"from safetensors.torch import load_file; print([k for k in load_file('adapter_model.safetensors') if '.inner.' in k][:3])\"`\n\n</details>\n\n<details>\n<summary>Previous release — v0.71.40, soup reward synth (generate a reward verifier from your data)</summary>\n\nPoint `soup reward synth` at a JSONL of reference outputs and it infers a deterministic verifier,\nwrites a readable / committable `.py` reward function, and — the part nobody else does — *refuses* to\nemit one that can't tell your references from bad answers (four families: `numeric` / `json_schema` /\n`regex` / `tool_call`; a mandatory calibration report is the moat). Reward ensembles\n(`reward_fn: \"accuracy,format\"`) also train now. (#311)\n\n```bash\nsoup reward synth references.jsonl -o reward.py --output-report calib.json\n```\n\n</details>\n\n<details>\n<summary>Previous release — v0.71.39, CI for weights not prompts (emit + provenance-bind the ship verdict)</summary>\n\n`soup ship`'s verdict became emittable, committable, and provenance-bound: `--emit-evidence` makes a\nrun replay into an identical verdict, `eval.ship` in `soup.yaml` + `--config` makes the gate policy\nreviewable, and `--config` binds evidence to the exact recipe that produced it (stale evidence → exit 3).\n`soup ship --push owner/repo#N` posts the SHIP / DON'T-SHIP card on the PR.\n\n</details>\n\n<details>\n<summary>Previous release — v0.71.38, The gate grows teeth (real leg-2 regression gate)</summary>\n\n`soup ship`'s regression leg became real: a fixed, extraction-ba","default_branch":"main","files":969,"tree":[".dockerignore",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.yml",".github/ISSUE_TEMPLATE/config.yml",".github/ISSUE_TEMPLATE/feature_request.yml",".github/pull_request_template.md",".github/workflows/ci.yml",".github/workflows/docker.yml",".github/workflows/publish.yml",".github/workflows/recipe-validation.yml",".gitignore",".mailmap",".pre-commit-config.yaml","AGENTS.md","CHANGELOG.md","CODEOWNERS","CODE_OF_CONDUCT.md","CONTRIBUTING.md","CONTRIBUTORS.md","Dockerfile","LICENSE","NOTICE","README.md","SECURITY.md","benchmarks/README.md","benchmarks/gate-h100-validation.md","benchmarks/gate-v0.72.0-layer-streaming.md","benchmarks/gate-v0.72.2-nf4.md","benchmarks/gate-v0.72.3-breadth.md","benchmarks/gate-v0.72.4-preference-losses.md","benchmarks/gate-v0.73.1-measured-vram-fit.md","benchmarks/gate-v0.73.2-leg2-scoring.md","benchmarks/harness/issue331_qlora_scope.py","benchmarks/probe-v0.73.0-what-bounds-streaming.md","benchmarks/run-t4-colab-free-tier.md","docker-compose.yml","docs/README.md","docs/adapters-and-governance.md","docs/assets/layer-streaming.gif","docs/backends-and-ops.md","docs/commands.md","docs/compliance.md","docs/data.md","docs/evaluation.md","docs/models.md","docs/peft-and-efficiency.md","docs/performance-and-quantization.md","docs/serving-and-export.md","docs/training.md","examples/README.md","examples/configs/dpo_chat.yaml","examples/configs/dpo_example.yaml","examples/configs/grpo_reasoning.yaml","examples/configs/rlhf_step1_sft.yaml","examples/configs/rlhf_step2_reward.yaml","examples/configs/rlhf_step3_ppo.yaml","examples/configs/sft_basic.yaml","examples/configs/vision_llama.yaml","examples/data/README.md","examples/data/alpaca_tiny.jsonl","examples/data/chat_preferences.jsonl","examples/data/dpo_sample.jsonl","examples/data/reasoning_math.jsonl","examples/reward_hacking/rewards.py","examples/synthetic_workflow.md","examples/synthetic_workflow.yaml","notebooks/proof-4gb.ipynb","pyproject.toml","soup.png","soup_logo_svg.svg","src/soup_cli/__init__.py","src/soup_cli/__main__.py","src/soup_cli/autopilot/__init__.py","src/soup_cli/autopilot/analyzer.py","src/soup_cli/autopilot/decisions.py","src/soup_cli/autopilot/generate_config.py","src/soup_cli/cans/__init__.py","src/soup_cli/cans/pack.py","src/soup_cli/cans/publish.py","src/soup_cli/cans/run.py","src/soup_cli/cans/schema.py","src/soup_cli/cans/unpack.py","src/soup_cli/cans/verify.py","src/soup_cli/cli.py","src/soup_cli/cloud/__init__.py","src/soup_cli/cloud/modal.py","src/soup_cli/commands/__init__.py","src/soup_cli/commands/_eval_v0550.py","src/soup_cli/commands/_eval_v0610.py","src/soup_cli/commands/_eval_v0650.py","src/soup_cli/commands/_eval_v07110.py","src/soup_cli/commands/_webhook_cli.py","src/soup_cli/commands/ab.py","src/soup_cli/commands/active_sample.py","src/soup_cli/commands/adapters.py","src/soup_cli/commands/advise.py","src/soup_cli/commands/agent.py","src/soup_cli/commands/airgap.py","src/soup_cli/commands/apple_adapter.py","src/soup_cli/commands/attest.py","src/soup_cli/commands/audit_log.py","src/soup_cli/commands/autopilot.py","src/soup_cli/commands/bench.py","src/soup_cli/commands/bom.py","src/soup_cli/commands/build.py","src/soup_cli/commands/can.py","src/soup_cli/commands/card.py","src/soup_cli/commands/chat.py","src/soup_cli/commands/ci.py","src/soup_cli/commands/compile_cmd.py","src/soup_cli/commands/compile_tools.py","src/soup_cli/commands/completions.py","src/soup_cli/commands/cost.py","src/soup_cli/commands/data.py","src/soup_cli/commands/data_canary.py","src/soup_cli/commands/data_doctor.py","src/soup_cli/commands/data_forge.py","src/soup_cli/commands/data_mix.py","src/soup_cli/commands/data_score.py","src/soup_cli/commands/data_topics.py","src/soup_cli/commands/delinearize_llama4.py","src/soup_cli/commands/deploy.py","src/soup_cli/commands/diagnose.py","src/soup_cli/commands/diff.py","src/soup_cli/commands/distill_prompt.py","src/soup_cli/commands/doctor.py","src/soup_cli/commands/draft.py","src/soup_cli/commands/drift_alarm.py","src/soup_cli/commands/edit.py","src/soup_cli/commands/env.py","src/soup_cli/commands/eval.py","src/soup_cli/commands/expect.py","src/soup_cli/commands/export.py","src/soup_cli/commands/fetch.py","src/soup_cli/commands/generate.py","src/soup_cli/commands/history.py","src/soup_cli/commands/infer.py","src/soup_cli/commands/ingest.py","src/soup_cli/commands/init.py","src/soup_cli/commands/iterative_dpo.py","src/soup_cli/commands/license_advisor.py","src/soup_cli/commands/llama.py","src/soup_cli/commands/local_rl.py","src/soup_cli/commands/lock.py","src/soup_cli/commands/loop.py","src/soup_cli/commands/mcp.py","src/soup_cli/commands/merge.py","src/soup_cli/commands/merge_sharded_fsdp_weights.py","src/soup_cli/commands/migrate.py","src/soup_cli/commands/monitor.py","src/soup_cli/commands/plan.py","src/soup_cli/commands/plugins.py","src/soup_cli/commands/probe.py","src/soup_cli/commands/profile.py","src/soup_cli/commands/prune_prompt.py","src/soup_cli/commands/push.py","src/soup_cli/commands/quantize.py","src/soup_cli/commands/quickstart.py","src/soup_cli/commands/ra_dit.py","src/soup_cli/commands/recipes.py","src/soup_cli/commands/registry.py","src/soup_cli/commands/reward.py","src/soup_cli/commands/runs.py","src/soup_cli/commands/serve.py","src/soup_cli/commands/ship.py","src/soup_cli/commands/shrink.py","src/soup_cli/commands/spectrum.py","src/soup_cli/commands/steer.py","src/soup_cli/commands/sweep.py","src/soup_cli/commands/tokenizer.py","src/soup_cli/commands/train.py","src/soup_cli/commands/tui.py","src/soup_cli/commands/tunability.py","src/soup_cli/commands/ui.py","src/soup_cli/commands/why.py","src/soup_cli/config/__init__.py","src/soup_cli/config/loader.py","src/soup_cli/config/schema.py","src/soup_cli/data/__init__.py","src/soup_cli/data/_fixtures/alpaca_tiny.jsonl","src/soup_cli/data/_fixtures/behavior/elephant.jsonl","src/soup_cli/data/_fixtures/behavior/harmbench.jsonl","src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl","src/soup_cli/data/_fixtures/behavior/syceval.jsonl","src/soup_cli/data/_fixtures/behavior/xstest.jsonl","src/soup_cli/data/_fixtures/chat_preferences.jsonl","src/soup_cli/data/_fixtures/dpo_sample.jsonl","src/soup_cli/data/_fixtures/gate/format_json.jsonl","src/soup_cli/data/_fixtures/gate/over_refusal.jsonl","src/soup_cli/data/_fixtures/gate/safety.jsonl","src/soup_cli/data/_fixtures/gate/tool_call.jsonl","src/soup_cli/data/_fixtures/reasoning_math.jsonl","src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl","src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl","src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl","src/soup_cli/data/augment.py","src/soup_cli/data/chat_templates.py","src/soup_cli/data/collators.py","src/soup_cli/data/formats.py","src/soup_cli/data/loader.py","src/soup_cli/data/loss_mask.py","src/soup_cli/data/providers/__init__.py","src/soup_cli/data/providers/_utils.py","src/soup_cli/data/providers/anthropic.py","src/soup_cli/data/providers/ollama.py","src/soup_cli/data/providers/vllm.py","src/soup_cli/data/sft_format.py","src/soup_cli/data/templates/__init__.py","src/soup_cli/data/templates/code.py","src/soup_cli/data/templates/conversation.py","src/soup_cli/data/templates/preference.py","src/soup_cli/data/templates/qa.py","src/soup_cli/data/templates/reasoning.py","src/soup_cli/data/templates/tool_calling.py","src/soup_cli/data/templates/verifiable.py","src/soup_cli/data/traces/__init__.py","src/soup_cli/data/traces/pair_builder.py","src/soup_cli/data/traces/parsers.py","src/soup_cli/data/traces/quality.py","src/soup_cli/data/validator.py","src/soup_cli/envs/__init__.py","src/soup_cli/envs/_common.py","src/soup_cli/envs/calculator.py","src/soup_cli/envs/guess_number.py","src/soup_cli/envs/retrieval_qa.py","src/soup_cli/eval/__init__.py","src/soup_cli/eval/arena.py","src/soup_cli/eval/benchmarks_v0_43.py","src/soup_cli/eval/calibrate.py","src/soup_cli/eval/checkpoint_intelligence.py","src/soup_cli/eval/custom.py","src/soup_cli/eval/forgetting.py","src/soup_cli/eval/gate.py","src/soup_cli/eval/gate_suites.py","src/soup_cli/eval/human.py","src/soup_cli/eval/judge.py","src/soup_cli/eval/leaderboard.py","src/soup_cli/eval/quant_check.py","src/soup_cli/experiment/__init__.py","src/soup_cli/experiment/tracker.py","src/soup_cli/mcp_server/__init__.py","src/soup_cli/mcp_server/execution.py","src/soup_cli/mcp_server/registry.py","src/soup_cli/mcp_server/server.py","src/soup_cli/migrate/__init__.py","src/soup_cli/migrate/axolotl.py","src/soup_cli/migrate/common.py","src/soup_cli/migrate/llamafactory.py","src/soup_cli/migrate/unsloth.py","src/soup_cli/monitoring/__init__.py","src/soup_cli/monitoring/callback.py","src/soup_cli/monitoring/curriculum_callback.py","src/soup_cli/monitoring/display.py","src/soup_cli/monitoring/grpo_stability_callback.py","src/soup_cli/monitoring/hf_push.py","src/soup_cli/monitoring/plugin_callback.py","src/soup_cli/monitoring/trace_logger.py","src/soup_cli/plugins/__init__.py","src/soup_cli/py.typed","src/soup_cli/recipes/__init__.py","src/soup_cli/recipes/catalog.py","src/soup_cli/registry/__init__.py","src/soup_cli/registry/attach.py","src/soup_cli/registry/diff.py","src/soup_cli/registry/hashing.py","src/soup_cli/registry/store.py","src/soup_cli/templates/__init__.py","src/soup_cli/templates/audio.yaml","src/soup_cli/templates/bco.yaml","src/soup_cli/templates/chat.yaml","src/soup_cli/templates/code.yaml","src/soup_cli/templates/embedding.yaml","src/soup_cli/templates/eu-ai-act.yaml","src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml","src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml","src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json","src/soup_cli/templates/hipaa.yaml","src/soup_cli/templates/ipo.yaml","src/soup_cli/templates/kto.yaml","src/soup_cli/templates/longcontext.yaml","src/soup_cli/templates/manifest.json","src/soup_cli/templates/medical.yaml","src/soup_cli/templates/moe.yaml","src/soup_cli/templates/orpo.yaml","src/soup_cli/templates/pretrain.yaml","src/soup_cli/templates/reasoning.yaml","src/soup_cli/templates/rlhf.yaml","src/soup_cli/templates/simpo.yaml","src/soup_cli/templates/soc2.yaml","src/soup_cli/templates/sr-11-7.yaml","src/soup_cli/templates/tool-calling.yaml","src/soup_cli/templates/vision.yaml","src/soup_cli/trainer/__init__.py","src/soup_cli/trainer/_trl_compat.py","src/soup_cli/trainer/asr.py","src/soup_cli/trainer/bco.py","src/soup_cli/trainer/bitnet.py","src/soup_cli/trainer/classifier.py","src/soup_cli/trainer/distill.py","src/soup_cli/trainer/dpo.py","src/soup_cli/trainer/embedding.py","src/soup_cli/trainer/grpo.py","src/soup_cli/trainer/ipo.py","src/soup_cli/trainer/kto.py","src/soup_cli/trainer/mlx_dpo.py","src/soup_cli/trainer/mlx_grpo.py","src/soup_cli/trainer/mlx_routing.py","src/soup_cli/trainer/mlx_sft.py","src/soup_cli/trainer/mole_routing.py","src/soup_cli/trainer/online_dpo.py","src/soup_cli/trainer/orpo.py","src/soup_cli/trainer/ppo.py","src/soup_cli/trainer/preference.py","src/soup_cli/trainer/pretrain.py","src/soup_cli/trainer/prm.py","src/soup_cli/trainer/raft.py","src/soup_cli/trainer/reward_model.py","src/soup_cli/trainer/rewards.py","src/soup_cli/trainer/sft.py","src/soup_cli/trainer/simpo.py","src/soup_cli/trainer/stream_setup.py","src/soup_cli/trainer/tts.py","src/soup_cli/trainer/unlearn.py","src/soup_cli/tui_app.py","src/soup_cli/ui/__init__.py","src/soup_cli/ui/app.py","src/soup_cli/ui/plugins/__init__.py","src/soup_cli/ui/static/app.js","src/soup_cli/ui/static/index.html","src/soup_cli/ui/static/logo.png","src/soup_cli/ui/static/logo.svg","src/soup_cli/ui/static/style.css","src/soup_cli/utils/__init__.py","src/soup_cli/utils/_eval_text.py","src/soup_cli/utils/ab_test.py","src/soup_cli/utils/activation_offload.py","src/soup_cli/utils/active_sampler.py","src/soup_cli/utils/adapter_arithmetic.py","src/soup_cli/utils/adapter_bisect.py","src/soup_cli/utils/adapter_branch.py","src/soup_cli/utils/adapter_diff.py","src/soup_cli/utils/adapter_fuse.py","src/soup_cli/utils/adapter_merge.py","src/soup_cli/utils/adapter_pr.py","src/soup_cli/utils/adapter_scan.py","src/soup_cli/utils/adapter_sign.py","src/soup_cli/utils/advanced_precision.py","src/soup_cli/utils/advise.py","src/soup_cli/utils/advise_history.py","src/soup_cli/utils/agent_forge.py","src/soup_cli/utils/agent_rollout.py","src/soup_cli/utils/agent_sandbox.py","src/soup_cli/utils/airgap_bundle.py","src/soup_cli/utils/annex_xi.py","src/soup_cli/utils/anthropic_messages.py","src/soup_cli/utils/apple_adapter.py","src/soup_cli/utils/asr_metrics.py","src/soup_cli/utils/attest.py","src/soup_cli/utils/audit_log.py","src/soup_cli/utils/auto_quant.py","src/soup_cli/utils/backend_detect.py","src/soup_cli/utils/batch_probe.py","src/soup_cli/utils/behavior_battery.py","src/soup_cli/utils/best_of_n.py","src/soup_cli/utils/bitnet.py","src/soup_cli/utils/blame.py","src/soup_cli/utils/block_expansion.py","src/soup_cli/utils/bom.py","src/soup_cli/utils/brain_rot.py","src/soup_cli/utils/brain_rot_lang.py","src/soup_cli/utils/build_dag.py","src/soup_cli/utils/canary.py","src/soup_cli/utils/canary_discovery.py","src/soup_cli/utils/canary_router.py","src/soup_cli/utils/capability_suite.py","src/soup_cli/utils/checklist_dsl.py","src/soup_cli/utils/checkpoint_trigger.py","src/soup_cli/utils/ci_workflow.py","src/soup_cli/utils/citation_faithful.py","src/soup_cli/utils/classifier.py","src/soup_cli/utils/cmaes_merge.py","src/soup_cli/utils/compile_tools.py","src/soup_cli/utils/completions.py","src/soup_cli/utils/constants.py","src/soup_cli/utils/convergence.py","src/soup_cli/utils/crash.py","src/soup_cli/utils/cross_doc_attn.py","src/soup_cli/utils/curriculum.py","src/soup_cli/utils/curriculum_dynamic.py","src/soup_cli/utils/cut_ce.py","src/soup_cli/utils/data_doctor.py","src/soup_cli/utils/data_forge.py","src/soup_cli/utils/data_lint.py","src/soup_cli/utils/data_mix.py","src/soup_cli/utils/data_pipeline.py","src/soup_cli/utils/data_score.py","src/soup_cli/utils/deepspeed.py","src/soup_cli/utils/delinearize_llama4.py","src/soup_cli/utils/demo_bundles.py","src/soup_cli/utils/deploy_autopilot.py"],"storefront":"/r/MakazhanAlpamys","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/MakazhanAlpamys/Soup/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}