合理搭配你的模型及 Token 额度,让 DSH 按任务类型自动委派专业子代理,覆盖架构分析、UI/UX、代码实现、代码库探索与文档调研。安装后自动配置,并支持按角色设置思考强度和工具权限。
安装
# npm 包(预构建)
dsh plugin --profile web add oh-my-dsh-slim
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:ninipa/oh-my-dsh-slim
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
在 DeepSeek Harness(DSH)中复刻 oh-my-opencode-slim 的 subagent 角色委派体系: orchestrator + 5 个专职角色,每个角色有独立 persona、模型、工具权限(toolFilter)、思考强度 (reasoningEffort)与 MCP 访问。交付物是一个可共享的 DSH agent 预设(含随预设分发的配置插件), 不是独立应用。
Persona 文本适配自 oh-my-opencode-slim(MIT © 2025 alvinunreal),保留署名——详见 LICENSE。English version: README.md。
⚠️ DSH 版本支持(0.5.2):DSH 0.1.2-rc.1 ~ 0.1.5-rc.2,两条宿主线均已端到端实测 (0.1.2 线;0.1.5 线的 rc.1 与 rc.2)。DSH 0.1.1 及以下请继续使用 oh-my-dsh-slim 0.4.0:插件会 检测出版本不符,完全不动你现有的预设目录(照常可用),并在 设置 → 插件 → oh-my-dsh-slim-compat 显示提示页。另请注意:升级后需要重启 DSH (插件代码每进程只挂载一次,仅开新会话不会加载新代码)。
⛔ DSH 0.1.6 及更新版本(含整条 0.1.7 线)本版本不支持。 DSH 0.1.7 把目录式 agent preset 换成了由插件组合包声明的声明式 preset,本预设装完将不会出现。插件会在该宿主上直接拒绝: 不播种任何内容、不动你已有的文件,并在 设置 → 插件 → oh-my-dsh-slim-compat 页说明原因。 目前请留在 DSH ≤ 0.1.5-rc.2;适配声明式 preset 的版本正在开发中。
从 0.5.0 升级且宿主为 DSH 0.1.5:内置预设会自动重播种修复;但自定义配置保留自己的目录 内容——若 DSH 0.1.5 无法挂载某份配置,设置卡片会标记它并支持一键迁移(就地改写
agent.cordis.yml,并在旁边保留备份)。你也可以选择重建该配置。
它解决什么问题
DSH 的默认编排是“一个模型包打天下”。本预设把工作拆成专职车道,orchestrator 只负责规划、派发与整合:
- oracle(战略顾问):架构决策、复杂排障、代码评审——只读
- designer(前端设计):UI/UX 与视觉打磨——可写
- fixer(快速实现):规格明确的机械实现——可写
- explorer(代码检索):快速结构勘察——只读
- librarian(外部调研):官方文档/GitHub 检索(context7 + gh_grep MCP)——只读
派发默认走后台(continuable):orchestrator 派完即结束回合,子代理完成时由运行时通知唤醒整合。
orchestrator 遵循严格的委派纪律——派发完独立车道后以简短状态说明结束回合(不轮询、不在同一回合
重做运行中车道的 scope 内工作),把车道的中间回报视为「尚未结算」,只在 finish 通知后收口;
subagent_result 工具可只读取回已结束子代理的最终消息(不唤醒、零额外模型轮次)。
角色矩阵
| 角色 | 工具名 | 默认模型 | 默认 effort | 权限 |
|---|---|---|---|---|
| oracle | subagent_oracle | deepseek-v4-pro | max | 只读 |
| designer | subagent_designer | deepseek-v4-flash | high | 可写 |
| fixer | subagent_fixer | deepseek-v4-flash | high | 可写 |
| explorer | subagent_explorer | deepseek-v4-flash | low | 只读 |
| librarian | subagent_librarian | deepseek-v4-flash | high | 只读 + MCP |
- 所有角色继承全局工具,只读角色 deny
edit/write,全部角色 deny 控制类工具(OMO 风格 deny-only) - 角色禁止再委派(maxDepth: 1);librarian 在自己的 child scope 中独享 context7/gh_grep
- observer(视觉分析)本版本预留但默认关闭:DSH 的发送门控按主模型视觉能力拦截图片附件, 且委派提示词是纯文本,粘贴图无法交接给子代理。等上游支持"消息附件转发进子代理"后开放。
安装
需要 DSH 0.1.2-rc.1 ~ 0.1.5-rc.2(两条线均已实测)与 DeepSeek API key(默认模型走 deepseek-official)。 该范围之外的宿主不受 0.5.2 支持——DSH 0.1.1 及以下请用 oh-my-dsh-slim 0.4.0;**DSH 0.1.6 及更新 (0.1.7 声明式 preset 线)**请等待即将发布的适配版本(见顶部版本说明)。 0.5.0 不支持更早的 DSH 版本——DSH 0.1.1 及以下请使用 oh-my-dsh-slim 0.4.0(见顶部版本说明)。
方式 A——插件市场 GUI(推荐): 在 DSH web GUI 打开 设置 → 插件,在市场里搜索
oh-my-dsh-slim 并安装。也可在
awesome-dsh-plugin 目录中找到。
方式 B——CLI 命令:
dsh plugin --profile web add oh-my-dsh-slim
包内自带播种器,会自动把预设物化到
$DSH_HOME/.agent-presets/oh-my-dsh-slim(升级随插件版本走,旧目录自动备份)。
ℹ️ 默认部署(home 为
~/.dsh)直接执行即可。若你的部署使用了自定义 home (如桌面 App 的隔离环境),请先设置DSH_HOME再执行——方式 A 的市场 GUI 会自动解析。
方式 C——git clone:
git clone https://github.com/ninipa/oh-my-dsh-slim "$DSH_HOME/.agent-presets/oh-my-dsh-slim"
装完即生效:新建会话时在 设置 → Agent 预设 里选择「极简角色委派」。
- 更新:
cd "$DSH_HOME/.agent-presets/oh-my-dsh-slim" && git pull(或升级插件),然后 重启 DSH——插件代码(工具 schema、注入提醒)每进程只挂载一次,仅开新会话不会加载新代码 - 回滚:
git checkout <旧 tag>或直接删目录。预设按会话创建时锁定,运行中会话不受影响。
配置
零配置即可使用(内置默认值随预设分发)。用户配置按以下优先级读取:
OH_MY_DSH_SLIM_CONFIG环境变量指向的文件(测试/CI 通道)- 宿主设置命名空间
oh-my-dsh-slim(推荐):随 npm 包安装的播种器会注册该命名空间, 配置写在宿主settings.yaml的oh-my-dsh-slim:段;effort/temperature 每次委派实时读取 (改动即时生效),模型/maxTokens 对新会话生效 - 旧版
$DSH_HOME/oh-my-dsh-slim.json文件(无 settings 服务的宿主的回退通道)。安装了 npm 包的宿主首次启动时会把它自动导入 settings 命名空间并归档为oh-my-dsh-slim.json.imported-<时间戳>
三种通道共用同一份文档结构(schema 见 oh-my-dsh-slim.schema.json):
{
"preset": "my-dsh-normal",
"presets": {
"my-dsh-normal": {
"fixer": { "model": "kimi-k3", "effort": "high" },
"librarian": { "mcps": ["context7", "gh_grep"] }
}
}
}
- 可按角色覆盖
enabled/model/effort/deny/mcps;temperature/maxTokens属高级键 (advanced.roles.<roleId>) - 思考强度取值:
none= 完全不发送reasoningEffort参数(适用于不支持思考强度的模型, 如本地 LLM);off= 发送reasoningEffort: "off"明确关闭推理(模型需支持该参数)。 其余档位(low/medium/high/max/xhigh…)按所选模型收敛且集合开放:档位 id 由各 适配器自己定义,因此配置侧接受任何形状合法的档位 token(在这台机器上能保存的配置,换到另一台 也依然合法),是否被该模型接受在委派时判定——不支持的档位在第一次委派即显式报错,并列出该模型 声明的档位与其适配器默认值。GUI 卡片的 effort 下拉按各模型声明集合生成,显式越界值行内警告并 阻止保存 - 模型名校验:委派时按你在「设置-模型」导入的 provider 目录实时校验——填了不存在的模型, 第一次委派即报错并列出全部可用模型(含 vision-capable 子集),不会静默失败
- observer 锁定:
observer.enabled: true会被忽略并警告(原因见上) - 修改后新会话生效,运行中会话不受影响
GUI 配置卡片(随 npm 包分发):安装后「设置 → 插件 → 插件配置」出现卡片——每个角色的 启用/模型/思考强度可直接编辑,高级子区含 token 上限与温度(带默认值告警),模型下拉与对话输入框 选择器同源。effort 下拉按所选模型声明的思考档位收敛(不支持档位自动隐藏;显式越界会行内 警告并阻止保存)。orchestrator 仅展示说明:它是当前会话主模型,在对话输入框的选择器中更换 (默认模型在 设置-模型 维护)。保存后会提示生效语义(思考强度/温度立即生效;模型/token/启停 新会话生效)。
对话式配置(无需手编 JSON):在会话里直接说,例如"帮我把 fixer 的模型换成 kimi-k3"或 "关闭 oracle 角色"——主模型会按 schema 修改上述 JSON。
多命名配置(multi-preset):设置卡片顶部新增「委派配置」下拉(安装播种器后出现,roster
由它的 /omds RPC 提供),用于管理多套命名配置——每套配置对应一个原生 Agent 预设:
- 下拉恒有「极简角色委派」(内置 profile,未改动前就是新会话默认)与「+ 新建配置」。 选择「+ 新建配置」会原地编辑一份草稿(复制当前正在编辑的配置),点保存前不写任何 数据;首次点保存时才要求输入显示名称(内部 ID 由名称自动生成、之后不再改变)。
- 「恢复默认」只恢复当前正在编辑的内容,不删除任何配置、不清空 roster。
- 下拉选择只表示"正在编辑哪个配置",不会切换当前会话;新会话实际用哪个配置由原生 Agent 预设选择器及其默认值决定——卡片上的「设为新会话默认」按钮写入的就是那个原生 设置(与点击 Agent 预设页卡片是同一处写入),两侧永远一致。
- 保存后的配置会变成真实 agent 预设:
$DSH_HOME/.agent-presets/profile-<前缀>-<hash>/目录,可在 Agent 预设选择器中像任意预设一样选用。各配置的角色设置存于自己的快照 (组合文件旁的profile.json),因此多套配置互不串扰。
web_fetch(跟随宿主)
宿主 DSH ≥ 0.1.2 默认内置 web_fetch(自带 SSRF 防护),预设会话与委派子代理直接继承宿主
默认。本预设不再自带 fetch provider 接线,也不再提供 webFetch 开关:旧版的
「进阶配置:启用 web_fetch」与 web-fetch-gate 插件已退役。web_search 仍由 host web
service 提供。
即将发布(Roadmap)
- observer 重新启用——等上游 DSH 支持「消息附件转发进子代理」(见角色矩阵中的说明)。
自检与测试(全部零费用)
# 静态校验(结构/键位/persona 死引用/软禁用断言)
node scripts/t0-validate.mjs .
# 单元测试(配置合并/effort 注入/角色委派契约/subagent_result/settings schema/
# sandbox 剥离/提前收口账本/播种器/profile RPC//omds 传输层/GUI 卡)
node scripts/test-config-loader.mjs && node scripts/test-effort-plugin.mjs
node scripts/test-role-subagent.mjs && node scripts/test-subagent-result.mjs
node scripts/test-settings-schema.mjs && node scripts/test-sandbox-strip.mjs
node scripts/test-early-close-context.mjs && node scripts/test-preset-seeder.mjs
node scripts/test-profile-rpc.mjs && node scripts/test-client-card.mjs
node scripts/test-omds-rpc.mjs && node scripts/test-host-version.mjs
# 宿主契约探针电池(9 探针 / 10 阶段,零模型)——每次 DSH 升级后必跑。
# 自动搭建临时 DSH_HOME(无需凭据);详见 scripts/TEST-INVENTORY.md
node scripts/run-host-probes.mjs # --list / --only <name> / --keep 见 --help
# web 模式传输层探针(零模型):起真实 web 宿主,验证卡片 /omds 通道(注册/信任栅栏/信封/
# 一键迁移配置);`--dsh <安装目录>` 可指向另一个宿主版本做跨版本核验
node scripts/probe-omds-web.mjs
# 真模型验收(计费):搭临时 home 让顶层与**每个角色**都指向同一个模型,跑隔离冒烟 + ECC 结算探针;
# 模型是参数:--provider/--model/--effort(默认 opencode-ds-v41-flash/deepseek-flash @ low)
node scripts/run-real-models.mjs
验收任务清单
GUI-TEST-TASKS.md 提供 7 个非显式派发场景的验收任务(含提示词与预期行为), 可用于新环境部署后的行为核对。T3 依赖 examples/omo-probe-baseline 基线项目。
已知边界
- 升级后需要重启 DSH:agent-plane 组合每宿主进程只挂载一次——配置行(persona 文本、 模型路由)每会话重新解析,但插件代码(工具 schema、工具描述、注入提醒字符串)冻结在进程内。 升级插件/预设后必须重启 DSH;仅开新会话跑的仍是旧代码
- 非 vision 主模型无法接收粘贴图片:DSH 在发送时按主模型能力硬拦
(
MODEL_DOES_NOT_SUPPORT_IMAGES)。需要图片分析请换 vision 主模型(如 deepseek-v4-flash-vision-exp)直读,或等上游支持附件转发。若你的模型实际支持图像但 仍被拦截,检查 provider 配置中该模型是否声明了图像输入能力 (input: ["text", "image"])——第三方 GPT 类模型常见此缺漏 - web_search 走独立计费:librarian 优先使用 MCP(免费通道);web_search 由宿主搜索服务承担, 每次调用产生一次独立的辅助模型请求,开放式调研任务建议在提示词中给出搜索预算
- 委派子代理无法升级沙箱权限——预设会剥离多余升级字段(
sandbox-strip插件,属 workaround): DSH 在启动时固定了子代理的文件策略与审批状态,但bash/edit/write工具 schema 仍暴露可选的sandbox_permissions/justification字段;部分模型会无意识地填上这些字段,而子代理本就无法升级, 多余参数只会触发参数校验错误(invalid justification、not strictly wider)。随预设分发的sandbox-strip插件会在tools/pre-execute阶段移除角色子代理调用中的这两个字段,并在结果末尾 附加[sandbox: stripped ...]提示让模型看到修正。在本预设自己的顶层会话中,它还会剥离 那些在任何审批前都必然被拒的形态(空 justification、单字段配对、非更宽模式——用宿主同一张WIDER_MODES表判定);合法升级请求(更宽模式 + 非空理由)保留,照常请求批准。不使用本 预设的会话不会加载该插件,行为零变化。这是预设层的临时缓解而非根治:真正修复在上游——DSH 不应向权限已固定的子代理暴露升级字段 - 后台子代理与「提前收口」(
early-close-context插件):DSH 是回合制——模型要么输出要么 结束回合,机制层面无法强制等待后台子代理;部分模型会在子代理仍在运行时输出最终结论(谎称 "已完成"而未整合子代理结果)。随预设分发的early-close-context插件用事实供给缓解: system prompt 每回合注入"当前运行中的后台子代理"块(与宿主sandbox:policy同一动态机制)、 每次派发成功的结果附加 "Decision point" 提醒、persona 增加"子代理未 settle 前不得声称完成" 条款。账本三态(running → reported → settled):子代理的中间回报(宿主句式 "Agent sent a message:")被明确标注为 "已回报内容,等待正式完成通知(reported ≠ 完成)",只有 finish 通知才算结算。模型仍可能在 子代理完成前结束回合(无强制等待),但不再谎报完成——settle 通知会唤醒主模型整合结果 - 自定义配置预设保留创建时的插件版本:每个配置是创建时对内置预设目录的完整复制;升级 npm 包只会重播种内置预设,旧配置目录会保留当时的插件拷贝——重建或重新复制该配置才会获得新插件 (配置快照本身不受影响,只是插件会"变旧")
致谢
- oh-my-opencode-slim(MIT © 2025 alvinunreal)——角色体系与 persona 来源
- DeepSeek Harness——宿主平台
License
链接
同类插件
loopx-project/loopx#dsh-loopx-plugin★ 6209
LoopX——面向长周期 Agent 的提供商中立、本地优先状态内核与控制平面:在 DeepSeek Harness 执行层之上持久化 Goal、Todo、门禁、证据、配额、恢复与交接状态;插件负责引导安装 CLI 与技能、准入有界的同会话续跑,并为精确绑定的工作循环提供本地 GoalBar。
Q00/ouroboros#integrations/dsh-plugin★ 6195
通过 DSH MCP 客户端挂载 Ouroboros 的纯配置包,在 DSH 中提供 36 个涵盖需求访谈、Seed、执行、评估与演化流程的工具。
chuspeeism/dashi-taskboard#deepseek-harness★ 3308
把当前已安装并运行中的 Codex Taskboard 嵌入 DeepSeek Harness 侧边栏,并通过 Launcher 运行时描述文件连接,而不是使用固定端口。
NanmiCoder/dsh-agent-teams★ 1980
AgentTeams 多智能体团队。
EthanYoQ/AI-Novel-Writer#dsh-ai-novel-writer★ 1363
安装专用 AI 小说创作预设与工作台:提供带修订号的本地项目资产、紧凑侧边工作台,以及需要原生审批的逐文件变更。
tong-io/tongflow#dsh-tongflow★ 1042
基于 TongFlow 的“片场”插件,用于图片、配音、音乐与视频制作:agent 为每个资产生成 TongFlow 工作流文件(.tongflow.json)并通过 TongFlow 插件执行,内嵌工作流画布,按镜头/角色/take 组织项目,附漫剧模板;以 @tongflow 开头的会话进入 Studio 界面。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。