DeepSeek Harness 第一个插件
DeepSeek Harness 最核心的架构优势就是全插件化、可逆、事件驱动。所有官方能力、社区拓展能力全部基于插件实现。普通用户使用插件,开发者可以从零开发自定义插件,实现私有工具、专属模型适配器、自定义存储、UI面板、工作流等无限拓展能力。
本文为零基础插件开发完整教程,讲解插件原理、工程结构、完整开发流程、各类插件模板、配置定义、日志调试、打包发布,是 Harness 高阶二次开发的核心文档。
一、插件开发核心原理
DeepSeek Harness 底层基于 Cordis 微内核,所有插件遵循统一规范,无特权插件、无硬编码依赖。
1. 核心机制
- 统一入口:所有插件必须导出
apply(ctx: Context)函数,内核加载插件时自动执行。 - 上下文 Context:内核注入的全局能力,用于注册工具、监听事件、读取配置、打印日志。
- 事件驱动通信:插件之间不直接调用函数,通过全局事件总线解耦协作。
- 完全可逆:卸载插件时,所有注册的工具、监听、UI、配置自动清除,无内存残留、无副作用。
2. 插件开发技术栈
官方推荐:TypeScript(类型完整、适配内核规范),同时兼容原生 JavaScript。
二、开发环境完整搭建
1. 环境依赖
- Node.js 22+ / 24+(官方推荐)
- 最新版 DeepSeek Harness 内核
- TypeScript 编译环境
2. 初始化插件工程
# 全局安装最新 Harness
npm install -g @deepseek-ai/dsh@latest
#新建插件项目文件夹
mkdir dsh-plugin-custom-demo
cd dsh-plugin-custom-demo
npm init -y
# 安装核心开发依赖
npm install @deepseek-ai/dsh-core
npm install -D typescript @types/node
3. TS 配置文件 tsconfig.json
项目根目录新建 tsconfig.json,适配 Harness 插件编译规范:
{ "compilerOptions": { "target": "ES2022", "module": "CommonJS", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "resolveJsonModule": true }, "include": ["src/**/*"] }
三、插件工程标准结构
标准 Harness 插件固定结构,所有官方/社区插件统一遵循:
dsh-plugin-demo/ ├── src/ │ └── index.ts # 插件主入口 ├── dist/ # 编译产物(自动生成) ├── cordis.yml # 插件清单(核心识别文件) ├── package.json └── tsconfig.json
cordis.yml 插件清单详解
该文件是内核识别插件的唯一依据,必须存在:
name: dsh-plugin-demo
version: 0.1.0
description: 自定义 Harness 演示插件
main: dist/index.js
#依赖版本约束
dependencies:
"@deepseek-ai/dsh-core": ">=0.20.0"
# 自定义配置面板(WebUI自动生成表单)
config:
apiKey:
type: string
label: 第三方密钥
secret: true
enableFeature:
type: boolean
label: 启用自定义功能
default: true
四、最简自定义工具插件(入门必学)
实现一个可被 Agent 自动调用的自定义工具:获取当前系统时间。
src/index.ts
import { Context, defineTool } from "@deepseek-ai/dsh-core";export function apply(ctx: Context) {
// 注册自定义工具
ctx.tools.register(defineTool({
name: "system_get_time",
description: "获取当前系统时间,支持自定义时区,用于时间查询、任务计时场景",
parameters: {
timezone: {
type: "string",
required: false,
description: "时区,默认 Asia/Shanghai"
}
},
async execute(args) {
const tz = args.timezone ?? "Asia/Shanghai";
const now = new Date().toLocaleString("zh-CN", { timeZone: tz });
return 【系统时间】${now};
}
})); // 读取插件自定义配置
ctx.logger.info("插件已加载,自定义功能开关:", ctx.config.enableFeature);
}
编译插件
tsc
五、三大主流插件开发模板
1. 事件监听插件(监听系统全生命周期)
可以监听任务启动、工具执行、会话创建、模型返回等事件,实现日志统计、自动告警、任务拦截能力。
export function apply(ctx: Context) { // 任务开始 ctx.on("task:start", (task) => { ctx.logger.info("任务开始:", task.taskId); }); // 单次工具调用结束
ctx.on("tool:finish", (res) => {
ctx.logger.info("工具执行完成:", res.toolName, res.result);
}); // 会话创建
ctx.on("session:create", (sess) => {
ctx.logger.info("新会话创建:", sess.id);
});
}
2. 自定义模型适配器插件
用于接入私有模型、小众 VLM、本地私有化大模型,完全替换官方模型能力。
import { Context, defineModelProvider } from "@deepseek-ai/dsh-core";export function apply(ctx: Context) {
ctx.modelProviders.register(defineModelProvider({
id: "private-vlm",
label: "私有多模态模型",
capabilities: {
inputModalities: ["text", "image"]
},
async chatCompletion(req) {
return { content: "模型推理结果" };
}
}));
}
3. 自定义UI面板插件
可在 WebUI 新增设置页、数据看板、工具控制台,拓展前端界面能力。
export function apply(ctx: Context) { ctx.ui.registerPanel({ id: "custom-dashboard", title: "自定义插件控制台", component: "./dist/ui/index.jsx" }); }
六、插件生命周期规范(开发必遵守)
- 加载阶段:执行 apply,注册工具、事件、模型、UI。
- 运行阶段:响应事件、被 Agent 调度执行。
- 卸载阶段:内核自动销毁所有注册项,零残留。
强制规范:所有定时器、监听、网络请求必须通过 ctx 注册,禁止全局变量,否则无法自动清理。
七、插件打包与社区发布
1. 本地打包
编译完成后,dist 目录即为可运行插件产物。
2. NPM 公开发布
修改 package.json 信息后执行:
npm publish
发布后所有人可通过 dsh plugin add 一键安装。
3. 社区收录
GitHub 仓库添加话题标签:dsh-plugin,即可进入官方社区插件生态索引。
八、插件安全开发规范
- 禁止硬编码密钥、Token、隐私信息,统一使用插件 secret 配置。
- 所有工具执行必须参数校验,杜绝命令注入、路径遍历漏洞。
- 禁止绕过沙箱直接读写系统文件。
- 禁止静默上传本地用户数据。
- 工具描述必须清晰,保证大模型可精准判断调用时机。
九、常见开发问题
- 插件加载成功但不调用工具:工具 description 描述模糊,模型无法识别使用场景。
- 卸载插件残留功能:存在全局定时器、原生监听,未使用 ctx 托管。
- UI 面板不显示:前端组件打包路径错误或未编译 JSX。
- 配置不生效:cordis.yml 配置格式错误,或未重启服务。
本篇小结
DeepSeek Harness 插件开发拥有极低的入门门槛和极高的拓展上限。开发者只需遵循 apply + Context 注册 规范,即可自由开发工具、模型、UI、事件、存储类插件,完全脱离内核源码限制,实现个性化智能体能力定制。开发完成的插件可本地自用、团队共享、开源发布,是进阶 Harness 二次开发的核心能力。
0 条笔记