高度概念

插件是 dsh 的核心; 几乎所有的功能甚至界面都以插件的方式存在以及组合。

dsh插件是一个cordis设计理念的插件。

结合dsh的基本使用方法,落到实处,它本质一个导出apply函数的TypeScript模块。框架在加载时调用 apply,传入一个 ctx(上下文对象),我们通过 ctx 注册能力。(更加具体的原理请自行搜索cordis)

1
2
3
4
5
6
7
8
9

import type { Context } from '@deepseek-ai/cordis'

export const name = 'my-plugin'

export function apply(ctx: Context) {
// Register capabilities here.
}

解读实践插件开发

最小插件解读

我们从0开始,给deepseek的界面添加逐渐复杂的插件功能。

1
2
3
4
5
mkdir -p my-plugin-to-do
cd my-plugin-to-do
npm init -y


首先,dsh的仓库是一个使用pnpm进行workspace管理的仓库。我们的插件要想不报错,首先是需要将我们的插件添加到dsh的workspace中,做好项目的初始化。否则,即使是最小的哪那个插件示例,在开发的过程当中也会找不到模块“@deepseek-ai/cordis”或其相应的类型声明。

  • package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"name": "@my-plugin/to-do",
"description": "我自己的插件: To-Do",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"publishConfig": {
"access": "public"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "module",
"peerDependencies": {
"@deepseek-ai/cordis": "workspace:^"
},
"dependencies": {
"@deepseek-ai/cordis": "workspace:^"
}
}

需要将cordis添加到所需的依赖,这个是本地仓库的包,所以需要使用workspace:^来引用。

  • tsconfig.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"extends": "../tsconfig.base.json",
"compilerOptions": {
"rootDir": "src",
"outDir": "lib/types"
},
"include": ["src"],
"references": [
{
"path": "../vendor/cosmokit"
},
{
"path": "../vendor/cordis"
}
]
}


tsconfig.json当中使用references来说明插件的依赖路径,这能让编辑器能够正确识别链接到插件的类型声明。

之后执行

1
2
pnpm exec tsc -b my-plugin-to-do/tsconfig.json

这一个命令本质上是在仓库根目录里,使用项目本地安装的 TypeScript 编译器,按 build mode 去构建 my-plugin-to-do 这个 TS 工程。

  • pnpm exec:用当前 workspace 里安装的可执行文件来运行命令,这里就是本地的 tsc,不用依赖全局安装。

  • tsc:TypeScript 编译器。

  • -b:–build 模式,不只是“编译单文件”,而是把传入的 tsconfig 当成一个工程来构建,并处理 references。

  • my-plugin-to-do/tsconfig.json:指定要构建的项目配置文件,也就是 tsconfig.json。
    结合你这个配置,它会做什么 从 tsconfig.json 看:

  • extends: “../tsconfig.base.json”:继承仓库公共 TS 配置。

  • include: [“src”]:只处理 my-plugin-to-do/src 下面的 TypeScript 源码。

  • rootDir: “src”:把 src 当作源码根目录。

  • outDir: “lib/types”:编译产物输出到 my-plugin-to-do/lib/types。

  • references:这个项目依赖两个被引用的 TS 工程:

    • ../vendor/cosmokit
    • ../vendor/cordis
      所以这条命令通常会:

先检查并按需要构建 vendor/cosmokit 和 vendor/cordis
再构建 my-plugin-to-do
做类型检查
按配置把输出写到 lib/types

整体的最小插件完整结构应该如下所示:

01_插件项目结构.png

这样整个插件的代码结构就和官方的大差不差了

插件代码实现的逻辑之后再看,现在我们需要将我们的插件连接到dsh的运行当中,因此,我们需要新建一个yml配置文件。如下:

1
2
3
4
5
- insert:
- id: my-plugin-to-do
name: 'C:/D/front_workpalce/deepseek-harness/dsh-plugin-to-do/src/index.ts'


通过pnpm dsh web --patch ./my-plugin-to-do/cordis.yml 将我们的配置文件透传给到dsh。dsh也能够链接我们真实的插件代码。

02_插件运行示例.png

下一章,我们将带着我们的理解,完成一个带有逻辑的工具类插件实现,敬请期待。