AI 智能体

Cordis 插件框架:DeepSeek Harness 如何组合服务

实用解析 DeepSeek Harness 底层的 Cordis:Context、服务、依赖注入、Effect、事件、隔离与热重载,以及插件架构何时适合 Agent。

Jade1 分钟阅读
Cordis 插件框架:DeepSeek Harness 如何组合服务

Cordis 是 DeepSeek Harness 以 vendor 方式引入的底层插件框架。模型、工具、会话、文件访问、策略,甚至 Agent 循环,都可以作为插件挂载到共享 Context,而不是写死在一个应用里。

**信息核对截至 2026 年 10 月 13 日。**DeepSeek Harness 仓库根目录的 AGENTS.md明确将公共 API 标为 pre-stable,并要求同步更新所有消费者;开发者依赖具体接口前应核对仓库版本。

Cordis 解决的核心问题

Agent 系统会不断产生副作用:事件监听、工具注册、后台任务、服务、文件和网络客户端。加载插件很容易,安全卸载或替换却更难。残留监听器或服务可能在热更新后继续存在,造成重复动作、策略冲突或资源泄漏。

Cordis 把生命周期纳入架构。插件挂载到 Context,通过 Context 注册 Effect,并在卸载时释放;依赖则决定插件何时能够启动。这让动态组合不必假装模块没有状态。

官方 Cordis 教程把它描述为“Harness 中每项能力都是插件”的运行时。要理解上层产品,可继续看什么是 DeepSeek Harness与Agent Harness 详解。

Cordis 的五个核心概念

Context

Context 是服务、事件、配置与 Effect 的容器和可见范围。插件接收 Context,而不是直接导入所有具体实现。子 Context 或隔离 Context 可以让不同插件组看到同一类服务的不同实例。

插件

插件可以是带 apply(ctx) 的函数,也可以是 Service 子类。Loader 从 cordis.yml 挂载插件,形成一棵配置树,而不是一条平铺的启动清单。配置可以启停、分组和隔离不同分支。

服务与依赖注入

服务占据稳定键,例如 ctx.tools、ctx.llm 或 ctx.agents。消费者通过 inject 声明所需服务。依赖缺失时插件等待;提供者消失时,依赖插件自动释放,服务恢复后再重新加载。

这不仅是方便写代码,还能避免消费者调用已经卸载的服务,并用能力依赖表达启动顺序。具体行为见 Harness 的服务文档。

Effect 与释放

Effect 是清理责任属于插件生命周期的工作,例如注册工具、启动定时器、订阅事件或打开资源。Cordis 帮助函数把 disposer 与 Context 关联,使卸载时能反向清理。

这就是“可逆副作用”的实际含义,但它不保证所有外部动作都能撤销。邮件一旦发出、远端记录一旦修改,仍需应用自身提供补偿动作。

事件

事件让插件在不互相导入的情况下观察或拦截行为。Cordis 还支持 waterfall:监听器可以把修改后的结果交给下一个监听器,也可以在自己拥有决策权时短路。事件的派发模式属于公共契约,必须写清楚。

为什么 Agent Harness 适合插件内核

Agent Harness 需要切换模型、增加工具、执行策略、持久化会话并支持不同运行环境。插件内核让这些部分各自变化,同时共享类型化服务。

例如:替换 LLM 适配器而不改工具注册;给两组插件隔离不同超时的 Shell 服务;在工具调用前插入策略监听器;或在开发时只热重载一个插件。

这种架构也要求纪律。每次注册都要有 disposer,服务键要有明确所有者,事件顺序与短路规则要记录,配置变化要测试。“万物皆插件”不意味着边界可以含糊。

配置与热重载

Harness 教程里的启动器会创建根 Context、挂载 Loader,再读取 cordis.yml。YAML 描述插件树和配置;开发时,变更可以让受影响的分支释放后重新挂载。

只有生命周期清理正确,热重载才可靠。插件如果绕过 Context 注册监听器,或打开未管理资源,仍可能跨重载泄漏。因此测试不应只覆盖首次启动,还要反复执行挂载—卸载周期。

Cordis 本身不提供什么

Cordis 不是 Agent 模型、提示词框架或完整安全边界。它不会替你判断工具调用是否安全,不保证沙箱,也不评估模型输出或提供业务级回滚。这些职责属于 Harness 服务与部署策略。

服务隔离可以让插件组拥有不同实例,但底层凭据、操作系统权限和网络访问仍要由基础设施强制执行。

什么时候应该写 Cordis 插件

当能力需要独立生命周期,并且应该可替换或可拦截时,适合写插件:LLM 供应商、工具族、策略层、事件观察器、持久化服务或 UI 扩展。没有独立生命周期和复用价值的简单逻辑,不必强行插件化。

合格插件应只拥有一项清晰能力,声明依赖,验证配置,管理所有 Effect,并同时测试激活与释放。反例是跨越多个无关服务、假设加载顺序,或把清理留给进程退出。

结论

Cordis 为 DeepSeek Harness 提供可组合运行时:Context 定义范围,Service 定义能力,Inject 定义就绪条件,Effect 定义清理,Event 定义扩展点。

它的价值不在“万物皆插件”这句口号,而在增加或移除行为后,系统仍能回到可解释状态。对 Harness 扩展开发者而言,生命周期与依赖边界才是框架真正的 API。

https://floatboat.ai/zh/blog/cordis-plugin-framework

常见问题

Cordis 是什么?
Cordis 是 DeepSeek Harness 内置使用的框架,用于组合插件、Context、Service、依赖注入、Effect 与 Event。
DeepSeek Harness 为什么使用 Cordis?
Cordis 提供可替换模块和明确的生命周期控制,让工具与服务能够按规则挂载、等待、重载和清理。
Cordis Context 是什么?
Context 是插件访问服务、注册行为并把资源限定在特定生命周期内的容器。
Cordis 如何实现依赖注入?
插件通过注入规则声明所需服务。Cordis 会等待服务就绪,并随服务可用性变化启用或停用依赖行为。
Cordis 的可逆 Effect 是什么?
Effect 把副作用和清理函数配对。插件卸载或 Context 结束时,Cordis 执行清理,避免监听器、定时器等资源泄漏。
Cordis 支持热重载吗?
其生命周期与可逆 Effect 设计支持安全的插件重载模式,前提是插件通过框架的清理机制登记资源。
Cordis 是 Agent 模型或安全沙箱吗?
都不是。Cordis 是运行时组合基础设施,不提供 AI 模型,也不能替代操作系统隔离、权限设计或应用安全控制。
什么情况下该把 Harness 扩展做成 Cordis 插件?
当扩展有独立生命周期、依赖共享服务,或需要在不改写主运行时的情况下移除和测试时,适合做成插件。