dsh-preset-hotswitch:会话中途热切换 Agent 预设

前言

在 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