DeepSeek Harness 蓝皮书
开发者指南

Cordis 入门

DeepSeek Harness 底层 Cordis 插件框架的核心概念:插件、ctx、服务、事件与可逆副作用

Cordis 是 DeepSeek Harness 底层以 vendor 方式引入的插件框架。编写 Harness 插件之前,先掌握下面这些核心概念;更完整的服务/事件参考见各能力子系统的生成文档。

五个核心概念

  • 插件是实现 Service 的对象。 插件可以是一个带可选 injectapply(ctx) 字段的函数,也可以是 Service 子类,其生命周期由 Cordis 挂载到当前上下文中。
  • 上下文是服务的容器。 一个服务占据稳定的 ctx.<key>(如 ctx.toolsctx.llmctx.sessions);其他插件通过 key 查找服务,而非导入具体实现。
  • inject 声明服务依赖。 插件声明所需服务后,会等待这些服务就绪才启动;加载顺序由服务依赖表达,而非手动编排启动序列。
  • 类型化事件用于通信。 服务通过 TypeScript 声明合并注册事件名,再以 emitwaterfall(瀑布式事件)、parallelserial 方式分发,分别对应观察、包装、并行扇出或按序执行。
  • 注册是可逆的副作用。 提示词片段、工具 schema、适配器、提供方与监听器通过 ctx.effect()ctx.on() 安装,reload 与 teardown 时会按预期撤销。

事件分发模式

每个事件具有以下分发模式之一,且只能通过对应方法分发。

模式是否 await分发顺序是否有返回值
emit监听器按注册顺序观察
waterfall监听器按注册顺序观察
parallel所有监听器并行观察事件
serial监听器按注册顺序观察

分发模式是事件公开约定的一部分。

waterfall 语义

ctx.waterfall 是环绕中间件。监听器接收 (...args, next),调用 next() 会把下游结果带回当前层,可再包装后返回;不调用 next() 直接返回则短路。

协作式监听器通常修改一个共享请求或决策对象,然后委托。仅做标注或观察的监听器必须委托;策略监听器在拥有决策权时可以直接返回。

一个最小插件

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

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

export function apply(ctx: Context) {
  ctx.effect(() => {
    const timer = setInterval(heartbeat, 5000)
    return () => clearInterval(timer) // disposer(资源释放函数)
  })
}

inject 让插件等待 tools 就绪;ctx.effect() 返回的函数会在插件卸载时运行。

实践规则

  • 把行为封装成插件:工具流水线属于 ctx.tools,模型流式输出属于 ctx.llm,agent loop(智能体循环)协调属于 ctx.agents
  • 拦截与策略优先用事件;直接能力调用优先用服务方法。
  • 每个注册都应有对应的 disposer:从 ctx.effect() 返回一个,或用 Cordis 提供的辅助方法自动处理。若 teardown 顺序有要求,把相关工作放进同一个 effect。

下一步

本页目录