乐于分享
好东西不私藏

用 DeepSeek Harness 写插件,还挺上头

用 DeepSeek Harness 写插件,还挺上头

我是小虎,科技出版社《AI超级个体——一人公司完全指南》作者擅长AI编程、获客自动化,专注于AI培训、个人IP打造、一人公司、创业成长。

说出来你可能不信,我第一次给 DeepSeek 新出的 Harness 写插件,从头到尾没超过半小时。

而且写出来的那个插件,现在每天替我把第二天的工作草稿打好。

大家好,我是小虎。

最近 DeepSeek 开源了一个叫 Harness 的东西,圈里人叫它「黑色鲸鱼」。

它不是新模型,是给大模型套在外面的「执行层」,一句话公式,Model 加 Harness 等于 Agent。

模型负责想,Harness 负责干。发布才一周,GitHub 上打着 dsh-plugin 标签的社区插件已经 900 多个。

我跟你说,这玩意最狠的一句口号就四个字,一切皆插件。模型、工具、界面、会话记录,全都是插件拼起来的。

你不用改它一行源码,想加什么能力就写一个插件插进去。

但我发现一个怪现象。大多数人拿到 Harness,只会像个聊天机器人一样跟它对话。

这就好比你买了台数控机床,天天拿它当锤子敲钉子。真正会玩的人,是给自己写插件,把重复活彻底外包出去。

今天这篇,我就手把手带你写一个。不讲虚的,写完你就能让 AI 多长出一种本领。

先把工作台跑起来

写插件之前,得先把 Harness 本身跑起来。

它需要 Node.js 22.19 以上版本,这个你本机大概率已经有了,命令行敲一下 node --version 看看,22 开头就行。

起来就一行命令。

...
npx @deepseek-ai/dsh web

跑完浏览器会自动打开 http://127.0.0.1:3080,一个本地网页界面,你的数据全在你自己机器上。

第一次打开会让你填 DeepSeek 的 API Key,去 platform.deepseek.com 注册一个就有。填完就能用了。

看到这个网页界面,说明工作台立起来了。接下来才是重头戏。

一切皆插件,到底怎么插

Harness 底层用的是一套叫 Cordis 的插件框架。

它的核心思想特别简单,所有能力都是「插件」,插件就是一个普通的 TypeScript 文件,导出几个固定的东西。

我第一次看源码的时候有点通了。原来官方自己那 195 个包,从头到尾全都是插件,包括那个跑命令的工具、那个存会话记录的功能。

你写的插件和它们地位完全一样,没有二等公民。

一个最小插件长这样。

...
// my-plugin.ts
import { defineTool } from '@deepseek-ai/dsh-tools'

export const name = 'my-plugin'
export const inject = ['tools']

export function apply(ctx) {
  ctx.tools.register(defineTool({
    name: 'hello_world',
    description: '向某人打招呼,用来验证插件是否加载成功',
    parameters: {
      who: { type: 'string', required: true, description: '要打招呼的人' }
    },
    output: {
      schema: { type: 'object', additionalProperties: false, properties: { message: { type: 'string', required: true } } },
      render: (_args, value) => [{ type: 'text', text: value.message }]
    },
    async execute(args) {
      return { message: `你好,${args.who},插件加载成功` }
    }
  }))
}

这段代码干了一件事,往 Harness 里注册了一个叫 hello_world 的工具。AI 在对话里就能调用它了。

注意几个坑,都是我踩过的。export 只能用具名导出,千万别写 export default,写了注入声明就会被悄悄丢掉,插件看着加载了其实不干活,还不报错,最坑。

parameters 里对象类型的输出,schema 必须写 additionalProperties: false,不然注册直接失败。

inject: ['tools'] 的意思是等工具注册表就绪了再执行,顺序不能乱。

一行配置把它挂上去

光有插件文件不够,得告诉 Harness 把它挂进来。新建一个 cordis.yml 文件。

...
- insert:
  - id: my-plugin
    name: '/绝对路径/你的目录/my-plugin.ts'

这里有个细节,路径必须写绝对路径,不能写相对路径,这是 Cordis 的脾气。

然后带补丁启动。

...
pnpm dsh web --patch ./cordis.yml

