跳到主内容

dsh-advisor

14Star2Fork0Issue0Watching

为 DSH 会话挂一个独立评审模型:观察主会话 transcript,按 nit/concern/blocker 三级严重度把建议注入回主循环,不接管也不递归评审自己。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
TypeScript
License
MIT
分支
main
advisordeepseek-harnessdeepseek-harness-plugindshdsh-plugin

安装

命令web profile
$ dsh plugin --profile web add github:btspoony/dsh-advisor

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

对话式安装

帮我安装 DeepSeek Harness 插件 btspoony/dsh-advisor:先查看仓库 https://github.com/btspoony/dsh-advisor 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

为 DSH(DeepSeek Harness)会话挂一个独立的评审模型:观察主会话 transcript,按 nit / concern / blocker 三级严重度把建议注入回主循环,既不接管主代理的动作,也不递归评审自己发出的建议。

核心能力

  • 按会话运行一个独立的评审模型,每个 stepped 主 turn 评审一次;评审模型和主代理完全隔离,只发建议、不执行工具
  • 按严重度把建议投递到主循环:nit(轻微样式 / 清晰度建议)走非唤醒通道、concern / blocker(值得停下权衡 / 明显继续就是在浪费工作)走唤醒通道并带可配的冷却步数
  • 评审模型和 provider / model 由用户在 advisor 命名空间显式声明,启用时未同时填齐就拒发起模型调用(硬门禁,不是警告),未知配置键会直接拒绝加载
  • 失败策略不卡主循环:限流 / 配额耗尽时只丢弃自己有界 backlog,永久错误进入 halted,任何状态下主代理都不会被阻塞或污染
  • 支持三条等价的配置面:profile 补丁层、web Settings 的 Advisor 卡片、dsh-tui /settings 的 Advisor 分节(dsh-tui ≥ v0.8.0),保存后新会话立即生效、无需重启
  • 在会话里用 /advisor(toggle)或 /advisor on / off / status / config 临时控制本会话评审;这些命令只翻转会话级 override,永远不会写入持久化配置

技术实现

  • 语言: TypeScript(host 端 + client 端 React 组件),输出 ESM
  • 关键依赖: @deepseek-ai/cordis ^4.0.1(host 服务注入)、@deepseek-ai/dsh-session / @deepseek-ai/dsh-agent / @deepseek-ai/dsh-llm(订阅会话事件、调用评审模型)、@deepseek-ai/schemastery ^3.18.1(设置 schema)、@deepseek-ai/dsh-typert-protocol + @deepseek-ai/dsh-typert-registry(自建 /api/advisor/get|set 网关通道)
  • 架构模式: mount-only cordis 插件——cordis.patch.yml 只插入一行 id: advisor;host 端通过订阅 session/event / agent/created / agent/disposed 驱动观察器 → 评审运行时 → 投递路由 → 发射守卫;client 端通过 settings.plugin.item 插槽注册设置卡片;自带 typert 网关是唯一读写 advisor 命名空间的用户层路径,不修改 dsh 源码
  • 入口文件: src/index.ts(host 端 apply() + name + inject: ['sessions','agents','llm'])、src/client/index.ts(client 端 React 组件注册),分别被 bundle patch 与 dsh.client.inject 列表装载

适用场景

想给 DSH 会话配一个「旁观者清」的二审模型、但又不希望它接管主代理的工具调用时使用:评审模型在每个 stepped 主 turn 后独立调用一次,按 nit/concern/blocker 把建议插回主会话,主代理拿到的是带 [advisor:{severity}] 前缀的 user-role 消息。适合需要持续捕捉方向偏离、明显的代码异味、或者与用户原意相悖行为的开发者;不适合需要工具自验或并行多个评审者的场景(这两类显式不在 MVP 范围内)。

前置依赖与兼容性

