dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
子代理模型管控:由 Jev 判定本轮任务类别,再把子代理自身的请求改写为该类别对应的 provider、model 与推理强度(在 agent/request 钩子上执行);会话内可用继承/自动/手动三种方式指定模型,每个角色可带一条先于任务注入的前置提示词,并可离线回放历史判定。
专为 DeepSeek Harness 用户与开发者 打造的 子代理模型决策与分流扩展,解决 子代理无法独立选型、复杂任务与琐碎任务共用高配主模型导致算力浪费与响应缓慢 的痛点。
背景与痛点 • 核心特性 • 效果预览 • 快速上手 • 使用指南 • 核心机制与判定流转 • 离线策略回放 • 开发与测试 • 由来与致谢 • 开源协议
在 DeepSeek Harness (DSH) 原生的多智能体调度与协作体系中,派发子代理(Subagent)通常面临以下结构性痛点:
dsh-subagent-custom 针对上述问题构建了一套前置判定与模型重写方案。它接入 TypeSafe System One 架构的 Jev 分类器,在毫秒级时延内对用户任务完成多维结构化评估;同时在底层拦截并硬性改写子代理的模型与推理参数,实现子代理选型的精细化管控。
agent/request 拦截请求,直接改写子代理的 provider、model 与 reasoningEffort,覆盖调用方的默认传参,确保调度决策百分之百落地。auto)时生效,且对同一个子代理只注入一次。mode):控制后台分类器的侦听行为(off 关闭、once 按触发词判定、auto 全自动评估)。selections.<会话>.mode 里,由输入框上方的选择器写入):控制当前会话对子代理模型的绑定行为(inherit 继承主模型、auto 依 Jev 判定自动映射、manual 手动指定固定模型与思考程度)。adoptedClasses 防重标记保障幂等性。| 输入框模式切换器 | 「子代理模型」边栏标签页 | 插件可视化设置卡片 |
|---|---|---|
![]() | ![]() | ![]() |
| 位于主模型选择器右侧:继承主模型、交给 Jev 自动分配,或从列表中手动指定模型 | 当前会话状态、每个角色跑在哪个模型上,以及最近派发流水 | 提供商预设、决策档位,以及每个角色所用的模型与前置提示词 |
💡 注:三张均为实际界面截图(桌面端)。
>= 22.0.0pnpm(建议 >= 9.0.0)^0.1.7-rc.2 或兼容版本@deepseek-ai/schemastery: >=3.18.1@deepseek-ai/dsh-typert-protocol: >=0.1.7-rc.2 <0.3.0@deepseek-ai/dsh-llm: ^0.2.0-rc.2 || >=0.1.0-rc.6 <0.2.0(可选)本项目已发布至 npm 官方注册表,下面三条路任选其一。
甲:在 DSH 桌面端安装(推荐):
dsh-subagent-custom——该输入框也接受 GitHub 仓库地址或本地目录路径;💡 插件安装后暂不支持自动更新。需要升级时,先在插件页面卸载,再按同样步骤安装新版。
乙:从命令行安装(适用于 web 这类命令行管理的配置档):
dsh plugin --profile web add dsh-subagent-custom
丙:从源码本地打包(想改动源码时):
获取源码并编译客户端资源:
git clone https://github.com/xingzhen199186/dsh-subagent-custom.git
cd dsh-subagent-custom
pnpm install
node scripts/build-client.mjs
打包生成插件安装包:
pnpm pack
执行完成后在项目根目录生成 dsh-subagent-custom-<版本号>.tgz。
安装这一份本地包:回到桌面端「添加插件」,填入该 .tgz 文件(或项目目录)的完整路径,点击「安装」;命令行管理的配置档则用 dsh plugin --profile web add <该路径>。
⚠️ 注意: 插件包含宿主侧(Node.js 服务端)拦截逻辑。安装或更新插件后,必须重启 DSH 桌面端应用,宿主侧注入服务方可完全生效。
本插件包含两个层级不同、职责分明的开关体系,请避免混淆:
| 控制维度 | 开关配置位置 | 可选枚举值 | 核心职责 |
|---|---|---|---|
| 插件全局侦听模式 | 插件全局设置面板 (config.mode) | off / once / auto | 控制后台判定服务何时介入: • off:完全关闭监听与判定,零调用开销;• once:仅当用户输入命中触发词(如 /route、/jev)时单次评估;• auto:对每一轮用户普通输入均进行判定。 |
| 会话模型绑定模式 | 对话输入框上方选择器(写入配置的 selections.<会话>.mode) | inherit / auto / manual | 控制当前会话如何约束子代理模型: • inherit:继承主模型或调用方原有参数,不强行重写;• auto:依据 Jev 判定结果,自动挂载预设角色与对应模型;• manual:会话内固定锁定用户选定的模型与思考程度。 |
出厂预置 5 个角色 与 8 种任务类别。设计遵循「角色代表执行者身份(Worker),类别代表具体工作性质(Work)」原则:
角色名称 (Role) | 默认绑定模型示例 | 承接的任务类别 (Task Class) | 出厂策略状态 |
|---|---|---|---|
junior | openrouter/qwen3.8-flash | mechanical(格式化、重命名、样板代码、注释整理等有明确规约的机械改动) | 默认派发 |
implementer | openrouter/deepseek-v4-flash | bugfix(根因已知、改动范围可控的缺陷修复) | 默认派发(兜底角色) |
researcher | openrouter/qwen3.8-flash | research(查阅代码、收集事实、对比方案,不做代码修改) | 默认派发 |
reviewer | openrouter/qwen3.8-flash | review(审查已有代码差异、PR 或技术方案,指出缺陷而非动手修复) | 默认派发 |
writer | openrouter/qwen3.8-flash | documentation(编写或修订面向读者的 README、发布说明、Changelog 等) | 默认派发 |
| (无绑定角色) | (由主模型承接) | feature_work(引入产品新行为的新增功能开发) | 出厂故意闲置,交给主模型 |
| (无绑定角色) | (由主模型承接) | refactor(不改变对外行为的代码重构,涉及设计权衡) | 出厂故意闲置,交给主模型 |
| (无绑定角色) | (由主模型承接) | meta_chat(闲聊、问答或单纯规划,本轮不产生代码任务) | 出厂故意闲置,交给主模型 |
💡 设计说明:
junior与implementer虽均涉及代码修改,但机械性修改规格清晰无须深度排查,而缺陷修复需要排查根因。拆分后可避免为简单重命名支付高昂算力成本。feature_work、refactor与meta_chat涉及复杂系统设计与全局上下文,出厂默认不在派发白名单内,故意留给主模型自身处理。
在插件设置页的「路由」区域,每个角色下方均提供了一个可展开的输入框,中文标注为「这个角色的前置提示词(以一条消息注入,先于任务)」,对应配置项为 routes.<角色>.prompt。
auto(由 Jev 决定本轮模型);manual 与 inherit 不注入:
manual)时,由用户直接指定具体模型,全程没有角色参与。此时若强行塞入角色提示词,相当于让一个手动挑选的模型去扮演它未被赋予的角色,效果适得其反。inherit)同理,直接沿用主模型而不经由角色分流,因此同样不注入。| 运行情形 | 是否注入前置提示词 | 说明 |
|---|---|---|
会话模式为 auto 且该角色被 Jev 选中(已配提示词) | 注入 | 仅在子代理首步作为独立消息注入一次 |
会话模式为 manual(手动指定模型) | 不注入 | 无角色参与,避免手选模型被迫扮演未指定角色 |
会话模式为 inherit(继承主模型) | 不注入 | 直接沿用主模型配置,无角色参与 |
| 目标角色未配置提示词(内容为空) | 不注入 | 未配置时不执行任何消息注入 |
支持在 DSH 插件设置页或配置补丁中调整以下参数:
配置字段 (Key) | 类型 | 默认值 | 说明与有效取值 |
|---|---|---|---|
mode | string | "off" | 插件激活模式:"off"、"once"、"auto"。 |
triggers | string[] | ["/route", "/jev"] | once 模式下的触发指令前缀。支持 /route preview <任务> 仅评估不派发。 |
provider | string | "typesafe" | 判定提供商预设:"typesafe"、"bai"、"openrouter"。 |
endpoint | string | 依预设 | Jev 判定服务端点地址(预设提供,高级自建网关可覆盖)。 |
apiPath | string | 依预设 | Jev API 路径(预设提供,高级覆盖项)。 |
apiKeyEnv | string | 依预设 | 密钥环境变量名或凭据项。 |
model | string | 依预设 | 判定模型标识(例如 "jev-1.13.0" 或 "jev-1.13")。 |
timeoutMs | number | 4000 | 判定请求超时时间(毫秒)。超时后触发静默放行机制。 |
stateChars | number | 1200 | 送往判定服务的任务状态文本长度截断上限(从头部截取)。 |
activeProfile | string | "auto" | 当前生效的决策档位:"auto"(常规)、"careful"(严苛)。 |
defaultRoute | string | "implementer" | 未匹配到细分任务类别时的兜底路由角色。 |
logDir | string | null | 判定流水 NDJSON 日志目录;留空或 null 表示不持久化日志。 |
logTurnText | boolean | false | 日志是否记录用户对话原始文本;默认 false 仅记录评估指标元数据。 |
[ 用户发送对话 / 触发任务 ]
│
▼
┌─────────────────────────┐
│ 是否具备子代理派发环境? │
└────────────┬────────────┘
否 │ 是 (具备 subagent 工具且调用深度允许)
┌───────────────────┴───────────────────┐
▼ ▼
[ 保持原样直通 ] [ 插件运行模式 mode ]
┌────────────────┴────────────────┐
mode="once"(未带触发词) mode="auto" 或带触发词
│ │
▼ ▼
[ 保持原样直通 ] ┌───────────────────┐
│ 上下文脱敏与裁剪 │
└─────────┬─────────┘
│
▼
┌───────────────────┐
│ 调用 Jev 结构判定 │
└─────────┬─────────┘
│
┌────────────────────────────────┴────────────────────────────────┐
▼ ▼
[ 超过阈值 / 标记高危 / 超时 ] [ 判定符合决策档位要求 ]
│ │
▼ ▼
[ 主模型自行执行 ] [ 注入角色推荐提示文案 ]
│
▼
┌───────────────────────────────┐
│ Hook: agent/request 强制拦截 │
│ 会话若为 auto/manual: │
│ 强制改写 provider, model, │
│ reasoningEffort │
│ (若配置前置提示词则首步注入) │
└───────────────────────────────┘
任务要在自动流转下成功指派给特定子代理模型,必须在配置中同时满足以下三项条件,缺一不可:
routes.<角色> 必须配置了可用的 provider 与 model,且属于子代理白名单;routeFor.<类别> 明确将该任务类别映射到了上述角色;profiles.<档位>.delegate.taskClass 包含该任务类别。若任何一项未对齐,任务将拒绝自动派发,回退由主模型处理。
在插件版本迭代演进中,可能增加新的出厂预设任务类别(例如近期新增的 review 与 documentation)。为了解决配置冲突,插件实现了启动时自动补入逻辑:
questions.task_class 与白名单 profiles.<档位>.delegate.taskClass 均为整块覆盖而非逐项字典合并。一旦用户通过界面编辑过配置,这两项会被完整持久化至用户本地,后续插件版本更新带来的新预设类别将“看得见却永远无法派发”。careful 档位始终保持严格)。adoptedClasses 列表中。若用户后续主动删除了某类别,插件不会再次强行补回。sk-...、ghp_...、AKIA...、Bearer ... 及各类密钥键值对),替换为 [redacted] 占位符。stateChars(默认 1200 字符)从头部进行严格截断,防止大体积上下文消耗过多无关 Token。jev-replay)项目提供独立的 CLI 离线分析脚本 bin/jev-replay.mjs。该工具可解析历史沉淀的 NDJSON 判定日志,并在本地重放模拟候选决策策略,全程离线运行,不产生任何在线 API 调用。
# 格式:node bin/jev-replay.mjs <历史日志路径.ndjson> [候选策略.json] [--json]
node bin/jev-replay.mjs ~/.dsh/logs/verdicts.ndjson candidate-policy.json
confidenceMin、effortMax、blastRadiusMax)前,量化评估历史任务的翻转比例。仓库包含完整的工程校验与自动化测试套件:
# 0. 安装依赖(首次克隆后必做——跳过这一步,下面的测试与类型检查会因为找不到 node_modules 而失败)
pnpm install
# 1. 运行自动化单元测试套件(98 项用例,覆盖判定、回放、改写与配置合并;其中 1 项依赖宿主 `dsh` 命令,Windows 上自动跳过)
node --test "test/**/*.test.mjs"
# 2. 运行工程规范与代码合规检查
node scripts/check.mjs
# 3. 校验多语言国际化文案键位对齐(en / zh / ru)
node scripts/check-locales.mjs
# 4. 执行 TypeScript 静态类型检查
node node_modules/typescript/bin/tsc --noEmit
# 5. 构建客户端前端资源包(生成 lib/client.js)
node scripts/build-client.mjs
本插件由两个早期项目合并而成,能力各承其一:
| 早期项目 | 继承的能力 |
|---|---|
dsh-subagent-model-picker(v1.0.0) | 可视化、手动的子代理模型选择:输入框上方的选择器、会话状态徽章、右侧边栏标签页 |
dsh-jev-subagent-dispatch(v0.8.0) | 基于 Jev 判定模型的自动分流:任务判定、角色路由、子代理请求级模型改写 |
两者均为 MIT 许可,版权分别归 ringoage 与 Vitaliy Ryumshyn,完整声明见 LICENSE。
本项目依据 MIT License 开放源代码。