← 返回列表
需源码安装
让一个 DeepSeek Harness 会话同时拥有两个模型:负责方向的主 AI,加上一个严格串行、专做费…
暂不能直接安装(需源码编译或环境不满足):仓库缺少 package.json,无法用 dsh 插件安装命令安装。 · 最近上游提交 2026/9/16 · 已提供中文文档
在一个 DeepSeek Harness 会话中有两个模型:一个主导代理加上一个严格串行委派的编码器,并带有一张实时转录卡片。
综合分
30.3
GitHub 分
30.3
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add cagfriend/dsh-dual-ai仓库缺少 package.json,无法用 dsh 插件安装命令安装,改用 GitHub 源安装
信任档位:已验证本站已于 1 天前真实安装成功
- 是什么
- dsh 原生插件 · chat
- 装得上吗
- 本站已真实安装成功(非静态推断)
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 9 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
🟢实装验证通过· 2026/9/24
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/20(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查需源码安装
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-dual-ai(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
仓库缺少 package.json,无法用 dsh 插件安装命令安装
验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/21 11:07:04
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-dual-ai
主 AI 就是你在 DSH 里选的那个模型。副 AI 跑在更便宜的路由上(默认 xiaomi/mimo-v2.5),拥有自己的会话和上下文窗口,并且只通过一个工具被调用:delegate_coding。主 AI 会一直等到它返回。没有后台委派、没有并行子代理、没有偷偷换模型。
主 AI(你在 DSH 里选的模型)
| 负责:方向、拆解、验收标准、最终 review
|
+-- 工具:delegate_coding(task, scope, acceptance)
| |
| +-- 副 AI(独立会话、独立上下文、独立工具循环)
| 默认 xiaomi/mimo-v2.5,可用指令切换
| 受限工具集:shell + read/write/edit/glob/grep/todo/jobs
| 审批策略被 DSH 固定为 "never"
| 每次结束都输出 STATUS: DONE 或 STATUS: BLOCKED + NEED:
|
+-- 工具:set_coding_model(route) 查看 / 切换 / 重置副 AI 的模型
每次调用都在对话里可见:模型路由、状态、确切任务、副 AI 的实时转录,以及最终报告。
目录
- 对比:双 AI vs 单模型
- 功能
- 环境要求
- 安装
- 使用
- 配置
- 仓库结构
- 实现原理
- 排错
- 兼容性与注意事项
- 许可与出处
对比:双 AI vs 单模型
同一个提示词——做一个小鹈鹕骑自行车的动画——在同一台机器上跑两种配置。两段都是浏览器录屏,画面里包含浏览器窗口本身。
| | 双 AI:主 AI + 委派的副 AI | 单模型:只用 mimo-v2.5 |
|---|---|---|
| 预览 | 双 AI 预览 | 单模型预览 |
| 完整录像 | pelican-bicycle-dual-ai.mp4 · 10.4 秒 · 20.6 MB | pelican-bicycle-mimo-only.mp4 · 7.2 秒 · 8.4 MB |
双 AI 那次给出的是一个完整的横向卷轴场景:骑手有明确的关节动作、踩踏循环也在真的转;单模型那次只给了一个简单得多的静态感场景。单个样本不等于基准测试,但这正是这套拆分想拿到的差别:主 AI 守住结果的整体形态,便宜模型去啃实现细节。每次委派调用的确切任务、模型路由和状态都能在使用一节看到。
功能
严格串行委派。 delegate_coding 没有 run_in_background 参数,isConcurrencySafe() === false(在工具注册表里是独占屏障),并且内部维护按会话的 Promise 队列。一个会话绝不会同时跑两个副 AI,副 AI 运行期间主 AI 也不能做别的事。
指令驱动切换模型。 set_coding_model 接受 show、default 或 provider/model。切换在本会话内持续生效,作用于之后每一次 delegate_coding。主 AI 永远不会改自己的模型。
调用可见。 每次结果都会打印模型路由、状态、确切任务、写范围和验收命令,后面接副 AI 的报告。客户端卡片还会在副 AI 运行期间实时滚动它的转录。
诚实的阻塞上报。 副 AI 不允许弹审批(DSH 把委派子会话的审批策略固定为 never),所以被权限挡住时它会以 STATUS: BLOCKED 加一行 NEED: 结束,而不是瞎猜。主 AI 是唯一的升级通道:它能在自己权限内做掉就直接做掉,否则用 ask_user_question 向你要那个确切的权限,然后再重新委派。
天然省钱。 副 AI 拿到全新上下文(看不到你的对话)、受限工具集、maxDepth: 1(不能再往下委派)以及有界输出预算。
客户端实时卡片。 delegate_coding 的工具卡片通过公开的 subagent wire API 轮询副 AI 的持久转录,实时渲染 assistant 文本、工具调用和结果,并带可折叠的最终报告和「在子会话中打开」按钮。
环境要求
- 一个从源码运行的 DSH 检出(在 0.1.1-rc.2 上验证),例如 pnpm dsh web 或你自己的启动脚本。profile、roster 和客户端 bundle 构建都来自这个检出。
- 两条 LLM 路由:主 AI 用你在 DSH 里选的;副 AI 默认 xiaomi/mimo-v2.5。请在 DSH 设置里配好 xiaomi(或 glm)provider 的凭据,或改默认路由(见配置)。
- Node 22.19+ / 24+,以及检出里已安装的依赖(用于重建客户端 bundle)。
- 客户端实时卡片会修改 shipped 客户端包,因此需要一个可写的检出。只用 preset 的话,只需要可写 ~/.dsh/.agent-presets。
安装
1. Preset(两个工具)
git clone https://github.com/cagfriend/dsh-dual-ai.git
cd dsh-dual-ai
./install.sh --preset-only
手动等价操作:
mkdir -p "$HOME/.dsh/.agent-presets/dual-ai"
cp preset/preset.yml "$HOME/.dsh/.agent-presets/dual-ai/"
cp preset/agent.cordis.yml "$HOME/.dsh/.agent-presets/dual-ai/"
cp preset/delegate-coder.mjs "$HOME/.dsh/.agent-presets/dual-ai/"
然后开一个新会话,选择 双 AI 模式 preset(preset id 是 dual-ai)。改 preset 只影响之后新建的会话;正在运行的会话保留它当初的组装。
2. 客户端实时卡片(可选但推荐)
卡片住在 shipped 客户端包 packages/client/ui-tool 里。安装脚本会复制三个文件并加上两行注册:
./install.sh --checkout /path/to/deepseek-harness
随后它会重建客户端 bundle,并提示你硬刷新浏览器。手动步骤:
1. 把视图源码放到其它原子工具视图旁边
TOOL=packages/client/ui-tool/src/client/tool/toolviews
cp client-live-card/delegate-coding.tsx "$TOOL/"
cp client-live-card/delegate-coding-model.ts "$TOOL/"
cp client-live-card/DelegateCoding.module.css "$TOOL/"
2. 注册插件(精确 diff 见 client-live-card/apply.patch)
import { delegateCodingToolview } from './tool/toolviews/delegate-coding.tsx'
ctx.plugin(delegateCodingToolview)
3. 在检出根目录重建客户端 bundle
cd packages/client/ui-tool
env -u DSH_BUILD_FACE node ../../node_modules/tsdown/dist/run.mjs
然后硬刷新 Web UI(Ctrl+Shift+R)。不需要重启 host:bundle 是从磁盘以 no-cache 提供的。
使用
在 双 AI 模式 preset 上开新会话,正常和主 AI 说话即可。它会自己把有界、机械、费 token 的活派出去:
把 fetchUser 全量重命名为 getUser,并把测试一起改掉。
可以直接输入的指令:
| 你说 | 会发生什么 |
|---|---|
| 副模型换成 glm/glm-4.5-air | 主 AI 调 set_coding_model({route:"glm/glm-4.5-air"}),之后每次委派都用它 |
| 现在副模型是哪个 | set_coding_model({route:"show"}) 回报当前路由 |
| 副模型恢复默认 | set_coding_model({route:"default"}) 回到 xiaomi/mimo-v2.5 |
| 架构性问题 | 主 AI 自己留着:设计、歧义和最终 review 都在主对话里 |
用英文说也一样,人格里已经写明要把两种语言都映射到工具上。
副 AI 被挡住时
副 AI 不能弹审批。如果被沙箱或权限拒绝挡住,它的运行会以这样的结尾结束:
STATUS: BLOCKED
NEED: write access to C:/other (or a wider sandbox mode)
工具结果则变成:
[delegate_coding]
model: xiaomi/mimo-v2.5
status: BLOCKED - the subagent could not finish
need: write access to C:/other (or a wider sandbox mode)
task: ...
--- sub-agent report ---
...
NOT DONE. Do not report success and do not retry blindly. Either perform the denied step
yourself under your own permissions, or call ask_user_question for exactly the permission
above, then re-delegate the remaining work.
接下来主 AI 要么在自己权限内把那一步做掉,要么用 ask_user_question 向你要那个确切的权限,然后再重新委派。注意主会话自己的审批策略同样重要:如果是 never,主 AI 也无法请求升级,放宽沙箱或切换权限预设只能由你来做。
配置
副 AI 的路由与限制(preset 行)
- id: delegate-coder
name: ./delegate-coder.mjs
config:
provider: xiaomi # 副 AI 使用的 provider 路由
model: mimo-v2.5 # 默认模型,可在运行时切换
maxTokens: 65536 # 副 AI 单次请求输出上限
shellTool: pwsh # 默认:win32 用 pwsh,其它平台用 bash
allowTools: [pwsh, read, write, edit, glob, grep, todo_write, job_output, job_kill]
沿用 shipped standard preset 的规则:副 AI 会加入父方 preset 的组装,所以 allowTools 里必须是这个 preset 真正挂载的工具名。
客户端卡片
| 常量 | 文件 | 含义 |
|---|---|---|
| POLL_MS | client-live-card/delegate-coding.tsx | 转录轮询间隔(默认 1200 毫秒) |
| HISTORY_MESSAGES | client-live-card/delegate-coding.tsx | 每次轮询拉取的历史页大小(默认 50) |
| MAX_LINES | client-live-card/delegate-coding-model.ts | 保留的转录行数(默认 60) |
| MAX_LINE_CHARS | client-live-card/delegate-coding-model.ts | 单行上限(默认 600) |
仓库结构
preset/
preset.yml roster 展示元数据
agent.cordis.yml dual-ai agent preset(改编自 shipped "standard")
delegate-coder.mjs preset 平面插件:delegate_coding + set_coding_model
client-live-card/
delegate-coding.tsx keyed tool.call.toolview + live face provider
delegate-coding-model.ts 纯转录折叠逻辑(可单测,不依赖 React)
DelegateCoding.module.css 卡片样式
apply.patch 对 ui-tool apply.ts 的精确 diff
install.sh 两半的安装脚本
media/
pelican-bicycle-dual-ai.* 对比样本:双 AI 那次(mp4 + gif + 封面)
pelican-bicycle-mimo-only.* 对比样本:单模型那次
实现原理
Host 半边(preset 平面插件)。 delegate-coder.mjs 由 preset 挂载,所以它只把 delegate_coding 和 set_coding_model 注册进那个会话的工具层。它不使用任何裸 import(用户 preset 根目录上溯不到 node_modules),因此两个工具都以原生 JSON Schema 定义注册、参数在插件里自行校验。delegate_coding 通过 ctx.subagents.start() 以 agentOptions、子人格、工具过滤器和 maxDepth: 1 启动一个进程内 spawn 子会话,然后等待并 dispose。set_coding_model 用 ctx.llm.resolveCallConfig() 校验路由,并把 per-agent 覆盖存进 WeakMap。
Client 半边(实时卡片)。 卡片占用了 keyed slot tool.call.toolview 的 delegate_coding 键。per-session 的 live face 通过 sessions.provide 注入;卡片轮询 subagents.list 找到正在跑的 child,再用 subagents.history 读它的转录。这个 history 读取是官方定义的「读持久转录、绝不激活 child Agent」路径,所以实时视图不花任何模型 token。事件由纯模块 delegate-coding-model.ts 折叠成有界行数。
ESM 缓存陷阱。 harness 用绝对 URL 导入 preset 插件,Node 按 URL 缓存 ES module,而 preset 代际只以 agent.cordis.yml 为 stamp。所以只改插件文件不会到达正在运行的 host:把它改名(delegate-coder-2.mjs、-3……)并把 preset 行指过去,或者重启 host。这也是本仓库发布规范名 delegate-coder.mjs,而长期运行的机器上可能留着改名副本的原因。
排错
| 现象 | 原因 | 处理 |
|---|---|---|
| 主 AI 不认识 set_coding_model | 运行中的会话挂的是旧 preset 代际,或 Node 返回了缓存的插件模块 | 开新会话;仍然不行就把 delegate-coder.mjs 改名并更新 preset 行,或重启 host |
| 实时卡片不出现 | 客户端 bundle 没重建,或页面还拿着旧 bundle | 重新构建 ui-tool bundle 并硬刷新(Ctrl+Shift+R);看浏览器 Console 有无 slot/注册报错 |
| 副 AI 写不了文件 | 它继承父方沙箱,且审批被固定为 never | 让主会话处于可写策略,或让主 AI 自己执行写操作 |
| 副 AI 报 BLOCKED | 被沙箱/权限拒绝 | 这是预期行为:主 AI 去做那一步,或向你要确切权限 |
| 两个工具都没有 | preset 没挂上 | 确认会话 preset 是 dual-ai,且 delegate-coder.mjs 与 agent.cordis.yml 同目录 |
兼容性与注意事项
- 面向 DSH 0.1.1-rc.2。preset 行配置(agentOptions、toolFilter、maxDepth)和 subagent wire API 都属于 harness 自己的接口,RC 之间可能变化。
- 客户端卡片修改的是 shipped 包(packages/client/ui-tool)。升级 DSH 会覆盖它,升级后请重跑 install.sh --checkout ...。
- 副 AI 看不到你的对话,主 AI 必须写自包含的 brief。如果确实需要继承历史,可以用原生 fork provider(在这个严格 preset 里被禁用了),代价是子上下文显著变大。
- 审批策略就是天花板:never 会话的子会话永远无法放宽任何东西。
许可与出处
MIT(见 LICENSE)。
preset/agent.cordis.yml 改编自 DeepSeek Harness 随附的 standard agent preset(MIT);客户端卡片修改的是同一项目的 @deepseek-ai/dsh-client-ui-tool。详见 NOTICE。