前言¶
在 DeepSeek Harness(DSH)里,Agent 预设决定工具面、系统提示段落和 skill 目录等组合。官方 UI 只在空白会话(发出第一条消息之前)允许切换 preset;会话一旦开始,agentPresets.select() 会以 agent-preset/locked 拒绝变更,registry 的设计是「组合在会话创建时确定」。
实际聊天里,经常是聊到一半才发现需要另一套组合:普通会话里忽然要写插件,想切到 cordis;在 cordis 里做完开发,想切回 standard;或临时用 minimal / ptc 控制上下文与工具暴露面。新开一条会话会丢掉当前上下文,只在前端改 preset 又做不到。下面介绍社区插件 dsh-preset-hotswitch(维护者 Dax233,分类:工作流),它用 registry 公开服务在已开始的会话里热切换预设,并把选择写入会话事件,重启 DSH 后仍保持。
这是什么¶
dsh-preset-hotswitch 是一个 Host-only 的 DSH 插件(版本 0.1.0,MIT),只做一件事:让已经聊到一半的会话热切换到另一个 Agent 预设,不用新开会话。
实现上依赖 agentPresets.recompose() 重新绑定会话组合,再追加 agent-preset/selected 事件,让 registry 的 agentPreset 投影在恢复会话时重放这次选择。README 标明为实验性:recompose() 的 JSDoc 自述「由调用方负责空白检查」,本插件刻意跳过该检查,依赖 DSH 0.2.1-rc.3 的实现细节;升级 DSH 后可能失效(失效会以普通工具错误返回,不会改坏会话)。
- 目录页:https://www.skillhub.cn/plugins/Dax233/dsh-preset-hotswitch
- 源码:https://github.com/Dax233/dsh-preset-hotswitch
核心功能¶
插件通过 ctx.effect 注册模型面向工具 switch_session_preset,注入 tools、agents、agentPresets 服务。
| 参数 | 必填 | 说明 |
|---|---|---|
preset |
否 | 目标 preset id。不传时只报告当前绑定与可用 id,不切换 |
行为要点:
- 不传
preset:返回本会话的current与可用presets列表。 - 传
preset:把调用本工具的会话重新绑定到目标预设,返回切换前后的 id;工具组合与提示词从下一次请求开始生效。 - 目标与当前相同时为 no-op;目标不存在、激活失败或记录失败时返回
ok: false与原因。
recompose() 会立即重新绑定并触发 tools/change;当前正在执行的请求仍用旧组合。插件随后 append('agent-preset/selected', { agentPreset }),会话恢复/重启后保持新预设。会话创建头里的 agentPreset 不会被改写,选择只以事件形式追加。
只影响调用工具的当前会话(exec.agent 上下文),不改默认预设,不批量改其它会话。子 agent(subagent)会话会被拒绝;父会话切换后,已有子会话保留旧组合,之后新建的子会话才继承新预设。
安装与启用¶
要求 DSH ^0.2.1-rc.3(提供 agentPresets 服务)、Node >=22。装完需重启 DSH Desktop。Host-only bundle,无额外依赖,不改 profile 配置。
安装命令(来自 README 原文):
dsh plugin --profile desktop add github:Dax233/dsh-preset-hotswitch
插件以当前 DSH 进程权限运行;安装前建议在 GitHub 查看 lib/index.js 与 LICENSE,自行判断是否信任维护者代码。
典型用法¶
让 Agent 在需要时调用 switch_session_preset。不传参数可先查当前与可用 id:
示例输出(README):
{"session":"session-233741f7","current":"ptc","presets":["standard","ptc","minimal","cordis"]}
切换到 cordis 时传入 preset,成功时类似:
switched session session-233741f7: ptc -> cordis (effective on the next request)
ptc 组合下工具面只允许直接调用 run_code,本工具需在 run_code 程序内调用,例如 tools.switch_session_preset({ preset: 'cordis' });切回其它组合后恢复直接调用。
没有 UI 按钮;历史消息不会按新预设重写,后续请求才换一套组合。
适用场景与注意¶
适合:已在进行中的主会话里,临时换 preset 而不丢对话历史;开发插件与日常任务之间在 cordis 与 standard 等之间来回切。
限制与注意(均来自 README):
- 目标 preset 必须存在且可挂载;切换后若缺少某工具,是预设组合差异,不是切换失败,可再切回。
- 同一 preset id 的新 revision 不会刷新:no-op 只比较 id;改 preset 定义后需重启 DSH 或新开会话才能重新挂载。
- DSH 升级后请重新核对
recompose/composedPreset/list的契约。
社区插件目录 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本插件是工作流类补充,星标与成熟度以仓库为准。
结尾¶
dsh-preset-hotswitch 把「只能空白会话选 preset」的限制,收窄为一条可审计的工具调用:热切换、下一次请求生效、重启仍保持,并明确拒绝 subagent 与错会话绑定。若你经常在会话中途换工具面,可在新会话里先验证再用于重要对话。
- SkillHub 目录:https://www.skillhub.cn/plugins/Dax233/dsh-preset-hotswitch
- GitHub:https://github.com/Dax233/dsh-preset-hotswitch