dsh-modes
View and manage DeepSeek Harness agent modes in Web Settings: toggle plugins, edit system prompts, create modes from templates.
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 15, 2026
- Updated
- Oct 16, 2026
Introduction
dsh-modes
在 DeepSeek Harness(dsh)Web 的设置里查看和管理 Agent 模式(预设):开关每个模式加载的插件、合并内置模式的更新、编辑系统提示词并保留历史版本、用起步模板新建模式。
View and manage DeepSeek Harness agent modes (presets) in Web Settings: toggle the plugins each mode loads, merge built-in updates without losing your changes, edit each mode's system prompt with history, live updates, and an approval-gated chat tool, and create modes from starter templates. The page follows dsh's language setting (Chinese or English).
兼容性
| dsh 版本 | 验证方式 | 结果 |
|---|---|---|
0.2.0-rc.2(npm 当前 latest,也是 Desktop 当前版本) | 安装到 dsh web,在界面里实际操作;用本地假模型抓取实际请求 | 可用;这个版本的 dsh 不提供插件的本地化名称,插件行显示包名和英文说明 |
0.2.1-alpha.3 | 源码运行,界面操作并用本地假模型抓取实际请求 | 可用 |
插件依赖的 configEditor、agentPresets、systemPrompt、tools 等都是 dsh 尚未稳定的接口,其他版本可能需要适配。
功能
设置 → 模式管理(Modes)页面,按「这个模式能做什么、怎么说话、怎么开始用」组织:
一眼看懂每个模式
- 每个模式一张卡片:名称、描述,以及它能做的事(运行命令、读写文件或只读文件、网页、子代理、扩展自身),不用展开就能比较几个模式
- 卡片下方一行状态:已启用插件数、在用的会话数、改过几项、提示词是否即时生效
- 只有一个主按钮「用它新建会话」;设为默认、复制、查看配置(YAML)、编辑信息、恢复内置、删除都收在「⋯」菜单里
- 需要你处理的事只显示最要紧的一条:插件加载失败、内置模式有更新、身份行被关闭、有未保存的提示词草稿,各带一个处理按钮
能力:用开关决定它能做什么
- 展开卡片后默认是「能力」页:15 项能力分成「能做的事」「工作方式」「上下文」三组,每项一个开关、一句说明
- 打开一项能力会把它恢复成内置模式里的样子:按运行环境自动开关的插件(例如 Bash 和 PowerShell)恢复成「自动」,内置模式本来就关着的插件(例如 Codex 子代理)保持关闭;关闭则关掉这项能力包含的所有插件
- 「文件」下面可以单独关掉「允许修改文件」,让模式只能读和搜索
- 只开了一部分插件的能力标为「部分开启」
提示词
- 「提示词」页:编辑开头的系统提示词,点击插入
{{model}}等变量,输入时实时校验变量,可预览完整的系统提示词(包括未保存的修改);修改过的提示词可以一键恢复内置 - 高级设置:结尾提示词(追加在工具说明、工作区规则之后)、「只用开头这段作为完整的系统提示词」、「附带运行时上下文」。这些和提示词文字一起,点「保存」才生效
- 「在对话中」两个开关立即保存:
- 即时生效:保存提示词后,正在运行的会话从下一步起就使用新提示词,不用新开会话
- 允许在对话里修改提示词:模型可以调用
mode_prompt工具读取、替换或追加这个模式的提示词;每次保存都会弹出审批,你批准后才写入
- 历史版本:每次保存(包括在对话里修改、恢复内置)都会记下一个版本,标明来源(设置页、对话中、恢复内置、最初版本、在其他地方修改),最多保留 30 个;任意版本都可以载入到编辑器
- 草稿保护:未保存的修改存在浏览器本地,切换标签、关闭设置或刷新页面都不会丢;可以随时放弃修改;支持导出为
.md文件,或从.md/.txt文件导入 - 保存冲突检测:如果你编辑期间提示词在别处(例如另一个窗口或对话里)被改了,保存会被拒绝并显示最新内容,你可以载入最新内容,或用自己的版本覆盖
全部插件:需要逐个调整时
- 「全部插件」页列出模式里的每一个插件,有自己的搜索和「只看改动」。插件名称优先用 dsh 提供的本地化名称,dsh 没有提供时(例如 0.2.0-rc.2)用各插件官方的中文名称和说明;行 id、模块路径等技术信息收在「详情」里
- 按运行环境自动开关的插件可以选「自动」「开」「关」;固定后标为「已固定,不再自动切换」,随时可以改回自动
- 修改过的插件标为「已修改」,可以单独还原;整个模式也可以一键恢复内置配置
- 关闭身份(persona)行之前会二次确认
跟上 dsh 的更新
- 同步内置更新:dsh 升级后,改过的内置模式和基于内置模式创建的自定义模式会提示「内置模式有更新」。同步前会列出新增、移除和有官方更新的插件,以及会保留你的几处修改;确认后合并。你没动过的插件跟随官方,你改过的设置保留你的值,双方都改过的同一项也保留你的值并单独计数
- 之后每次保存修改时也会顺带完成这次合并,并在提示里说明
- 一键修复:模式里有插件加载失败时,整个模式会变成不可用。卡片上会列出失败的插件和原因,一键只关闭这些插件,让模式恢复可用
新建和删除
- 新建模式时选择起步方式:开发(与标准模式相同)、写作(读写文件、无终端)、聊天(只聊天和搜索网页)、只读调研(能读能搜,不能改文件、不能运行命令),或者复制任意现有模式。每个模板都带一段起步提示词(按界面语言选择中文或英文),并显示会启用多少个插件;名称和 ID 会自动填好。创建后卡片直接展开到「能力」页
- 删除前会统计有多少个打开的会话和已保存的会话在用这个模式(已保存的会话按它实际使用的模式统计),因为删除后再打开这些会话会失败
修改写入当前 profile 的 cordis.patch.yml。没有开启即时生效时,正在运行的会话保持原有配置,之后新建的会话使用新配置。界面支持中文和英文,跟随 dsh 的语言设置。
工作方式
| 文件 | 作用 |
|---|---|
index.js | 宿主端插件,提供 POST /api/dsh-modes,动作包括 list、read、toggle(force 可以固定自动开关的行)、followPlatform、applyRows(能力开关用,一次修改多行)、resetRow、reset、sync、repair、create(template 起步模板或 from 复制)、update、remove、usage、setDefault、prompt、setPrompt(base 冲突检测)、history、setLive、setPromptTool;并提供 dshModes 服务给下面两个模块使用。修改内置模式时,通过 configEditor.edit() 在 profile 里写入该模式行的覆盖;插件的显示信息来自 pluginInventory.list() |
rebase.js | 同步内置更新用的三方合并:以你上次同步时的内置插件列表为基准,把你的修改合并到最新的内置列表上 |
state.js | 插件自己的状态文件,放在 profile 目录的 .dsh-modes/ 下:state.json 记录每个模式上次同步时的内置插件列表(自定义模式还记录基于哪个内置模式、用了哪个模板),history.json 记录提示词历史 |
live-persona.js | 即时生效用的身份行:替换模式里的 @deepseek-ai/dsh-persona 行,注册同样的两个提示词分段,但每次组装提示词时读取这个模式最新保存的文字 |
prompt-tool.js | mode_prompt 工具:作为一行插件放进模式里,所以只有这个模式的会话能看到它;写入前通过 tools/pre-execute 要求用户审批 |
container.js | 自定义模式容器,配置里保存 presets 列表,并对每一项调用 agentPresets.register() |
client.js | Web 端设置页 |
cordis.patch.yml | 插入 index.js 和 container.js 两个宿主端插件行 |
安装
dsh plugin --profile web add dsh-modes
然后启动 dsh web,打开 设置 → 模式管理。卸载:
dsh plugin --profile web remove dsh-modes
插件做的修改保存在 profile 的 cordis.patch.yml 里,卸载插件不会删除它们:改过的内置模式在卸载后仍按修改后的配置运行。卸载前请注意:
- 先在提示词编辑器的「更多设置」里关闭所有模式的「即时生效」和「在对话里修改提示词」。这两项会在模式里放入本插件自己的模块,卸载后这些模式会因为找不到模块而无法使用
- 想完全还原,就把改过的内置模式恢复内置,并删除自己新建的模式
- profile 目录下的
.dsh-modes/文件夹可以一并删除
起步模板
模板都以内置的标准模式为基础,用「允许名单」决定保留哪些插件:名单外的行在创建时一律关闭,这样模板不会开启它没写明的工具。以后同步内置更新时,标准模式新增的插件也会以关闭状态加入,除非允许名单里有它。
| 模板 | 保留的能力 | 说明 |
|---|---|---|
| 开发 | 与标准模式相同 | 不改动插件和提示词 |
| 写作 | 文件读写与搜索、工作区指令、待办、交付文件、技能、上下文压缩、提问、时间 | 没有终端、子代理和网页 |
| 聊天 | 网页搜索与读取、上下文压缩、提问、时间 | 不碰文件和终端 |
| 只读调研 | 文件读取与搜索、网页、工作区指令、待办、技能、上下文压缩、提问、时间 | 文件工具设为只读(write: false、edit: false),没有终端 |
在 dsh 0.2.1-alpha.3 上,我们用本地假模型抓取了实际请求来验证:用「只读调研」模板新建的模式,发给模型的工具只有 ask_user_question、glob、grep、read、read_image、skill、todo_write、web_fetch、web_search、working_directory,没有任何写文件、编辑或终端工具;系统提示词也是模板里的那段。
系统提示词
提示词就是该模式身份行(@deepseek-ai/dsh-persona,开启即时生效后是本插件的 dsh-modes/live-persona)的配置:
prefix(开头)位于系统提示词的最前面,后面还会追加工具说明、工作区规则等内容;suffix(结尾)追加在这些内容之后。如果设了complete: true(例如极简模式),开头这段就是完整的系统提示词,结尾和其他内容都不会出现。{{model}}、{{provider}}这类变量在每一步组装提示词时替换成实际值。可用的变量以当前 dsh 实际注册的为准(例如0.2.0-rc.2还有{{cwd}},0.2.1-alpha.2起已移除),编辑器只列出当前可用的变量。DSH 严格校验变量,写错一个会让该模式下的每一步都失败,所以保存前(包括在对话里保存)会检查变量名是否已注册、格式是否完整,校验不过就拒绝保存。- 预览不需要真的创建会话:它用该模式当前版本的作用域组装提示词,不包含每一步注入的运行时上下文。
- 保存时会带上你开始编辑时的版本;如果服务器上的提示词已经不是那个版本,就返回
prompt-conflict,不会覆盖。草稿保存在浏览器的localStorage里(键名前缀为dsh-modes:draft:),只在当前浏览器有效。 - 即时生效时,dsh 会把新的系统提示词作为一条系统消息追加到会话历史里,而不是改写最开头那段,所以之前缓存的提示词前缀仍然可以命中;新提示词本身仍会多消耗一些输入令牌。这个变化和其他系统提示词变化一样,会记录在会话日志里。
在 dsh 0.2.0-rc.2 和 0.2.1-alpha.3 上,我们都用本地假模型抓取了实际请求,验证了:
- 开启即时生效后,保存提示词,同一个正在运行的会话下一步就用上了新提示词;
- 模型调用
mode_prompt追加一句话时,界面弹出审批;批准后工具返回「已保存,从下一步起对本会话生效」,下一次请求里就带上了追加的内容,历史版本里也记为「对话中」; - 没有开启即时生效时,保存后新建的会话使用新提示词,已经在运行的会话保持旧提示词。
已知限制
- 同步内置更新依赖上次同步时记下的内置插件列表。用 0.5.0 之前的版本改过的内置模式没有这份记录,第一次同步时无法区分「你改过的插件」和「官方改过的插件」,这些差异都会按你的修改保留;新增和删除的插件不受影响。之后每次保存都会补上记录
- 复制自其他自定义模式的模式,会沿用来源模式的同步基准;来源模式没有记录时(例如用 0.5.0 之前的版本创建),不提供同步
- 即时生效只对开头和结尾这两段文字生效;「完整提示词」「运行时上下文」两个开关仍只对之后新建的会话生效。开关即时生效本身也只对之后新建的会话生效
mode_prompt只读写开头这段提示词。dsh 的审批策略设为「从不」(例如无人值守运行)时,保存会被拒绝- 「已保存的会话」统计需要读取每个会话的日志;会话很多时最多统计 8 秒,未统计完会显示「至少 N 个」
- 写操作只依赖 dsh 自带的登录校验,没有额外权限确认
- 提示词草稿只保存在当前浏览器,换浏览器或清除站点数据后会丢失;提示词历史保存在 profile 目录下,换 profile 不会带过去
开发
npm test
运行同步内置更新所用三方合并的单元测试。