Skip to content

扩展方向

mini-harness 是起点不是终点。这一章给出 8 个方向,每个都标注了"真实 dsh 怎么做"与"你可以怎么改"。

方向一:持久化会话日志

现状:日志只在内存,重启即失。dsh 的做法session-persistence-jsonl 插件监听 session/event 追加写盘(原理篇 7.5)。

动手:写一个插件监听 session/event,把事件 append 到 data/<sessionId>.jsonl;启动时读取重建 Session。观察点:你不需要改 Session 一行代码——持久化是日志的消费者。

方向二:作用域(isolate)与 agent preset

现状:工具全局注册。dsh 的做法isolate 作用域 + agent preset 给每个 agent 独立能力集(原理篇 3.6)。

动手:给 Context 加 isolate(name),服务查找沿作用域链;给 AgentRegistry.createsetup 回调,在 agent 作用域里注册专属工具。这是从"教学版"迈向"真实版"最关键的一步。

方向三:审批面(ask 的真实现)

现状tools/pre-executeask 降级为 deny。dsh 的做法:user-approval 插件挂起执行、通过事件把问题推给 UI、用户答复后恢复。

动手:管线返回 ask 时 emit 一个 approval/requested 事件(带 callId),SSE 转发给前端弹确认框,用户点击后把决策写回。你会复刻 dsh 权限系统的最小闭环。

方向四:流式取消与超时

现状:cancel 只 abort 当前 turn。dsh 的做法:工具级超时(timeoutMs)、请求级看门狗(源码拆解 5.4)。

动手:在 tools/execute 瀑布里包一层超时(AbortSignal.any + 定时器),超时结果作为 isError 返回模型。注意 signal 合并的写法,与 openai-compat 适配器里的用法一致。

方向五:把你的插件做成可安装的 bundle

现状:插件以源码文件存在。dsh 的做法:bundle = 声明 dsh.bundle.patch 的 npm 包,dsh plugin --profile <name> add <pkg> 安装(原理篇 8.1)。

动手:把 mock 适配器 + echo 工具打成一个 npm 包,发布后任何机器 npx @deepseek-ai/dsh --profile headless --patch your-patch.yml 即可用——你写过的 Demo 8 的完整商业版。

方向六:前端插件化

现状:React SPA,UI 组件写死。dsh 的做法:host 注入 window.__DSH_BOOT__,浏览器侧插件树渲染一切,包括 Chat node 与工具卡片(源码拆解 01.4第六步的对照图)。

动手:定义 ToolCardPlugin 接口(match + render),前端从 GET /api/plugins 拉取清单动态注册渲染器。新增工具卡片从此不用改前端主仓库。

方向七:fork 与 subagent

现状Session.fork 已实现但没被使用。dsh 的做法:subagent = fork 会话 + 新 agent + 委派工具(原理篇 7.4)。

动手:实现 subagent 工具:fork 当前会话、创建子 agent(parentSession 血缘)、驱动它完成子任务、把最终文本作为工具结果返回父会话。这是通往"多 agent 编排"的入口。

方向八:回到真实 dsh

最终极的扩展:把你在 mini-harness 学会的一切带回真实 dsh。 你会发现:Demo 5–8的 overlay、patch、插件写法原封不动地适用于真实产品;而 --dump-configagent/pre-steptools/post-execute 这些名词不再陌生。

text
你的学习闭环:
原理篇(为什么)→ 源码拆解(是什么)→ Demo(怎么用)→ mini-harness(怎么实现)
→ 真实 dsh(用得更好 / 贡献插件)

毕业设计选题建议

  1. 给 mini-harness 加一个 web 搜索工具(方向四 + 五的组合:工具 + 超时 + 审批);
  2. 实现 subagent 委派(方向七),让主 agent 能"派活"给子 agent;
  3. 把 mini-harness 的 UI 换成 Chat node 注册制(方向六),并写一个 diff 卡片插件;
  4. 复刻 dsh 的 profile/patch 机制:把 bootstrap() 改造成"读 yml 组装"(方向五的逆向工程)。

基于 DeepSeek Harness(开发者预览版 0.1.0-rc.6)与 Cordis 撰写