feat(recipes): add ready-made SFT recipe for Qwen2.5-Coder-7B-Instruct (#285)

* feat(recipes): add qwen2.5-coder-7b-sft recipe to catalog

* test(recipes): update catalog size assertion to 134 in recipe tests

* test(recipes): update version catalog count to 134 in v0.71.24 tests

* docs(contrib): bump recipe count in project structure overview

* docs(commands): update recipe list count reference to 134

* docs(serve): update Web UI recipe count references in serving docs
This commit is contained in:
Salil M 2026-06-28 19:52:29 +05:30 committed by GitHub
parent 6cb2e0201e
commit 14de9ec9d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 39 additions and 10 deletions

View File

@ -110,7 +110,7 @@ src/soup_cli/
experiment/ - SQLite experiment tracking
eval/ - Eval platform (custom tasks, LLM judge, human eval, leaderboard)
migrate/ - Config migration (LLaMA-Factory, Axolotl, Unsloth)
recipes/ - Ready-made configs for popular models (133 recipes)
recipes/ - Ready-made configs for popular models (134 recipes)
autopilot/ - Zero-config decision engine (v0.25.0)
registry/ - Model Registry (hashing, store, diff, attach) (v0.26.0 + v0.33.0)
cans/ - Shareable .can artifact format + run/publish orchestrator (v0.26.0 + v0.33.0)

View File

@ -129,7 +129,7 @@ soup migrate --from llamafactory config.yaml Import config from LLaMA-Factory
soup migrate --from axolotl config.yml Import config from Axolotl
soup migrate --from unsloth notebook.ipynb Import config from Unsloth notebook
soup migrate --from llamafactory c.yaml --dry-run Preview without writing
soup recipes list List all 133 ready-made recipes
soup recipes list List all 134 ready-made recipes
soup recipes show llama3.1-8b-sft Print recipe YAML
soup recipes use llama3.1-8b-sft Copy recipe to soup.yaml
soup recipes search "reasoning" Search by keyword/task/size

View File

@ -418,7 +418,7 @@ soup ui
**Pages:**
- **Dashboard** — view all experiment runs, loss charts, system info, multi-run comparison
- **New Training** — create configs from templates or 133 ready-made recipes, validate, start training with live SSE log streaming and progress bar
- **New Training** — create configs from templates or 134 ready-made recipes, validate, start training with live SSE log streaming and progress bar
- **Data Explorer** — browse and inspect datasets (JSONL, JSON, CSV, Parquet)
- **Model Chat** — chat with streaming responses, configurable temperature/top_p/max_tokens, system prompt, adapter selection, markdown rendering, chat export
@ -427,7 +427,7 @@ soup ui
- **Enhanced Metrics** — 2x2 chart grid (loss, LR, grad_norm, throughput) + GPU memory chart, eval results table
- **Multi-Run Compare** — overlay loss curves from up to 5 runs side-by-side
- **Chat Upgrade** — SSE streaming via proxy, typing indicator, cancel button, markdown renderer (bold, italic, code blocks), chat export as JSON
- **Config Builder** — recipe dropdown (133 recipes), config schema API for dynamic form generation
- **Config Builder** — recipe dropdown (134 recipes), config schema API for dynamic form generation
**Security:** The Web UI generates a random auth token at startup (printed to console). All mutating endpoints (start/stop training, delete runs, inspect data, validate config) require `Authorization: Bearer <token>` header. CORS is restricted to the served origin. Data inspection is sandboxed to the working directory.

View File

@ -48,7 +48,7 @@ def search_recipes(
# ---------------------------------------------------------------------------
# Recipe catalog (133 recipes)
# Recipe catalog (134 recipes)
# ---------------------------------------------------------------------------
RECIPES: Dict[str, RecipeMeta] = {
@ -252,6 +252,34 @@ training:
target_modules: auto
quantization: 8bit
output: ./output
""",
),
"qwen2.5-coder-7b-sft": RecipeMeta(
model="Qwen/Qwen2.5-Coder-7B-Instruct",
task="sft",
size="7B",
tags=("qwen", "qwen2.5", "coder", "code", "sft"),
description="Qwen 2.5 Coder 7B instruction tuning with LoRA",
yaml_str="""\
base: Qwen/Qwen2.5-Coder-7B-Instruct
task: sft
data:
train: ./data/train.jsonl
format: auto
max_length: 2048
training:
epochs: 3
lr: 2e-4
batch_size: auto
lora:
r: 16
alpha: 32
target_modules: auto
quantization: 4bit
output: ./output
""",
),

View File

@ -260,7 +260,7 @@ class TestV025NewRecipes:
assert cfg.base == recipe.model
assert cfg.task == recipe.task
def test_catalog_size_is_133(self):
def test_catalog_size_is_134(self):
"""Total catalog size — grew with each release.
v0.25.0 shipped 43 recipes (29 + 9 Part A + 2 Part B tools + 3 Part E MLX).
@ -271,10 +271,11 @@ class TestV025NewRecipes:
v0.53.5 added 1 (deepseek-v3-reasoning) -> 113.
v0.62.0 added 3 (raft-llama3-8b, ra-dit-retriever, ra-dit-llama3-8b) -> 116.
v0.71.24 added 17 (2026 model-family expansion) -> 133.
v0.71.25 added 1 (qwen2.5-coder-7b-sft) -> 134.
"""
from soup_cli.recipes.catalog import RECIPES
assert len(RECIPES) == 133
assert len(RECIPES) == 134
def test_new_recipes_searchable(self):
"""Search returns the new recipes via keyword/task filter."""

View File

@ -264,13 +264,13 @@ class TestGlm5RepoIdFix:
# ---------------------------------------------------------------------------
# Catalog count — 116 -> 133
# Catalog count — 116 -> 134
# ---------------------------------------------------------------------------
class TestCatalogCount:
def test_total_recipe_count_is_133(self) -> None:
assert len(RECIPES) == 133
def test_total_recipe_count_is_134(self) -> None:
assert len(RECIPES) == 134
def test_list_recipes_matches_dict(self) -> None:
assert len(list_recipes()) == len(RECIPES)