QP内容库 Logo
首页
文章
文档
默认分类
关于
登录 →
QP内容库 Logo
首页 文章
文档
默认分类 关于
登录
  1. 首页
  2. 文档
  3. DeepSeek Harness
  4. Cordis 框架教程
  5. 1. 编写第一个插件

1. 编写第一个插件

  • Cordis 框架教程
  • 发布于 2026-09-30
  • 0 次阅读
目录
当前文章没有目录

English | 中文

在本教程使用的 loader 配置中,Cordis 插件模块通过命名导出提供 apply 函数。Cordis 加载模块时,会用一个 上下文 调用 apply;该上下文就是 ctx 对象,插件通过它注册自己贡献的所有内容。

编写插件

在 tmp/cordis-tutorial 目录中(参见环境设置)创建 hello.ts:

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

export const name = 'hello'

export function apply(ctx: Context) {
  console.log('hello from my first plugin')
}

name 导出项是可选的显示元数据;它用于在诊断信息中标识插件。

组合应用

本教程的启动器通过配置组装应用。创建 cordis.yml:

- name: './hello.ts'

该文件是一组 Cordis 配置项的列表。name 是模块指定符,可以是相对路径或 NPM 包名;loader 会挂载每个配置项。各项会并发启动,因此它们在列表中的位置不保证插件的加载先后;顺序由服务依赖(inject,参见第 3 章)决定,而非文件中的位置。

运行

node --import tsx ../../vendor/cordis/bin.js

预期输出:

hello from my first plugin

当没有任何内容继续运行时,进程会自行退出。具体过程如下:

  1. 启动器创建根 Context,并挂载 Loader 插件。
  2. Loader 读取 cordis.yml,解析 ./hello.ts,然后将其作为子插件挂载。
  3. Cordis 调用你的 apply(ctx)。

你的文件中没有框架启动代码:插件描述自己的贡献,cordis.yml 则组合应用。例如,dsh base 就是一份更长的插件组合,由部署 overlay 对它进行修补。

其他两种插件形态

函数是最常见的形式,但 Cordis 接受三种形式:

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

// 1. Function plugin (what you just wrote).
export function apply(ctx: Context) {}

// 2. Object plugin: an object with an `apply` method.
export const objectPlugin = {
  name: 'object-plugin',
  apply(ctx: Context) {},
}

// 3. Class plugin: a Service subclass (covered in chapter 3).
export class MyService extends Service {
  constructor(ctx: Context) {
    super(ctx, 'myTutorialService')
  }
}

在你需要公开服务之前,请一直使用函数形态;第 3 章介绍了何时应当使用类形态。

尝试制造错误

让 apply 抛出异常:

export function apply(ctx: Context) {
  throw new Error('apply exploded')
}

再次运行:进程会因该错误而终止。插件加载失败会明确报错,不会仅跳过该配置项。

还需要尽早了解一个例外:如果某个配置项的模块无法被 解析,例如路径或包名拼写错误,Cordis 会通过 logger 服务报告错误,而不会使进程崩溃。在启动阶段,这条报告可能在 console 导出器开始观察之前丢失。如果新增配置项似乎没有任何效果,请先检查拼写。

下一章:生命周期与 effect:插件卸载时会发生什么。

相关文章

Cordis 教程

English | 中文 Cordis 是 DeepSeek Harness 底层的插件框架:它是一个小型运行时,其中的每项能力,包括工具、LLM(大语言模型)适配器、文件访问乃至 agent loop(智能体循环)本身,都是挂载到共享上下文中的插件。本教程通过动手实践讲解 Cordis:每一章都是

7. 进入 harness

English | 中文 本章会向 harness 的 tools 服务注册一个可由模型调用的工具,通过 harness 工具流水线执行它,并观察结果事件。整个示例无需密钥,也不会调用模型。 工具插件 创建 greet-tool.ts,将它放在 tmp/cordis-tutorial 中: impo

6. 组合与 HMR(热模块替换)

English | 中文 到目前为止构建的每项能力都是插件,cordis.yml 则选择应用的插件树。本章会改变这种组合、热重载一个插件,并诊断始终无法加载的插件。 Cordis 配置项不只有名称 Cordis 配置项除了 name 和 config,还接受其他元数据: - id: greeter

5. 配置

English | 中文 cordis.yml 中的每个 Cordis 配置项都可以携带 config 块,插件则声明一个 schema,在运行 apply 前验证该块。错误配置会导致加载失败,并给出准确的错误:插件绝不会在配置不完整时启动。 可配置插件 创建 config-demo.ts,并将其放

4. 事件

English | 中文 服务支持直接调用;事件让插件无需知道有哪些插件正在监听,就能发出通知。harness 使用事件处理工具结果、模型请求和审批决定等交互。 声明、发出与监听 创建 stats.ts,将它放在 tmp/cordis-tutorial 中。它是一项负责计数并在每次变化时发出通知的服

3. 服务

English | 中文 服务是一个插件提供、其他插件通过 ctx 消费的具名能力。在 harness 中,ctx.tools、ctx.llm 和 ctx.agents 都是服务。消费方只指定 'tools' 之类的能力,而不导入其提供方,因此配置可以选择提供方,无需修改消费方。 提供服务 创建 g

目录
当前文章没有目录

星沉月落夜闻香,素手出锋芒。

Copyright © 2026 quping.com All Rights Reserved. Powered by Halo.
鲁ICP备09092435号