依赖最低版本说明
DSH^0.1.1-rc.2所有 @deepseek-ai/dsh-* peer 依赖均为 ^0.1.1-rc.2(package.json:53-69);dsh-tui /settings 面板需要 ≥ v0.8.0(README.md:50、docs/configuration.md:7)
Node.js`^22.19
平台跨平台package.json 未声明 os / cpu,无原生模块依赖
原生模块无不引入 node-pty、node:sqlite 等原生绑定

安装方式

dsh plugin --profile web add github:btspoony/dsh-advisor

配置项

所有配置都落在 dsh 设置文档的 advisor 命名空间下,可通过 web Settings 的 Advisor 卡片、$DSH_HOME/settings.yaml 文件、或 dsh-tui 的 /settings 区域编辑。说明列写人话,完整字段约束见 docs/configuration.md。

配置类型说明默认值
enabledboolean总开关;关闭时插件完全 no-opfalse
provider字符串(启用时必填)评审模型走哪个 provider 路由;空字符串也会被门禁拦下未设置
model字符串(启用时必填)评审模型 id;空字符串也会被门禁拦下未设置
systemPrompt字符串自定义评审 prompt;留空则用内置的严重度定义 + JSON 输出契约""
immuneTurns整数 ≥ 0刚送过一次打断性 note 后,必须先完成多少个 stepped 主 turn 才能再送下一次;窗口内新的打断性 note 自动降级为 inject3
maxDeltaMessages整数 ≥ 0每次评审送给评审模型的 transcript 增量上限;超过则截断并标注;0 表示无上限60

未知键会被严格拒绝并阻止插件加载;enabled: true 但 provider / model 缺失或仅含空白,会被解析为「禁用并给出原因」,状态查询可见,运行时不发模型调用。

常见问题

Q: 装上之后默认就会开始评审吗?

A: 不会。enabled 默认是 false,插件默认零侵入。需要先在 Advisor 卡片(或 settings.yaml)里打开 enabled,并同时填好 provider 和 model,否则评审模型根本不会发起调用,状态会显示「禁用并给出原因」。

Q: 我打开了开关,但 provider / model 还没填,怎么办?

A: 这是「硬门禁」而不是警告:插件永远不会调用评审模型,/advisor status 会给出具体原因(缺 provider、缺 model、或两者都缺)。web 卡片在这种情况下会直接阻止保存;dsh-tui /settings 没有跨字段校验,可能保存后还是被门禁拦下,行为一致。

Q: 评审意见会以什么形式进入主会话?

A: 作为一条带 [advisor:{severity}] 前缀的 user-role 消息。nit 不打断主代理、在下一个 pre-step 边界消费;concern / blocker 唤醒主代理立即权衡;为了避免评审风暴,刚送过一次打断性 note 后必须先完成 immuneTurns 个 stepped 主 turn,下一条打断性 note 才能再次唤醒,期间会自动降级为 inject。

Q: 怎么在单个会话里临时开 / 关评审?

A: 输入 /advisor 切换、或 /advisor on / /advisor off 显式控制,/advisor status 看当前会话的开关 / provider / model / 运行时状态(running / paused / quota_exhausted / halted / disabled)/ 待处理数 / 最近一次注入时间。这些命令只翻转本会话的临时 override,不会写入持久化配置。

Q: 评审模型被限流或挂了,会影响主代理吗?

A: 不会。失败策略只丢评审自己有界 backlog;quota 耗尽进入 quota_exhausted(需 /advisor on 手动恢复,无自动恢复计时器);永久错误(如凭据失效)进入 halted(/advisor on 会原地重建一个全新的评审实例)。任何状态下主循环都不会被阻塞或被污染。

Q: 我能在 dsh-tui 终端里编辑这些配置吗?

A: 在 dsh-tui ≥ v0.8.0 的 /settings 屏幕里可以编辑 enabled / provider / model / immuneTurns / maxDeltaMessages 这五个键;systemPrompt 故意没做进 TUI 字段(单行输入控件会截断多行 prompt),请用 web 卡片或 settings.yaml 编辑。低于 v0.8.0 的 dsh-tui 会干净地 no-op,仍可以走文件或 /advisor config 回读配置。

Q: 我在配置里写错了键名(比如多了个空格或多打了一个字段),会被悄悄忽略吗?

A: 不会。advisor 命名空间走严格 schema,未知键会直接抛错并拒绝插件加载;如果错的是 settings user layer(web 卡片 / TUI 写入),热路径会落到带原因的「禁用」状态,永远不会发起模型调用。

Q: 卸载需要做什么额外操作吗?

A: 跑 dsh plugin --profile web remove dsh-advisor(或对应的 dsh-tui profile)然后重启会话即可。插件没有任何 postinstall 钩子,也没有改过 dsh 源码,卸载是干净的。

上手难度

进阶 — 启用门槛很低(卡片打开开关 + 填两个字段),但要理解 advisor 的语义(inject vs steer 的区别、immuneTurns 冷却、emission guard 去重、单评审者守卫)需要先读几分钟配置文档;不需要改任何 dsh 源码。

已知问题与限制

  • 每个会话只有一个评审者实例,不支持并行评审者 roster 或基于 WATCHDOG 配置文件自动发现(README.md:97)。
  • 评审者只能发建议,没有任何 advisor 工具——它不能自己读文件 / 跑命令验证自己的怀疑(README.md:98)。
  • 没有会话内的 advisor 面板:建议只以注入消息的形式出现在主会话里;web Advisor 卡片是配置面板,不是会话视图(README.md:99)。
  • 没有 transcript 持久化、没有成本统计:插件不写自己的 advisor 历史,也无法做成本可观测(README.md:100)。
  • transcript 里的 secrets 不会被混淆,会原样到达评审模型;如需保密请配可信的私有评审模型(README.md:101)。
  • 没有「不安全输出的隔离区」:评审模型理论上可以在 note 里塞指令性文本,目前的缓解仅有 JSON 帧 + 校验 + advisory-only 包装(README.md:102)。
  • 没有 syncBacklog 追赶等待:评审模型严重落后时不会等主循环,有界 backlog 直接丢弃,note 可能晚于下一个主 turn 送达(README.md:103)。
  • 评审上下文有界(maxDeltaMessages):长会话超过窗口后早期内容会被截断,compaction 后评审模型可能丢失早期上下文(README.md:104)。
  • 单评审者守卫(globalThis.__dshAdvisorReviewer__):当 host 同时 compose 多份 dsh-advisor fiber 时,只有第一份真正接管观察 / 运行时 / 指令;后续 fiber 只尝试注册 settings 命名空间并在已注册时干净 no-op(src/index.ts:80-99、src/index.ts:319-323)。

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/btspoony/dsh-advisor)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录