dsh-decision-layerv0.7.5
xbzbing/dsh-decision-layer
dsh plugin --profile web add github:xbzbing/dsh-decision-layer#0b94670c934de7dbb104e40e0042edaeb057d333
介绍
A structured decision layer for the DeepSeek Harness agent loop, backed by a pluggable adjudication model (dev / laya).
标签
概述
dsh-decision-layer
English | 简体中文
DeepSeek Harness(DSH)的结构化裁决插件。它把有明确判断标准的问题交给同协议的裁决后端,供 agent 在需要时使用,并在 agent loop 上接入危险门控、产出自检、工具收窄和防循环等自动介入。
0.7.5 是体验版。 插件功能已可用,但裁决介入能带来多少实际价值仍在探索中——各决策点的阈值都是未经验证的启发式默认值,建议先以观察心态体验,别当成经过验证的效果保证。功能与后续进度以 ROADMAP.md 为准。
安装
已发布到 npm 与 GitHub Release。
从 npm 安装(补 @latest):
dsh plugin --profile web add dsh-decision-layer@latest
或从 GitHub Release 安装:直接用对应版本 tgz 附件的 URL 安装。
dsh plugin --profile web add https://github.com/xbzbing/dsh-decision-layer/releases/download/v<版本>/dsh-decision-layer-<版本>.tgz
仓库不再提交构建产物lib/(ADR-0012),因此不带 ref 的github:xbzbing/dsh-decision-layer安装不可用——那样拿到的是没有lib/host/与lib/client.js的源码树,插件加载不了。GitHub 侧请用上面的 Release 附件。
也可从源码本地构建后用 file: 安装:
npm ci --ignore-scripts
npm run build
dsh plugin --profile web add file:/绝对路径/dsh-decision-layer
安装或更新后需重启 dsh web 服务再刷新页面:host 与 client 两半在服务启动时生成挂载与 bundle 清单,仅刷新页面可能看不到变化。插件管理 API 只接受本机 loopback Web 服务上的同源请求;把 DSH Web 绑定到所有网卡时该接口会拒绝请求。不要在未确认目标地址和数据流向前填入生产 Key。
功能
- 手动裁决:
decision_evaluate工具与decision-layerskill 可显式提交noul/score/choice问题,decision_check_connection做连通测试;手动调用不计入自动裁决指标,也不改变 agent 行为。 - 危险门控:破坏性工具调用执行前用脱敏摘要请后端裁决,只有高置信「拒绝」才拦截;放行、询问、低置信、后端失败或响应不合法一律不介入,按宿主原路径执行。危险规则与拦截置信度门槛可配。门控日志带脱敏命令 / 路径与本轮任务节选,便于回看拦截是否合理。
- 产出自检与质量趋势:回合结束给最终回复打分(0–2),默认只记录;可开启低分补完,同一回合最多补一次。连续多次高置信低分时,dock 触发器图标会从灰变橙、变红作为提醒。自检日志带回合号与同一套任务节选,低分行另有「低评分」标记;决策分析页可一键「只看低评分」,长会话里也能直接定位到被打分的回合(低置信低分仍标为噪声,可忽略)。
- 工具收窄:回合开始时、以及同一回合内你提出新要求时,按任务相关性摘掉可选工具,只在宿主已允许的集合内取交集、不扩权;每次重新判断前先释放上一轮的旧限制,回合结束即解除,时间提示、后台通知等非用户要求不会触发重判。核心工具与保留前缀命中的工具始终保留,可选工具过多时自动降为仅观察、保留过少时视为判定不可信并跳过,对小上下文后端自动分批。默认真正生效,也可切到仅观察。收窄日志附带回合号、步骤号和可展开的任务节选,便于对照被摘除的工具评估判断是否合理;旧日志不会补录场景。宿主在本步决策点触发前就已确定工具集,所以摘除从下一步起才进入模型请求;收窄只作用于工具通道——回复正文里的 UI 围栏、技能说明等非工具能力不受影响。
- 任务完成核对:用户明确列出多个交付条件时,逐项判定「已满足 / 未满足 / 证据不足」,条件只取本回合最近一次要求(避免旧清单被恢复),以本回合工具证据为准(上一回合的成功不算数,回复自述不算证据);默认只观察,可配补完。
- 只读过程检查(默认关闭):默认关闭,在插件详情页高级设置启用后,可在同一回合没有新用户输入时按进展心跳、持续未解决失败或验证后又修改产物安排后台检查。使用当前要求与有界工具证据,结果为「未见需复核问题 / 值得复核 / 证据不足」,低置信判断保持不确定;不追加提示、不限制工具、不改变已有自检/完成核对。每会话单在途、合并最新候选、滚动预算和短截止时间;错误、关闭、取消或任务变化不阻塞主任务。参数和边界见 ADR-0017。尚未取得效果对照数据。
- 防循环:同一调用连续重复超过阈值即拒绝,确定性本地逻辑,不依赖后端;不受各决策点开关影响,但会话总开关关闭时同样暂停。
- 会话面板与决策分析页:面板展示自动裁决指标、会话总开关和最近日志;「决策分析」tab 按会话展示过程画像、趋势回测与判断准确度,并支持逐条标注和开关本会话的自动介入。
- 配置与持久化:各决策点可独立开关,阈值在插件详情页调整,写入
~/.config/dsh-decision-layer/config.json并热生效。默认值与字段说明见 ADR-0006。也可直接手改该文件,但只能写合法值:越界、拼错字段名或类型不符会让整份配置校验失败,配置页读不出来,各决策点退回各自的安全默认(见 ADR-0005)。决策日志与会话指标落盘 30 天,供回看和校准。 - 可插拔后端:默认
https://api.typesafe.ai、jev-latest,URL、Key、model 可逐字段覆盖;仅支持同协议端点,未配置 Key 时不发请求。自定义http://地址需针对该 URL 确认明文传输风险,地址变更须重新确认。
隐私与后端
配置 Key 后,插件默认把裁决请求发往远程端点 https://api.typesafe.ai(模型 jev-latest)。裁决会携带具体上下文:
- 门控:工具名与脱敏后的命令 / 路径摘要(各最多 2048 字符),不含对话内容。
- 产出自检:本轮请求、最近必要的用户要求与 AI 回复(作背景,各有限额度,已遮蔽凭据),以及本轮最终回复(开头与结尾合计约 24K 字符;超长回复的中间部分会标注省略,避免只看开头漏掉结论)。
- 工具收窄:当前有效请求、必要前文与最近执行进展(工具名、成败、有限的命令 / 路径与 shell 结果摘录)与候选工具的名称 / 描述。
- 过程检查(默认关闭):启用后发送当前要求和当前窗口的有界工具名、成败、脱敏命令/路径及 shell 摘录;不发送文件读取、搜索或网页结果原文、reasoning 或 PTC 脚本。输入限额和过期规则见 ADR-0017。
- 完成核对:从本回合最近一次用户要求中提取的交付条件(最多 20 条,不合并同一回合的多次要求)、本回合最近一次要求与必要前文(作背景,已遮蔽凭据)、本回合工具证据(工具名、成败、有限的命令 / 路径,shell 类工具另有有限结果摘录,并对无标签的长随机串再遮蔽一次)、回复前约 8K 字符。文件读取、搜索与网络工具的结果原文不外发。
- 手动裁决:
decision_evaluate与decision-layerskill 会把 agent 提交的内容原样发送。
进入裁决的用户消息只取真实的那些,时间提示、运行环境、记忆片段、系统提醒与后台通知等宿主注入内容会被排除或剥离;但用户自己粘贴进对话的内容仍会离开本机。远程服务提供方可能记录、留存或用于其他用途,具体取决于其服务条款;脱敏和截断只降低风险,不等于匿名化。
本地还会落盘两类数据,各保留 30 天:决策日志在 ~/.config/dsh-decision-layer/logs/,会话快照在 ~/.config/dsh-decision-layer/state/,其中包含脱敏后的命令 / 路径;各决策行的任务节选最多 512 字符(过滤记忆 / 系统提醒注入块并遮蔽常见凭据写法),行上可带回合号与步骤号。落盘不额外保存完整前文、执行进展、工具结果或回复原文,只保留节选与决策计数;过程检查另保存触发类型、证据截至序号和候选数量,自动裁决可保存请求关联 id、耗时、后端请求次数和已报告用量。未知用量不补零,重试时成功响应的 usage 不代表所有尝试的总计费;插件卸载后仍未结算的请求可能缺失最终成本记录。节选展示在本地会话面板和决策分析页,外发内容以上一节逐项列出为准,可按需自行清理。
会话内容敏感时,推荐改用本地部署的模型,让裁决数据不出本机。tev1 可经 ollama 原生的 /v1/systemone 端点直接接入,部署步骤见 用本地 tev1 配合插件(部署指南);其他本地模型只要提供兼容 /v1/systemone 的端点,同样可以在配置页把服务地址指向本机。
安全边界
自动介入只减不增:门控只拒绝、收窄只删工具,都不给 agent 新权限。危险门控采用两档模型,只在模型高置信判定拒绝时拦截;后端失败、低置信或响应不合法时一律不介入、按原路径执行,不因裁决故障阻断,也不替宿主放行。自检、收窄与防循环异常则跳过介入。发送到后端的危险摘要只含工具名与命令 / 路径并对疑似密钥脱敏,插件不读取文件内容;但命令本身(如 heredoc、echo 写入的文本)会原样计入摘要。
开发
服务端与客户端都是 TypeScript(严格模式):npm run build 用 tsc 检查类型、esbuild 产出 lib/host/*.js 与 lib/client.js(ADR-0015),npm test 先构建再跑本地测试,npm run check 与 CI 等价(构建 + 测试 + npm pack 断言)。运行期需要 Node.js >=20.11。
构建产物不入库(ADR-0012):lib/ 已被 .gitignore 覆盖,源码是唯一事实来源。发布由 GitHub Actions 的 release.yml 完成——构建、跑门禁、npm pack,并用 scripts/assert-pack.mjs 断言产物里确实有 host 入口与 lib/client.js、且没有源码泄漏,之后才发 npm / 建 Release。该 workflow 在版本号变更推入 main 时自动执行;npm 侧使用 Trusted Publishing(OIDC),不依赖长期 token。
架构决策记录见 docs/adr/:每条规则为什么存在、当时放弃了哪些备选。0.7.5 为体验版:介入能力已可用,但实际价值与阈值仍在探索,欢迎反馈决策日志观察到的误判与体感。
星级评价
基本信息
插件信息来自公开 GitHub 仓库与 SkillHub,版权归原作者所有;安装前请自行审查仓库代码。