Prhub

#35920 [Docs] Add --prerelease=allow to cookbook uv install commands

原始 PR 作者 zijiexia 合并时间 2026-08-22 06:51 文件变更 28 提交数 1 评论 0 代码增减 +36 / -32

执行摘要

cookbook 安装命令统一加 --prerelease=allow

本 PR 修复 #35912 的文档部分。根因是:uv < 0.12.0 不遵循传递依赖元数据中的预发布版本说明(上游 astral-sh/uv#19993 才修复),而 flash-attn-4 自 sglang 0.5.10 起是强制依赖且只在 PyPI 发布预发布版,于是 uv pip install sglang 会把每个 ≥ 0.5.10 的版本判为不可满足,并"无报错、无警告"地回溯到 0.5.9(2026-02-23)。PR body 进一步指出 sglang==0.5.18 固定了 cuda-tile==1.6.0rc5,版本固定后解析器无法回溯,旧 uv 下源码/可编辑安装会直接失败。install.mdx 早已带 flag(#29676),但 cookbook 页面普遍缺失,按模型页照抄命令的用户会静默装到 6 个月前的旧版,并踩到早已修复的 bug——如 #35912 中 Qwen3.8-27B 因缺 #19070 的 down_proj all-reduce 而出现"输出流畅但结果错误、无 crash、无 NaN"的现象。

不值得精读代码(本 PR 无代码),但值得完整浏览其 PR body——它是一份高质量的"文档类缺陷修复"范本:有根因分析、可复现的度量数据(uv pip compile 对比表)、显式的排除清单和最终验证手段(git grep)。对维护者:建议跟进 #35912 的 packaging/runtime guard,从包层面让静默降级不可能发生;同时可按环境指纹(0.5.9 + 对应 torch pin + uv 0.11.x)重新分类 #24029 等 6 个旧 issue。

讨论亮点

本 PR 没有任何内联 review 评论,唯一审核人 wisclmy0611 直接 APPROVED(body 为空),说明变更本身没有引发争议。实质性的设计讨论沉淀在 PR body 与 #35912 中:作者明确把修复拆成"docs 一半"和"packaging/runtime guard 一半",后者(让静默降级在包层面不可能发生的防护,以及对 #24029、#34111、#34112、#34113、#33283、#25670 等旧 issue 的重新分类)刻意留作 follow-up。另一个值得注意的决策是"哪些命令刻意不加 flag":作者给出排除清单及理由(如 ".[s2pro]" 属于 sglang-omni 独立仓库、pyproject_cpu.toml 不含预发布 pin),并用 git grep 作为覆盖完整性的事后验证。

实现拆解

  1. 范围摸排:以 #35912 提供的 uv pip compile 对比数据(uv 0.11.24 默认解析出 sglang==0.5.9,加 flag 后为 sglang==0.5.18)为依据,用 git grep "uv pip install" -- docs 定位所有漏加 flag 的 SGLang 安装命令,覆盖三种安装形态:PyPI(uv pip install sglang"sglang>=0.5.9"、定版本 nightly)、git(git+...#subdirectory=python)、源码(-e python-e "python[all]")。
  2. 批量修改 26 个 cookbook 页面:31 条命令统一加 --prerelease=allow;除命令本身外,同步修正周边注释以保持页面自洽,如 Tencent/Hy3.mdx 中"Once a tagged release picks it up, uv pip install sglang is enough"改成了带 flag 的写法,MiniMax-M3.mdx 中关于 #27944 合并后安装方式的预期描述也一并更新。
  3. 安装指南补注:在 docs/docs/get-started/install.mdx Method 1 的 PyPI 命令块后新增两句话的 <Note>,直接说明"部分依赖只在 PyPI 发预发布版,旧 uv 会静默装到 0.5.9,uv ≥ 0.12.0 无需该 flag"。
  4. 模板层预防:修改 .claude/skills/cookbook-add-model/templates/page.mdx.tmpl 的默认安装命令,让 Claude Code 生成的新模型页面从一开始就带上 flag,从源头杜绝同类遗漏(数据契约层面的预防性修改)。
  5. 排除项显式化:刻意不动非 SGLang 安装命令(lmms_evalnatten".[s2pro]" 属于 sglang-omni 独立仓库)、已带 flag 的 6 个 diffusion 页面与 LongCat-2.0、以及不涉及 flash-attn-4/cuda-tile 的平台页(tpu.mdx 装 sglang-jax;cpu_server.mdx 用 pyproject_cpu.toml;apple_metal.mdx 与 sglang-diffusion/installation.mdx 用 pyproject_other.toml)。
  6. 验证配套:纯文档变更,无单元测试;node docs/scripts/check_cookbook_configs.mjs 通过;改动后用 git grep 确认 docs 下已无缺 flag 的 SGLang uv 安装命令。
