08 · 一手拆机:启动清单与系统提示词¶
前七章看的是"他们怎么开发的",这一章换个角度:装上之后它是什么。以下全部为一手实测——npm install @deepseek-ai/dsh(v0.1.0-rc.6,2026-08-15),跑 dsh --profile web --dump-default-config 导出的出厂启动清单,交叉对照仓库源码。复现只需 Node ≥ 22,不需要 API key。
rc.6 → 0.1.2-rc.1
本章正文基于 rc.6。2026-09-07 在 0.1.2-rc.1(当时的 npm latest)上重跑:清单从 129 条 / 490 行涨到 145 条 / 525 行,出厂 profile 从 web、headless 两个扩到 acp、web、headless、sdk、sdk-minimal 五个;本章引用的 persona、plan-mode、repeat-tool-reminder、结果修剪、权限三档等段落逐字未变。清单层面有实质变化的至少四处:遥测默认(DISABLED → FEEDBACK_ONLY)、web_fetch 出厂开启、子代理 report 工具删除、web 层 api-gateway 拆成三个 controller;清单看不见但源码改了的还有提示词段落排序。前三处和排序见第 09 章,新清单存档为附件-boot-manifest-0.1.2-rc.1.yml。
出厂启动清单:129 个插件条目¶
默认 web profile 的清单共 490 行 YAML、129 个插件条目(其中 25 个带 disabled: true 出厂即禁用)。每一条都长这样:
- id: agent-default-model
name: '@deepseek-ai/dsh-agent-default-model'
config:
provider: deepseek-official
model: deepseek-v4-flash
"everything is a plugin" 不是口号:模型适配器、会话日志、agent 循环、工具、沙箱、审批、Web UI,全部以同等地位躺在这份清单里,每一行都可以被用户的 patch 覆盖或禁用。清单里还允许 !!js 表达式,权限策略直接由环境变量驱动:
三档权限预设出厂内置:read-only / workspace-write(默认)/ danger-full-access;审批策略随档位联动——只有全放开档才是 never,其余都是 ask。沙箱按平台分流:bash-sandbox 在 Windows 上禁用、pwsh-sandbox 在非 Windows 上禁用,同一份清单跨平台自适应。
系统提示词:没有"一大段话",只有一个装配线¶
这是和 Claude Code / Codex 最不一样的地方。dsh 没有一份巨型系统提示词——dsh-system-prompt 包只是一个"段落注册表",各插件把自己的段落注册进来,运行时装配。出厂的"人设"段(persona)小到只有一句:
其余全部由用到的插件自带:plan-mode 插件带 plan 模式的规则段、时间插件带当前时间段、技能插件带技能目录段。于是三件事同时成立:
- 提示词即配置——完整文本就躺在启动清单里,用户 patch 一行即可换掉自己的人设或某个段落
- 提示词随插件增减——不装的能力不占上下文,这就是"极简模式"省 token 的机制
- 提示词有回归保障——前面第 6 章讲的快照测试之所以可行,正因为提示词是结构化装配而非一团文本
Plan 模式提示词里的两处工程巧思¶
plan-mode 的完整规则段就在清单里(这段官方文档不会单独给你)。要注意 dump 出来的是 base 层的默认段落,在 web profile 里它被标记为 disabled,真正对 web 用户生效的是 agent preset 里按 agent 作用域重新挂载的同一段文本,两处只有一句措辞不同("keep the request shape stable" 与 "keep the tool catalog unchanged"),下面两点在两处都成立。两处细节值得细读:
1. 缓存感知的提示词设计。 原文明确写着:工具目录在各模式间保持一致,"for request-cache stability"——变更工具列表会打碎 LLM 的请求缓存,所以 plan 模式下修改类工具仍然列出(只是规则禁止使用),保持请求形状稳定省缓存钱。把推理成本结构反向压进提示词设计,这是做 agent 产品的人才会踩到的层次。
2. 堵死"口头同意"的漏洞。 规则明确写:用户在对话里的附和(包括回答你问的问题)不构成批准、不结束 plan 模式——确认的决定要折进计划、通过 exit_plan_mode 正式提交。这是对真实失败模式的补丁:模型很容易把一句"嗯可以"当成开工许可。
第 2 章那个插件的下落¶
我们在第 2 章拆过"防重复调用工具"插件的 Agent Note。在出厂清单里找到了它的成品形态:
- id: repeat-tool-reminder
name: '@deepseek-ai/dsh-repeat-tool-reminder'
config:
thresholds: [3, 5, 8]
argumentsPreviewChars: 500
默认开启,阈值和 note 里定的一致(连续 ⅗/8 次相同调用时递进提醒)。注意名字从开发期的 repeat-tool-guard 变成了发布版的 repeat-tool-reminder——从"守卫"到"提醒",与它"只注入建议、从不拦截调用"的设计吻合。一篇决策文档 → 一个插件 → 一行出厂配置,整条链路在公开材料里可以走通。
其他值得一提的出厂细节¶
- 上下文压缩默认关,结果修剪默认开:
compaction-basic出厂禁用,但compaction-tool-result-pruner开着——工具结果超过 8192 字符自动裁剪到头部 4096。裁大结果比压缩历史先行,是更保守的省 token 策略 - 会话标题生成考虑了中文:配置里同时有
targetWords: 5和targetCjkCharacters: 10——CJK 字符单独计数,i18n 不是事后补的 - 默认模型 deepseek-v4-flash,检索用自家 search provider
复现命令¶
mkdir dsh-teardown && cd dsh-teardown
npm init -y
npm install @deepseek-ai/dsh --ignore-scripts # node-pty 原生编译失败可跳过
node_modules/.bin/dsh --profile web --dump-default-config > boot-manifest.yml
grep -c '^- id:' boot-manifest.yml # 数插件条目
版本迭代很快(我们装到的是 rc.6,比前一天的解析又新了一版),一切以你本机导出为准。本文分析所用的那份导出已存档在 附件-boot-manifest-rc6.yml,0.1.2-rc.1 的导出在 附件-boot-manifest-0.1.2-rc.1.yml,可对照阅读。
两个复现时的提示:在 0.1.2-rc.1 上实测 npm install 不加 --ignore-scripts 也能成功(node-pty 已升到 1.2.0-beta 系列),能否省掉这个参数取决于本机的原生编译环境;--dump-default-config 会在 ~/.dsh/profiles/<name>/ 下静默生成 profile 目录(源码注释说这是有意的"首次使用即初始化"),不想留痕的话跑完删掉。
← 上一章 · 返回目录 · 下一章:规则是怎么被改写的 →