切换手册章节
Cordis 怎样让插件一起工作?
财务想暂时停用自动报销回执。理想的结果是新提交的单据先不生成回执,昨天的回执依然能查到,恢复后每笔只生成一张。Cordis 处理的正是这类问题:谁提供能力、谁依赖它、移除组件后谁来收拾现场。
本篇目录 5 节
“一切皆插件”是哪一层的说法
DeepSeek 在 Harness 中英文官网使用“一切皆插件”和“Everything is a plugin”描述产品架构。模型适配器、工具注册表、会话日志,甚至负责“请求模型、执行工具、再继续”的 Agent 循环,都可以由插件提供。工具和模型在同一款应用里配合工作,靠的是事先约定好的服务与事件。
Cordis 是承载这些约定的 JavaScript / TypeScript 插件框架。上游项目的英文自述是“A Meta-Framework of Spatiotemporal Composability.”,可译为“面向时空可组合性的元框架”。这里说的“空间”涉及组件之间如何声明、解析和跟踪依赖,“时间”涉及组件退出时如何撤销自己建立的注册。
沿着一张回执认出五个部件
| 词 | 回执台里发生了什么 | 回到 Harness 怎么读 |
|---|---|---|
| Context(上下文) | 回执台通过 ctx 找到本组的格式服务。 | 插件通过 ctx.tools 找工具注册表,通过 ctx.llm 找模型服务。这里的 ctx 是应用运行时对象;聊天上下文是交给模型的消息、材料等输入。 |
| Service(服务) | 格式服务把编号和金额排成一行。换版时仍可沿用 officeFormat 这个名字。 | 一个稳定的服务名可以由不同插件实现,消费方按约定调用。 |
| inject(依赖声明) | 回执台把 officeFormat 列为必需。服务可用时才上岗,服务撤下后等待恢复。 | 工具插件可以声明依赖 tools,再向它注册具体工具。 |
| 事件 | 有人提交报销,就发出一次 office/submitted。提交方不用认识每个监听者。 | 例如观察 tools/result 的插件可以单独记录结果。事件的分发方式由事件约定决定。 |
| Fiber / effect(实例与清理) | 本次挂载的回执台拥有监听器和营业标记。卸载时停止监听并移除标记。 | ctx.plugin 返回此实例的句柄。ctx.on 注册的监听随实例清理;额外开的定时器、连接需要提供相应的释放逻辑。 |
给同一个服务名划分办公区域
行政组与门店组都可以把审批规则叫 officeRule。通过 ctx.isolate('officeRule') 建立两个独立的子作用域后,行政区查到自己的规则,门店区查到另一套。根上下文里若没有提供该服务,也就查不到它。程序员由此可以让同一个消费插件在两个区域复用。
作用域约束的是这个程序怎样查找依赖。能否读取某个真实目录,还取决于宿主进程与实际工具的访问控制。写入磁盘的文件、已经发送的消息等外部结果,都需要业务自己处理撤销或补救。
把例子对回真正的 Harness 插件
RC5 官方教程最后做了一个 greet 工具。插件先声明依赖 tools,工具注册表就绪后才登记参数和执行函数。另一插件监听工具结果。官方例子用程序发起一次调用,因此无需模型账号也能观察真实的工具流水线。
可用这个办法读其他插件:先找 inject 判断它等谁,再找 ctx.<服务名> 看它调用谁,最后看 ctx.on、ctx.effect 或注册函数怎样撤回它贡献的能力。将结果事件当作日志观察时,还要分清事件到达与最终任务成功。
查清版本再照抄示例
本文以 Harness 0.2.1-rc.5(提交 b830ec9)为准。其 vendor 清单记录 Cordis 内核的上游来源为 cordiverse/cordis 的 4.0.0-rc.7(提交 56b3d4f)。Harness 把源码纳入自己的仓库,记录本地修改,并以 @deepseek-ai/cordis 重新发布。RC5 清单及本练习采用的包版本是 4.0.5。
上游给这门技术命名,RC5 的中文 API 与源码则说明这版 Harness 的具体行为。遇到示例写 import … from 'cordis' 时先看它针对哪个包;本次动手使用 @deepseek-ai/cordis。
来源与延伸阅读
知识库与演示素材
知识库附录含录屏分镜。练习包里的 INDEX.md 可按题目查找会议简报、只读目录核对、Cordis 报销回执,以及门店销售和团队练习。