文件 模块 状态 重要度
docs/docs/get-started/install.mdx 安装指南 modified 2.72
.claude/skills/cookbook-add-model/templates/page.mdx.tmpl 文档模板 modified 2.75
docs/cookbook/autoregressive/Qwen/Qwen3.8-27B.mdx 模型文档 modified 2.72
docs/cookbook/autoregressive/Qwen/Qwen3.6.mdx 模型文档 modified 2.32
docs/cookbook/autoregressive/Tencent/Hy3.mdx 模型文档 modified 2.44
docs/cookbook/autoregressive/MiniMax/MiniMax-M3.mdx 模型文档 modified 2.32

关键源码片段

docs/cookbook/autoregressive/Qwen/Qwen3.6.mdx documentation

该页同时给出 PyPI 与 git 源码两种安装形态,是 " 命令形态覆盖广度 " 的代表页面,两条命令都补上了 flag。

# 注释:Qwen3.6 页面同时给出 PyPI 与 git 源码两种安装方式,
# 两条命令都补上 --prerelease=allow,确保旧版 uv(< 0.12.0)
# 也能正确解析到最新发布版本,而不是静默回退到 0.5.9。
# Install from PyPI
uv pip install --prerelease=allow sglang
​
# Or install from source
uv pip install --prerelease=allow 'git+https://github.com/sgl-project/sglang.git#subdirectory=python'

评论区精华

范围界定:只修 docs 一半,packaging guard 留作 follow-up 设计

PR 作者在 body 中说明 #35912 除文档外还包含两项非文档工作:让静默降级不可能发生的 packaging/runtime guard,以及对环境指纹匹配 resolver 驱动 0.5.9 安装的旧 issue(#24029、#34111、#34112、#34113、#33283、#25670)的重新分类,均不在此 PR 内处理。

结论:PR 明确只覆盖文档一半,先用 --prerelease=allow 兜底用户侧;包层防护留待 #35912 继续推进。 · 已解决

刻意不动的安装命令清单 question

作者逐一列出并核实不修改的命令:非 SGLang 安装(lmms_eval、natten、". [s2pro]" 属于 sglang-omni 独立仓库)、已带 flag 的 6 个 diffusion 页面与 LongCat-2.0、以及使用 pyproject_cpu.toml / pyproject_other.toml 的平台页面(不含 flash-attn-4 / cuda-tile 预发布 pin)。

结论:以 git grep 验证 docs 中已无缺 flag 的 SGLang uv 安装命令,覆盖完整性得到确认。 · 已解决

风险与影响

功能风险:基本为零。flag 在 uv ≥ 0.12.0 是 no-op,pip 与 Docker 安装路径不受影响(PR body 已用 uv pip compile 对比表和 pinned 失败输出佐证)。残余风险有三点:一是文档兜底只能覆盖"按文档操作"的用户,直接用记忆里裸命令的旧 uv 用户仍会静默装到 0.5.9,包层防护依赖 #35912 后续推进;二是模板改动只对之后用模板生成的新页面生效,手工新增页面仍需 review 习惯配合;三是依赖演进风险——未来 flash-attn-4 转 stable 或 cuda-tile==1.6.0rc5 换正式版后,这些 flag 会变成无害但多余的噪音,Hy3.mdx 等页面的"release 后即可"注释也需再次清理,存在文档随版本演进过时的风险。

用户侧:使用 uv < 0.12.0 的用户按 cookbook 安装不再静默拿到 0.5.9,从而避免"模型输出错误但无任何报错"的诡异现象(#35912 中 Qwen3.8-27B TP>1 案例);对 uv ≥ 0.12.0、pip、Docker 用户零行为变化。仓库侧:变更纯文档,28 个文件、+36/-32,不触碰运行时代码、依赖清单或 CI 逻辑;影响面为 26 个 cookbook 页面 + 安装指南 + 页面生成模板。团队侧:模板默认带 flag 能减少后续"新页面漏 flag"的 review 负担,同时为 #35912 的 packaging guard 争取了时间窗口。

依赖解析行为依赖 uv 版本 文档兜底无法覆盖不看文档的用户 文档注释存在版本演进过时风险

关联 Issue

#19993 Support transitive pre-release dependencies
#35912 [Bug] `uv pip install sglang` with uv < 0.12 silently installs 0.5.9 (6 months old)

完整报告

参与讨论