乐于分享
好东西不私藏

deepseek harness插件开发

deepseek harness插件开发

dsh 的核心设计是一体插件化:框架本身只提供底座,各种能力——命令行、文件系统、浏览器、模型调用、对话会话、审批交互等等——都以插件的形式挂载上去。这样做的好处是相对直接的:

  • 可以只加载自己用到的能力,保持轻量;
  • 第三方可以开发自己的插件,按需增强 dsh;
  • 插件通过统一的注册、安装、清理机制管理,生命周期可控。

对普通使用者来说,插件模式下能力可以自由叠加;对开发者来说,贡献能力不需要改框架本身,只要按约定写一个插件即可。本项目所做的,就是在 dsh 的插件体系上,开发并打磨了几个面向实际场景的插件,覆盖浏览器控制、Web 界面增强、消息渠道接入、UI 主题定制这几个方向。

三、本项目开发的插件

本项目的插件统一放在 plugins/ 目录下,命名遵循 dsh-<name>,均已通过加载测试、冒烟测试、配置校验、清理验证等冒烟项目。以下逐一介绍。

1. dsh-ava-bridge:浏览器控制插件

仓库:sungatetop/dsh-browser-control

dsh-ava-bridge 让 dsh 里的 agent 可以直接控制本机 Chrome 浏览器。它内置了一个本地 daemon(HTTP + 长连接,默认端口 19826),配合一个需要安装到 Chrome 的桥接扩展(ava-chrome-extension)完成对浏览器的操作。

它的数据通路大致是:

模型 → browser_* 工具 → dsh-ava-bridge daemon → Ava Chrome 扩展 → 浏览器

插件面向模型注册了 12 个 browser_* 工具,常用的有:

  • browser_navigate / browser_new_tab / browser_activate_tab / browser_close_tab:标签页导航与管理;
  • browser_get_text / browser_click / browser_type:读取页面文本、按选择器点击、向输入框输入;
  • browser_screenshot:网页截图;
  • browser_cdp:发送原始 CDP 命令,便于做更底层的定制。

安装扩展后,在 dsh 的对话里用自然语言吩咐模型「打开一个网页并截图」这类操作即可。它的 HTTP/长连接表面与 ava-chrome-extension 完全一致,所以除了作为 dsh 插件使用,/command 接口也可以被其他客户端复用。

2. dsh-file-tree:Web 界面文件树插件

仓库:sungatetop/dsh-file-tree

dsh-file-tree 在 dsh Web 界面的侧边栏工作空间栏里注入一个「📁」按钮,点击后侧边栏可以在「历史会话列表」和「当前工作空间的懒加载文件树」之间切换。点击文件树里的文件,会在右侧统一的预览面板里渲染内容,支持 Markdown 文档、HTML 预览(沙箱 iframe)、代码脚本(语法高亮)和图片。

