dsh-web-ui/packages/dsh-liangshen

5.1kStar311Fork49Issue5Watching

为 DSH 安装「梁神模式」两阶段锚定 agent preset:首轮只暴露官方 Minimal 双工具引导推理轨迹,锚定后切换到 PTC Mode 解锁全部工具能力

语言
TypeScript
License
Apache-2.0
分支
dev
deepseek-harnessdshdsh-pluginweb-ui

安装

$ dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-liangshen

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

把「Anchored Standard」思路做成 DSH 全家桶里的一键安装插件:宿主进程启动时把内置预设同步到 ~/.dsh/.agent-presets,新建会话在预设选择器里选择「梁神模式」即可启用。会话首轮只暴露官方 Minimal 预设的双工具(持久 bash + str_replace_editor)和一行 persona,把模型的执行轨迹锚定在 Minimal 上;锚定建立后自动切换到 PTC Mode(单一 run_code 工具),恢复完整工具能力,全程不需要手动配置。

核心能力

  • 同步内置梁神预设到宿主目录(~/.dsh/.agent-presets/liangshen),让新会话能在预设选择器里直接挑到「梁神模式」,升级插件后下次重启即自动更新
  • 第一轮请求只暴露 Minimal 预设的精确双工具与一行 persona,清空运行时上下文并只放行白名单消息(用户直接消息与 /goal 自动轮次),把模型执行轨迹锚定在 Minimal 上
  • 在首次 tool/call 后通过「首块推理含 we 且无 let me」的门控(或四步兜底、无工具首轮响应后自动晋升)切换到 PTC Mode:单一 run_code 工具,完整工具注册表通过生成 SDK 调用
  • 晋升后恢复全部 prompt section(含 plan mode 的 plan:policy),在 persona 末尾追加所选工作区路径,并把 workspace 指令与 skill 目录延迟一步注入,避免工具目录切换与注入冲击同帧落地
  • 通过 system-prompt 段向模型宣告插件存在、工作原理与限制(默认开启),使模型在用户提到「梁神模式 / 锚定模式 / anchored standard」时能据此协作
  • 附带 tools/analyze-session.mjs 离线分析器,可在不读原始 reasoning 的情况下测量会话的轨迹标记(we / let me / let's / I)与晋升边界

技术实现

  • 语言: TypeScript(宿主侧)+ 少量 .mjs(预设本身的运行时逻辑)
  • 关键依赖: @deepseek-ai/cordis(cordis 插件运行时)、@deepseek-ai/dsh-system-prompt(prompt section 注册)、schemastery(Config schema)
  • 架构模式: cordis bundle 包(host 半区单实例挂载,浏览器半区不存在);通过 inject: ['systemPrompt'] 等待 prompt 装配就绪后注册宣告段;预设以 presets/liangshen/agent.cordis.yml 形式挂入宿主 .agent-presets 目录,由宿主预设加载器解析;核心两阶段逻辑在预设内的 tool-bootstrap.mjs,通过 system-prompt/assemble / agent/pre-step / agent/request 钩子实现工具目录裁剪、消息白名单与 maxTokens 封顶
  • 入口文件: src/index.ts(cordis 插件宿主入口)+ presets/liangshen/agent.cordis.yml(预设清单)+ presets/liangshen/tool-bootstrap.mjs(两阶段锚定核心逻辑)

适用场景

希望在 DeepSeek V4 Pro 上稳定复现「首轮即按 Minimal 风格作答、随后解锁完整能力」这一轨迹形态的普通用户与高级用户。当标准预设或 PTC Mode 在首轮任务上效果不佳、又不想长期停留在仅有两个工具的 Minimal 状态时,这个插件提供了一条中间路径:首轮精确对齐 Minimal 的字节级表面以稳定轨迹,锚定后自动回到 PTC Mode 的完整能力。

前置依赖与兼容性

依赖最低版本说明
DSH0.1.0-rc.5+需要 preset 机制与 system-prompt/assemble 钩子(README.md:80)
Node^22.19.0 或 >=24.0.0来自 package.jsonengines;低于 22.19 存在非 ASCII 路径下 fs.cpSync 崩溃的 Node 22 回归(src/sync.ts:104-113)
平台macOS / Windows / LinuxmacOS 与 Linux 走持久 PTY shell;Windows 改用 custom-bash.mjs(Git Bash),状态不持久、无 OS 沙箱(presets/liangshen/agent.cordis.yml:112-149)
原生模块仅使用 node:fs / node:path / node:os 等内置模块

安装方式

dsh plugin --profile web add github:zhu1090093659/dsh-web-ui/packages/dsh-liangshen

配置项

插件宿主层的开关(写在宿主 agent.cordis.yml 的 liangshen row config 段):

配置类型说明默认值
enabled布尔总开关;关闭后既不同步预设也不宣告插件存在true
announceToAgent布尔是否向模型注册一段 system-prompt 宣告插件的工作原理与限制true

预设内 tool-bootstrap 段的可调参数(修改后需重启宿主才生效,默认值已对应实测高命中窗口):

配置类型说明默认值
shellTools字符串数组phase-1 暴露的持久 shell 工具名[bash]
commonTools字符串数组phase-1 暴露的另一个常驻工具[str_replace_editor]
messageSources字符串数组phase-1 放行的消息来源(用户消息 + goal 自动轮次;移除 goal 会触发 #578 死锁)[user, goal]
anchorGate布尔首次 tool/call 后是否等待首个 minimal-like 推理块才晋升true
maxBootstrapSteps数字锚定门控无果时的兜底晋升步数4
promoteAfterFirstResponse布尔首轮无工具调用的响应在发出后立即晋升;锚定门控会话也会在首轮 turn/end 释放true
bootstrapMaxTokens数字phase-1 请求的输出预算封顶;晋升后自动剥离,避免影响后续请求1024
compactionTools字符串数组压缩后到下次晋升前暴露的核心工作集[read, write, edit, glob, grep, todo_write, ask_user_question]
deferredSources字符串数组晋升后延迟注入的消息来源[agent-instructions, skill-catalog]
deferredGraceSteps数字晋升后上述来源延迟注入的步数1
promotedPresentation字符串晋升后工具目录的呈现形式(code 即 PTC Mode 单 run_code)code
instructionHint布尔晋升后用非命令式 hint 替代 AGENTS.md 全文注入(issue #388);关闭则恢复旧版全文注入true
phase1FirstCallInstruction字符串追加到 phase-1 persona 的可选指令;启用后偏离字节级 Minimal 表面,故默认关闭未设置

常见问题

Q: 梁神模式和官方 Minimal 预设是一回事吗?

A: 不是。Minimal 只保留两个工具但牺牲了完整能力;梁神模式是「两阶段」方案,首轮精确对齐 Minimal 的字节级表面以稳定执行轨迹,锚定后自动切换到 PTC Mode(单一 run_code 工具)恢复完整工具能力。

Q: 工具目录什么时候会变化?

A: 仅变化一次:会话出现首次持久 tool/call 并通过锚定门控(首块推理含 we 且无 let me,四步兜底),或首轮响应未调用任何工具即晋升。晋升后所有请求都呈现为 PTC Mode(单一 run_code)。因此第一与第二次请求之间会发生一次前缀缓存失效。

Q: 支持 Windows 吗?

A: 支持。Windows 上 DSH 的 PTY 后端不可用,插件会自动改用 custom-bash.mjs(通过普通跨平台子进程通道调用 Git Bash),仍注册同名 bash 工具;但 Windows 下 bash 状态不在调用间持久,也没有操作系统沙箱保护(README.md:17)。bashPath 可显式覆盖 Git Bash 推断路径。

Q: 如何验证插件确实生效?

A: 导出 session JSONL 检查 request/header:首份 header 应只含 bash/str_replace_editor;首次工具调用后变更的 header 应恰好为 run_code(PTC)。也可运行仓库自带的 node tools/analyze-session.mjs <session.jsonl> 自动汇总轨迹标记(we / let me / let's / I)与晋升边界。

Q: 怎么卸载?

A: 运行 dsh plugin --profile web remove @linxin666/dsh-liangshen 并完整重启 dsh web。如果此前装过 dsh-web-ui-all 聚合包,两边都会挂载同一份预设,需要先 remove 另一个再装这一个,避免双源挂载冲突(README.md:43-45)。

Q: 安装后需要做什么手动配置吗?

A: 不需要。插件宿主启动时自动把 presets/liangshen 同步到 ~/.dsh/.agent-presets,新建会话在预设选择器里选「梁神模式」即可。

Q: 可以在已有内容的会话中途切换到这个预设吗?

A: 不建议。预设的工作原理是把会话首轮的请求轨迹锚定到 Minimal 上,已产生内容的会话没有「首轮」可言,切换可能不会按预期生效(README.md:79)。

Q: 插件会发起网络请求或收集遥测数据吗?

A: 不会。源码与文档均明确插件不发起网络请求,也不增加遥测(README.md:78)。

上手难度

入门 — 装好插件后只需在新建会话的预设选择器里选「梁神模式」,无需编辑任何文件或命令行参数。

已知问题与限制

  • Windows 行为差异:PTY 后端不可用,phase-1 bash 改走 custom-bash.mjs(Git Bash),调用之间不保留状态,也没有操作系统级沙箱保护(README.md:17 / agent.cordis.yml:139-149)。
  • 首轮能力类问题可能基于裁剪视图回答:phase-1 有意只暴露双工具,「能联网吗」「能读 PDF 吗」之类问题可能基于被裁剪的工具集回答,晋升后才被纠正;可选开启 phase1FirstCallInstruction(默认关闭)要求模型先做一次 grounding 工具调用,或首轮直接问任务类问题(README.md:75)。
  • 前缀缓存会在第一、二次请求之间失效一次:因为工具目录只变化一次,介于两请求之间会有一次前缀缓存变化(README.md:76)。
  • messageSources 中必须保留 goal:若把 /goal 自动轮次从白名单中移除,会因过滤后没有响应/工具调用触发任何晋升分支,导致 goal 的 resume/pause 循环死锁(issue #578,tool-bootstrap.mjs:80-83)。
  • instructionHint 默认开启:issue #388 决定用非命令式 hint 替代晋升后的 AGENTS.md 全文注入;若你显式关闭以恢复全文注入,需要注意它会翻转已锚定的轨迹(agent.cordis.yml:85-91)。
  • 不要在已产生内容的会话中途切换预设:切换可能不按预期生效(README.md:79)。
  • 预设与 shell 访问具有相同信任等级:preset 文件由插件维护于 ~/.dsh/.agent-presets,安装前可自行审阅 presets/liangshen/;插件不修改 DSH 源码(README.md:77)。