回到网页界面,在对话里说「用 hello_world 跟小虎打个招呼」。

如果它回你「你好,小虎,插件加载成功」,成了。你的第一个插件活了。

说真的,我第一次看到它真的调用了我写的工具,那种感觉挺奇妙。

不是又学了个 API,是给 AI 接了一根自己的神经。

来点真格的,自动写日报

hello 只能验证加载,没啥用。我给你看我真正在用的那个,自动生成工作日报草稿。

痛点很实在。每天下班前憋日报,每周五花一小时把五篇日报翻成周报。这活重复、机械、还容易漏。

我就写了个插件,让它读我工作区里的记录,按模板生成第二天的日报草稿。

核心思路和上面一样,只是工具里干的事更具体。

...
import { defineTool } from '@deepseek-ai/dsh-tools'
import { readFileSync, writeFileSync, existsSync } from 'fs'

export const name = 'daily-draft'
export const inject = ['tools']

export function apply(ctx) {
  ctx.tools.register(defineTool({
    name: 'gen_daily_draft',
    description: '读取昨天的待办,按模板生成今天的日报草稿',
    parameters: {
      workspace: { type: 'string', required: true, description: '工作区目录绝对路径' }
    },
    output: { schema: { type: 'object', additionalProperties: false, properties: { path: { type: 'string', required: true } } },
      render: (_a, v) => [{ type: 'text', text: `草稿已生成,${v.path}` }] },
    async execute(args) {
      const todoPath = `${args.workspace}/todo.md`
      const draft = existsSync(todoPath)
        ? `【草稿待确认】\n昨日待办:\n${readFileSync(todoPath, 'utf-8')}\n(请核对当天实际进展后填写)`
        : '【草稿待确认】今日暂无昨日待办记录,请补充。'
      const out = `${args.workspace}/daily-$(date +%F).md`
      writeFileSync(out, draft)
      return { path: out }
    }
  }))
}

这个插件做了一件关键的事,它只生成草稿,明确标了「待确认」,绝不替你编造当天没发生的事。

这点特别重要,AI 最会一本正经地编内容,得用规则把它框住。

我顺手说个金句,这是我写这个插件时最大的体会。

真正的自动化不是你学会了所有工具,而是你只需要说一句话,工具自己串起来干活。

想发给别人用,打个包

自己本地改着玩用绝对路径就行。想发布到社区让别人一键安装,得打个包。

package.json 里加一段声明。

...
{
  "name": "dsh-daily-draft",
  "type": "module",
  "main": "my-plugin.ts",
  "dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
}

cordis.patch.yml 里写挂载信息,然后用 dsh plugin --profile web add github:你的账号/你的仓库,别人就能装了。

还有个偷懒的办法。现在流行 Vibe Coding,你直接把插件规范丢给 Cursor 或者任何编程工具,说「帮我做个插件,功能是某某某」,它秒级就能吐出完整的源文件和配置文件。

DSH 的插件结构天生适合 AI 生成,一个单文件加一个 apply 入口加一份 YAML,清爽得很。

几个真话

有,说实话。Harness 现在还是 0.1.0 的预发布版,官方自己说接口还会变,今天能跑明天可能要改。别急着上生产环境,先尝鲜。

还有,插件本质是能在你电脑上跑的代码。别装来路不明的插件,来源不清的等于把家门钥匙给别人。只装官方或者高星的。

另外,写插件要会一点点 TypeScript。如果你连 JavaScript 都没碰过,上手会有个坡度。但说真的,比起学一门完整编程语言,这坡度温柔多了。

写在最后

DeepSeek 把执行层这扇门打开了,普通人能玩的空间比想象中大。

你不需要成为程序员,只需要想清楚,哪件重复活值得外包给一个自己写的插件。

我自己的下一步,是把日报插件再串一个周报插件,周五自动汇总。慢慢来,先把第一个 hello 跑通。

我还在持续更新短视频自动化的系列内容。想深入学习这块的话,后台私信“加入”,加入 小虎 和 华峰老师 联合创办的 AI群星会 星球。

如果有收获,请点赞、转发、收藏,我主页还有很多AI、agent、skill、一人公司、自媒体相关的好文。
近期更多好文