它在架构上是 host + client 双半区组合:

  • host 端lib/index.js):提供 fileTree 服务与 /api/dsh-file-tree/* 路由,负责真实文件 IO 和安全边界;
  • 客户端lib/client.js):纯 DOM 注入,负责按钮、文件树面板和右侧预览面板。

在安全上做了一些约束:所有路径都经 realpath 规范化并校验必须落在工作空间根内,越界或符号链接逃逸会被拒绝;二进制文件默认拒绝读取,单文件读取大小有上限;HTML 预览放在 sandbox iframe 里阻断脚本执行。客户端是纯 DOM + MutationObserver 实现,不依赖 dsh 官方未暴露的 React 内部 API,随侧边栏重渲染自适应,卸载时通过 ctx.effect 完全清理。

3. dsh-im:统一 IM 渠道插件

仓库:sungatetop/dsh-im

dsh-im 把 dsh agent 暴露到飞书、企业微信、微信、QQ 和钉钉等 IM 平台,提供会话路由、输出回传、远程审批、主动推送,以及一份统一适配器 SDK。

核心能力包括:

  • 多渠道统一接入:飞书 / 企业微信 / 微信 / QQ 机器人 / 钉钉,外加一个 mock 测试渠道;
  • 会话路由:每个「渠道 + 对端」唯一对应一个 agent 会话,自动创建、复用、空闲回收;
  • 输出回传:聚合 agent 的流式输出,在回合结束时回传给 IM;
  • 远程审批:对接 dsh 的审批请求事件,把审批请求推送到 IM,用户在聊天里回复「批准 / 拒绝」即可远程决策;
  • 主动推送:注册 im_push 工具,并对外提供 dsh-im 服务(push / task),供其他插件、定时任务驱动;
  • 统一适配器 SDK:任何 IM 平台只要实现一个 ChannelAdapter 契约即可接入,不需要改动路由层。

其中飞书、钉钉使用长连接模式(不需要公网回调用地址),企业微信等使用回调节点(需要公网可达的 HTTP 地址)。各渠道适配器仅依赖 Node 22 内置能力(fetch / WebSocket / 内置加密),没有额外引入平台 SDK。同时 dsh-im 还通过 dsh web 客户端插件机制,在设置页注入「IM 渠道」菜单项,用来查看各渠道启停状态。

4. dsh-jarvis-theme:Web 界面主题插件

仓库:sungatetop/dsh-jarvis-theme

dsh-jarvis-theme 把 dsh web 界面改造成 J.A.R.V.I.S. 超级助手 HUD 风格(深蓝黑配电光青),只修改样式,完全保留原有布局和所有功能。

它的实现方式是纯 CSS 换肤:通过 dsh 官方设计令牌系统(--dsw-alias-*)覆盖颜色,不触碰布局和功能代码;另加少量 HUD 装饰(径向辉光背景、极淡扫描线网格、青色滚动条、标题与正文的 HUD 风格字体)。注入是幂等的,重复注入不会叠加样式,卸载时自动移除;用 enabled: false 即可禁用而不必卸载。

四、插件的技术要点

写这几个插件的过程中,有一些 dsh 插件开发上的通用经验,简单记录如下:

  • 插件统一导出 apply(ctx);需要对外提供服务时再用类形式继承 Service
  • 依赖的服务通过 inject 声明,资源注册走 ctx 自动清理,手动资源用 ctx.effect() 返回清理函数,保证卸载干净;
  • 配置使用 Schemastery schema,默认值写进 schema,配置写错要能响亮报错,而不是静默忽略;
  • 插件都带着 cordis.patch.yml,安装后通过 patch 机制把插件行插入到 profile 的配置里;
  • 每个插件都要能通过加载测试、冒烟测试、配置校验、清理验证这几项,UI 类插件还需补充对比度/视觉校验。

安装一个已经打包好的插件到 profile,统一用命令行完成(以 dsh-im 为例):

dsh plugin --profile web add ./dsh-im-0.1.0.tgz

安装后可以先运行 dsh --profile web --dump-config 确认配置层生效,再重启 dsh web

五、仓库地址与如何获取

  • dsh(DeepSeek Harness)官方仓库:https://github.com/deepseek-ai/deepseek-harness
  • dsh-browser-control(dsh-ava-bridge:https://github.com/sungatetop/dsh-browser-control
  • dsh-file-tree:https://github.com/sungatetop/dsh-file-tree
  • dsh-jarvis-theme:https://github.com/sungatetop/dsh-jarvis-theme
  • dsh-im:https://github.com/sungatetop/dsh-im

除了官方仓库,本项目各插件大多使用各自独立的 GitHub 仓库发布(账号下均为 sungatetop),源码结构可参考对应仓库的 README。dsh 官方也推荐给插件仓库打上 dsh-plugin 话题,便于检索发现。

六、结语

以上是对 DeepSeek Harness 以及本项目插件的一个平铺直叙的介绍。dsh 目前还处于开发者预览阶段,接口和数据格式都可能变化,插件生态也还在早期。如果对 dsh 本身感兴趣,可以去官方仓库看看文档;如果想基于 dsh 开发插件,可以从本文提到的几个能力方向(浏览器控制、界面增强、消息接入、主题定制)入手,它们的实现各有侧重,可以作为参考。

需要提醒的是,由于 dsh 仍在快速迭代,本文涉及的接口细节可能随时间变化,请以官方仓库的最新文档为准。