Skip to content

Commit a95fede

Browse files
fix(cli): quote install hints so pip install soup-cli[extra] works on cmd.exe (v0.71.37)
Every printed and documented `pip install 'soup-cli[extra]'` was bash / zsh / PowerShell syntax and failed on Windows cmd.exe: ERROR: Invalid requirement: "'soup-cli[train]'": Expected package name at the start of dependency specifier cmd.exe has no single-quote quoting, so it passes the quotes to pip verbatim and pip rejects the requirement. Nothing in Soup can fix that once the command is typed -- pip and the shell own it, and Soup is not installed yet when the README line runs -- so the fix is the spelling we print. Migrated 147 sites across 67 files to `pip install "soup-cli[extra]"`: - 64 in src/ (Rich console hints + plain ImportError text) - 57 in README.md + docs/ - 22 in src/soup_cli/templates/*.yaml + examples/configs/*.yaml - 3 in examples/README.md Double quotes are the only spelling valid in every shell (cmd, PowerShell, bash, zsh), which is why the repo already used `pip install -e ".[dev]"`. Measured on Windows: single quotes fail ONLY on cmd; double quotes pass everywhere; bare passes on Windows but zsh globs `[extra]` and fails. Method note (the PR MakazhanAlpamys#247 class): the hints sit INSIDE double-quoted Python string literals, so a blind ' -> " sed produces SyntaxError. A tokenize-based rewriter escaped `\"` in DQUOTE tokens and left bare `"` in TRIPLE / COMMENT tokens; every touched .py was compile-checked. The full suite (not ruff, not compile-check) caught two rewriter blind spots: the real YAML templates under src/soup_cli/templates/ (byte-identical drift test) and examples/README.md. A regression test (tests/test_v07137.py) scans the package and every docs code block for the single-quoted form; prose may still name it so a reader from an older tutorial recognises the error. Also bundles MakazhanAlpamys#315 (@Sanjays2402): eval-gate benchmark tasks now run via ForgettingDetector instead of a helper that never existed. Closes MakazhanAlpamys#310. Test count: 16283 -> 16288 (+4 in tests/test_v07137.py). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 83c4c6d commit a95fede

69 files changed

Lines changed: 341 additions & 157 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,35 @@ reproducing 70+ versions of notes.
1212

1313
## [Unreleased]
1414

15+
## [0.71.37] - 2026-07-17
16+
17+
**Every `pip install soup-cli[extra]` command now works on Windows `cmd.exe`**, and
18+
eval-gate benchmark tasks run instead of always failing.
19+
1520
### Fixed
1621

22+
- **Install hints are now quoted so they work in every shell.** Soup printed
23+
`pip install 'soup-cli[ui]'` — bash / zsh / PowerShell syntax. `cmd.exe` has no
24+
single-quote quoting, so it hands the quotes to pip verbatim and pip refuses:
25+
26+
```
27+
ERROR: Invalid requirement: "'soup-cli[train]'": Expected package name at the start of dependency specifier
28+
```
29+
30+
Every hint, README command, and docs example now uses `pip install
31+
"soup-cli[extra]"`, which works in cmd, PowerShell, bash, and zsh alike — the
32+
same spelling the repo already used for `pip install -e ".[dev]"`. Measured on
33+
Windows: single quotes fail only on `cmd.exe`; double quotes pass everywhere;
34+
dropping the quotes passes on Windows but breaks zsh, which globs the bracket.
35+
36+
Nothing in Soup can rescue the command after it is typed — pip and the shell
37+
own it, and Soup is not installed yet when the README command runs — so the
38+
fix is the spelling we print. A regression test now scans the package and every
39+
docs code block for the single-quoted form.
40+
41+
If you followed an older tutorial and hit `Invalid requirement`, swap the `'`
42+
for `"`; nothing is wrong with the package.
43+
1744
- **Eval-gate `type: benchmark` tasks now actually run.** `eval/gate.py` probed
1845
for a `forgetting.run_mini_benchmark` helper that never existed, so every
1946
`type: benchmark` task in a gate suite failed 100% of the time — while

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ src/soup_cli/
120120
templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121121
ui/ - Web UI (FastAPI + HTML/JS SPA)
122122
123-
tests/ - Test suite (314 files, 16283 tests)
123+
tests/ - Test suite (315 files, 16288 tests)
124124
examples/ - Real-world config examples and datasets
125125
```
126126

README.md

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
Soup turns the pain of LLM fine-tuning into a simple workflow. One config, one command, done.
3333

3434
```bash
35-
pip install 'soup-cli[train]' # add [train] to fine-tune; bare `soup-cli` is the light CLI
35+
pip install "soup-cli[train]" # add [train] to fine-tune; bare `soup-cli` is the light CLI
3636
soup init --template chat
3737
soup train
3838
```
@@ -68,7 +68,7 @@ infrastructure instead of improving models. Soup fixes that.
6868
separates them. The default is deliberately conservative; see the CHANGELOG.
6969
- **Two blocking bugs fixed:** the hardware-fit gate **refused to train any model you merged
7070
yourself** (a local checkpoint's name has no size marker, so it guessed 7B and predicted
71-
16 GB), and every `pip install 'soup-cli[extra]'` hint printed **without the extra**
71+
16 GB), and every `pip install "soup-cli[extra]"` hint printed **without the extra**
7272
17 sites where the suggested command succeeds and leaves the feature still broken.
7373

7474
```bash
@@ -104,26 +104,37 @@ Full history: [CHANGELOG.md](CHANGELOG.md) &middot; [GitHub Releases](https://gi
104104
### 1. Install
105105

106106
```bash
107-
pip install soup-cli # light: CLI + config + data tools (no PyTorch)
108-
pip install 'soup-cli[train]' # add the training stack (torch, transformers, peft, trl, …)
109-
pip install git+https://github.com/MakazhanAlpamys/Soup.git # latest dev
107+
# Light core: CLI + config + data tools, no PyTorch
108+
pip install soup-cli
109+
110+
# Add the training stack (torch, transformers, peft, trl, datasets, …)
111+
pip install "soup-cli[train]"
112+
113+
# Everything (train + serve + ui + data) in one shot
114+
pip install "soup-cli[all]"
115+
116+
# Or from GitHub (latest dev)
117+
pip install git+https://github.com/MakazhanAlpamys/Soup.git
110118
```
111119

112-
> **On Windows `cmd.exe`, swap the single quotes for double quotes:**
113-
> `pip install "soup-cli[train]"`
120+
The full extras table (`fast`, `mlx`, `serve`, `eval`, `ui`, `vision`, `audio`, …) lives in
121+
[`docs/models.md`](docs/models.md#optional-extras).
122+
123+
> **Use double quotes around the extra.** They are the only spelling that works in
124+
> every shell — `cmd.exe`, PowerShell, bash, and zsh.
114125
>
115-
> The commands above are written for bash / zsh / PowerShell, where `'…'` quotes a
116-
> string. `cmd.exe` has no single-quote quoting — it passes the characters straight
117-
> to pip, which then rejects them:
126+
> Older tutorials and videos (including some of ours) show the single-quoted
127+
> `pip install 'soup-cli[train]'`. That is bash / zsh / PowerShell syntax, and it
128+
> fails on Windows `cmd.exe`, which has no single-quote quoting and hands the
129+
> quotes straight to pip:
118130
>
119131
> ```
120132
> ERROR: Invalid requirement: "'soup-cli[train]'": Expected package name at the start of dependency specifier
121133
> ```
122134
>
123-
> That is pip parsing a literal `'`, not a problem with the package. Double quotes
124-
> work in **every** shell — cmd, PowerShell, bash, and zsh — so `pip install
125-
> "soup-cli[train]"` is always safe. (Unquoted `pip install soup-cli[train]` also
126-
> works in cmd and PowerShell, but zsh reads `[train]` as a glob and fails.)
135+
> If you hit that, swap the `'` for `"` — pip is rejecting a literal quote
136+
> character, nothing is wrong with the package. (Dropping the quotes entirely
137+
> works on Windows too, but zsh then reads `[train]` as a glob and fails.)
127138
128139
`soup init`, `soup data …`, and the other data/inspection commands work on the light install.
129140
Fine-tuning (`soup train`) needs the `[train]` extra.
@@ -159,7 +170,7 @@ A complete `soup.yaml`:
159170
```yaml
160171
base: meta-llama/Llama-3.1-8B-Instruct
161172
task: sft
162-
# backend: unsloth # 2-5x faster, pip install 'soup-cli[fast]'
173+
# backend: unsloth # 2-5x faster, pip install "soup-cli[fast]"
163174

164175
data:
165176
train: ./data/train.jsonl

docs/backends-and-ops.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ Fine-tune on M1-M4 Macs via Apple's [MLX](https://github.com/ml-explore/mlx) fra
7979

8080
```bash
8181
# Install MLX support
82-
pip install 'soup-cli[mlx]'
82+
pip install "soup-cli[mlx]"
8383
```
8484

8585
```yaml
@@ -108,7 +108,7 @@ Use the [Unsloth](https://github.com/unslothai/unsloth) backend for significantl
108108

109109
```bash
110110
# Install unsloth support
111-
pip install 'soup-cli[fast]'
111+
pip install "soup-cli[fast]"
112112
```
113113

114114
Then add one line to your config:
@@ -143,7 +143,7 @@ app from your `soup.yaml` for serverless, per-second-billed GPU training. The co
143143
base64-embedded as **data** — no code interpolation, no secrets in the generated stub.
144144

145145
```bash
146-
pip install 'soup-cli[modal]' # only needed for live submit
146+
pip install "soup-cli[modal]" # only needed for live submit
147147
148148
# Plan-only (default): write the stub + print the `modal run` command.
149149
soup train --config soup.yaml --cloud modal --gpu a100
@@ -585,7 +585,7 @@ Full-screen Textual dashboard. Two-pane: run list (left) + selected-run detail
585585
(right). `r` refreshes, `q` quits.
586586

587587
```bash
588-
pip install 'soup-cli[tui]'
588+
pip install "soup-cli[tui]"
589589
soup tui --refresh 1.0 --limit 50
590590
```
591591

docs/commands.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ soup adapters bisect <ckpt>... --eval-command "..." Binary search over training
255255
soup lock write --base-sha <h> --dataset-sha <h> --env-hash <h> Write soup.lock (v0.67.0)
256256
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)
257257
soup lock show / soup lock check Show + drift-check (exit 3 on drift)
258-
soup compile <program.py> --eval <suite> [--optimizer mipro|gepa|textgrad|copro|bootstrap_fewshot] [--plan-only] DSPy / GEPA / TextGrad prompt-program compiler — live (v0.71.13; pip install 'soup-cli[compile]')
258+
soup compile <program.py> --eval <suite> [--optimizer mipro|gepa|textgrad|copro|bootstrap_fewshot] [--plan-only] DSPy / GEPA / TextGrad prompt-program compiler — live (v0.71.13; pip install "soup-cli[compile]")
259259
soup distill-prompt --traces <jsonl> --teacher <m> --student <m> --strategy sft|preference|kl [--provider ollama|anthropic|vllm] [--base-url <url>] [--temperature F] [--max-rows N] Distill prompt-heavy traces via a live teacher (v0.71.13)
260-
soup compile-tools <spec.json|yaml> --eval <jsonl> [--optimizer textgrad|gepa] [--plan-only] TextGrad / GEPA tool-schema optimiser — live (v0.71.13; pip install 'soup-cli[compile]')
260+
soup compile-tools <spec.json|yaml> --eval <jsonl> [--optimizer textgrad|gepa] [--plan-only] TextGrad / GEPA tool-schema optimiser — live (v0.71.13; pip install "soup-cli[compile]")
261261
soup apple-adapter <source-dir> --direction hf-to-mlx|mlx-to-hf|hf-to-apple|mlx-to-apple --output <dir> [--sign] [--plan-only] PEFT LoRA <-> mlx-lm adapter conversion — live (v0.71.21; *-to-apple upstream-gated exit 3)
262262
soup local-rl init --db <path> Create personal-LLM flywheel SQLite schema (v0.68.0)
263263
soup local-rl status --db <path> Print interactions / thumbs-up / thumbs-down counters
@@ -299,7 +299,7 @@ server over **stdio**, so any MCP client — Claude Code, Cursor, Cline, Continu
299299
can drive Soup conversationally. Install the extra first:
300300

301301
```bash
302-
pip install 'soup-cli[mcp]'
302+
pip install "soup-cli[mcp]"
303303
```
304304

305305
Register it with your client. For **Claude Code** (`.mcp.json` in the repo) or

docs/data.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ soup data generate --prompt "..." --validate
337337
# Auto-filter by quality (coherence scoring)
338338
soup data generate --prompt "..." --filter
339339
340-
# Auto-dedup (MinHash, requires: pip install 'soup-cli[data]')
340+
# Auto-dedup (MinHash, requires: pip install "soup-cli[data]")
341341
soup data generate --prompt "..." --dedup
342342
343343
# Full quality pipeline: validate + filter + dedup
@@ -591,7 +591,7 @@ soup data convert ./data/train.jsonl --to sharegpt --output converted.jsonl
591591
# Merge multiple datasets
592592
soup data merge data1.jsonl data2.jsonl --output merged.jsonl --shuffle
593593
594-
# Remove near-duplicates (requires: pip install 'soup-cli[data]')
594+
# Remove near-duplicates (requires: pip install "soup-cli[data]")
595595
soup data dedup ./data/train.jsonl --threshold 0.8
596596
597597
# Extended statistics (length distribution, token counts, languages)
@@ -814,7 +814,7 @@ Five checks: `length_bias` — the **#1 silent DPO degradation**: `chosen`
814814
systematically longer than `rejected`, reported as a Cohen's d effect size —
815815
`label_imbalance` (KTO desirable:undesirable ratio), `near_duplicates`
816816
(MinHash/LSH, reuses the `soup data dedup` kernel; requires
817-
`pip install 'soup-cli[data]'`, degrades to an advisory skip otherwise),
817+
`pip install "soup-cli[data]"`, degrades to an advisory skip otherwise),
818818
`identical_pairs` (`chosen == rejected` — zero preference signal), and
819819
`prompt_leak` (the prompt echoed verbatim inside the completion, a common
820820
synthetic-data pipeline bug). Same OK/MINOR/MAJOR taxonomy and exit codes as

docs/evaluation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ Full-featured evaluation platform with standard benchmarks, custom evals, LLM-as
432432

433433
```bash
434434
# Install eval dependencies
435-
pip install 'soup-cli[eval]'
435+
pip install "soup-cli[eval]"
436436

437437
# Standard benchmarks (wraps lm-evaluation-harness)
438438
soup eval benchmark --model ./output --benchmarks mmlu,gsm8k,hellaswag

docs/models.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,29 @@ no PyTorch. Add `[train]` to fine-tune, or install other extras only when you ne
7070

7171
| Extra | Install | What it adds |
7272
|---|---|---|
73-
| `train` | `pip install 'soup-cli[train]'` | Training stack: torch, transformers, peft, trl, datasets, bitsandbytes, accelerate |
74-
| `all` | `pip install 'soup-cli[all]'` | `train` + `serve` + `ui` + `data` in one shot |
75-
| `fast` | `pip install 'soup-cli[fast]'` | Unsloth backend (2-5x faster, lower VRAM) |
76-
| `vision` | `pip install 'soup-cli[vision]'` | Vision / multimodal fine-tuning (Pillow) |
77-
| `audio` | `pip install 'soup-cli[audio]'` | Audio / speech fine-tuning (librosa, soundfile) |
78-
| `mlx` | `pip install 'soup-cli[mlx]'` | Apple Silicon backend (mlx, mlx-lm) |
79-
| `qat` | `pip install 'soup-cli[qat]'` | Quantization-Aware Training (torchao) |
80-
| `serve` | `pip install 'soup-cli[serve]'` | Inference server (FastAPI + uvicorn) |
81-
| `serve-fast` | `pip install 'soup-cli[serve-fast]'` | vLLM inference backend (2-4x throughput) |
82-
| `sglang` | `pip install 'soup-cli[sglang]'` | SGLang inference backend |
83-
| `ui` | `pip install 'soup-cli[ui]'` | Web UI + inference server |
84-
| `tui` | `pip install 'soup-cli[tui]'` | Full-screen Textual dashboard (`soup tui`) |
85-
| `eval` | `pip install 'soup-cli[eval]'` | Benchmark evaluation (lm-evaluation-harness) |
86-
| `data` | `pip install 'soup-cli[data]'` | Deduplication (MinHash via datasketch) |
87-
| `data-pro` | `pip install 'soup-cli[data-pro]'` | Language detection + PII (langdetect, presidio) |
88-
| `deepspeed` | `pip install 'soup-cli[deepspeed]'` | Multi-GPU training (DeepSpeed ZeRO) |
89-
| `liger` | `pip install 'soup-cli[liger]'` | Liger Kernel fused ops |
90-
| `ring-attn` | `pip install 'soup-cli[ring-attn]'` | Ring FlashAttention (sequence parallelism) |
91-
| `onnx` / `tensorrt` | `pip install 'soup-cli[onnx]'` | ONNX / TensorRT-LLM export |
92-
| `awq` / `gptq` | `pip install 'soup-cli[awq]'` | AWQ / GPTQ quantized export |
93-
| `trackers` | `pip install 'soup-cli[trackers]'` | MLflow / SwanLab / Trackio logging |
94-
| `remote` | `pip install 'soup-cli[remote]'` | Remote datasets (s3 / gs / az / oci) |
95-
| `dev` | `pip install 'soup-cli[dev]'` | Tests + lint + types (pytest, ruff, mypy, pre-commit) |
73+
| `train` | `pip install "soup-cli[train]"` | Training stack: torch, transformers, peft, trl, datasets, bitsandbytes, accelerate |
74+
| `all` | `pip install "soup-cli[all]"` | `train` + `serve` + `ui` + `data` in one shot |
75+
| `fast` | `pip install "soup-cli[fast]"` | Unsloth backend (2-5x faster, lower VRAM) |
76+
| `vision` | `pip install "soup-cli[vision]"` | Vision / multimodal fine-tuning (Pillow) |
77+
| `audio` | `pip install "soup-cli[audio]"` | Audio / speech fine-tuning (librosa, soundfile) |
78+
| `mlx` | `pip install "soup-cli[mlx]"` | Apple Silicon backend (mlx, mlx-lm) |
79+
| `qat` | `pip install "soup-cli[qat]"` | Quantization-Aware Training (torchao) |
80+
| `serve` | `pip install "soup-cli[serve]"` | Inference server (FastAPI + uvicorn) |
81+
| `serve-fast` | `pip install "soup-cli[serve-fast]"` | vLLM inference backend (2-4x throughput) |
82+
| `sglang` | `pip install "soup-cli[sglang]"` | SGLang inference backend |
83+
| `ui` | `pip install "soup-cli[ui]"` | Web UI + inference server |
84+
| `tui` | `pip install "soup-cli[tui]"` | Full-screen Textual dashboard (`soup tui`) |
85+
| `eval` | `pip install "soup-cli[eval]"` | Benchmark evaluation (lm-evaluation-harness) |
86+
| `data` | `pip install "soup-cli[data]"` | Deduplication (MinHash via datasketch) |
87+
| `data-pro` | `pip install "soup-cli[data-pro]"` | Language detection + PII (langdetect, presidio) |
88+
| `deepspeed` | `pip install "soup-cli[deepspeed]"` | Multi-GPU training (DeepSpeed ZeRO) |
89+
| `liger` | `pip install "soup-cli[liger]"` | Liger Kernel fused ops |
90+
| `ring-attn` | `pip install "soup-cli[ring-attn]"` | Ring FlashAttention (sequence parallelism) |
91+
| `onnx` / `tensorrt` | `pip install "soup-cli[onnx]"` | ONNX / TensorRT-LLM export |
92+
| `awq` / `gptq` | `pip install "soup-cli[awq]"` | AWQ / GPTQ quantized export |
93+
| `trackers` | `pip install "soup-cli[trackers]"` | MLflow / SwanLab / Trackio logging |
94+
| `remote` | `pip install "soup-cli[remote]"` | Remote datasets (s3 / gs / az / oci) |
95+
| `dev` | `pip install "soup-cli[dev]"` | Tests + lint + types (pytest, ruff, mypy, pre-commit) |
9696

9797
The complete, authoritative extras list is in [`pyproject.toml`](../pyproject.toml).
9898

docs/performance-and-quantization.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Train with simulated quantization for significantly better post-quantization qua
3636

3737
```bash
3838
# Install QAT support
39-
pip install 'soup-cli[qat]'
39+
pip install "soup-cli[qat]"
4040
```
4141

4242
```yaml
@@ -71,7 +71,7 @@ QAT works with all training tasks (SFT, DPO, GRPO, PPO, KTO, ORPO, SimPO, IPO, P
7171
For H100 / H200 / B100 / B200 GPUs, train with float8 matmuls for ~2x speedup vs bf16 at comparable quality. This extends QAT infrastructure via `torchao.float8`:
7272

7373
```bash
74-
pip install 'soup-cli[qat]' # torchao >= 0.5.0 includes torchao.float8
74+
pip install "soup-cli[qat]" # torchao >= 0.5.0 includes torchao.float8
7575
```
7676

7777
```yaml
@@ -106,7 +106,7 @@ Bool `true` stays on the int8 QAT path for backward compatibility. FP8 requires
106106
Models with 128k+ vocabularies (Llama 3.1, Qwen2) materialise a huge `(batch, seq, vocab)` logits tensor that dominates VRAM. Cut Cross-Entropy computes the loss in chunks instead:
107107

108108
```bash
109-
pip install 'soup-cli[cce]' # or: pip install cut-cross-entropy
109+
pip install "soup-cli[cce]" # or: pip install cut-cross-entropy
110110
```
111111

112112
```yaml
@@ -368,9 +368,9 @@ data:
368368
Install optional performance packages:
369369

370370
```bash
371-
pip install 'soup-cli[liger]' # Liger Kernel fused operations
371+
pip install "soup-cli[liger]" # Liger Kernel fused operations
372372
pip install flash-attn --no-build-isolation # FlashAttention
373-
pip install 'soup-cli[ring-attn]' # Ring FlashAttention (sequence parallelism)
373+
pip install "soup-cli[ring-attn]" # Ring FlashAttention (sequence parallelism)
374374
```
375375

376376

docs/serving-and-export.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Linux/macOS need only a C++ toolchain + CMake. CUDA llama.cpp builds are unteste
9797
Export models to ONNX format for use with [ONNX Runtime](https://onnxruntime.ai/):
9898

9999
```bash
100-
pip install 'soup-cli[onnx]'
100+
pip install "soup-cli[onnx]"
101101
soup export --model ./output --format onnx
102102
soup export --model ./output --format onnx --output ./model_onnx
103103
```
@@ -107,7 +107,7 @@ soup export --model ./output --format onnx --output ./model_onnx
107107
Export models to TensorRT-LLM format for high-throughput GPU inference:
108108

109109
```bash
110-
pip install 'soup-cli[tensorrt]'
110+
pip install "soup-cli[tensorrt]"
111111
soup export --model ./output --format tensorrt
112112
soup export --model ./output --format tensorrt --output ./model_trt
113113
```
@@ -212,7 +212,7 @@ Start a local OpenAI-compatible inference server:
212212

213213
```bash
214214
# Install server dependencies
215-
pip install 'soup-cli[serve]'
215+
pip install "soup-cli[serve]"
216216

217217
# Start server
218218
soup serve --model ./output --port 8000
@@ -253,7 +253,7 @@ Use [vLLM](https://github.com/vllm-project/vllm) for significantly better throug
253253

254254
```bash
255255
# Install vLLM support
256-
pip install 'soup-cli[serve-fast]'
256+
pip install "soup-cli[serve-fast]"
257257

258258
# Start with vLLM backend
259259
soup serve --model ./output --backend vllm
@@ -273,7 +273,7 @@ Use [SGLang](https://github.com/sgl-project/sglang) as an alternative high-throu
273273

274274
```bash
275275
# Install SGLang support
276-
pip install 'soup-cli[sglang]'
276+
pip install "soup-cli[sglang]"
277277

278278
# Start with SGLang backend
279279
soup serve --model ./output --backend sglang
@@ -482,7 +482,7 @@ The OTLP endpoint is SSRF-hardened: only http/https schemes, plain HTTP only for
482482
Launch a local web interface to manage experiments, start training, explore data, and chat with models — all from your browser.
483483

484484
```bash
485-
pip install 'soup-cli[ui]'
485+
pip install "soup-cli[ui]"
486486
soup ui
487487
# -> opens http://127.0.0.1:7860 in your browser
488488
# -> prints auth token to console

0 commit comments

Comments
 (0)