
什么是服务服务是一个插件向其他插件公开的命名能力。在 Harness 中tools、llm、agents 都是服务它们挂载在 ctx 上ctx.tools、ctx.llm、ctx.agents。内置服务是什么典型用法ctx.tools工具运行时ToolRuntime注册 / 调用工具ctx.llm大语言模型服务LLM注册适配器、发起模型请求ctx.agents智能体服务Agent管理子智能体用 inject 声明依赖如果你的插件需要某个服务就把它写进 inject 数组。框架会确保这些服务就绪后才加载你的插件。实例// 文件路径scratch-plugin/src/my-tool-plugin.tsimport type { Context } from deepseek-ai/cordisexport const name my-tool-plugin// 声明依赖需要 tools 服务export const inject [tools]export function apply(ctx: Context) {// 走到这里时ctx.tools 一定已就绪ctx.tools.register(/* ... */)}apply 执行时inject 声明的服务已经全部就绪。这是框架的保证不需要你在代码里做任何等待。依赖未就绪插件等待如果某个服务还没准备好插件不会执行。它的 Fiber 会停在 PENDING 状态等服务出现。在生命周期里PENDING 表示已声明但所需依赖未就绪。如果服务一直不来插件就一直等不会出错也不会执行 apply。必需依赖与可选依赖inject 声明的是必需依赖服务缺席时插件不加载。如果某个服务可用可不用用可选依赖不写 inject在使用处用 ctx.get() 查询。实例// 可选依赖省略 inject用 ctx.get() 查询import type { Context } from deepseek-ai/cordisexport function apply(ctx: Context) {// metrics 服务可能在也可能不在const metrics ctx.get(metrics)// 可选链不存在就跳过不报错metrics?.record(plugin_loaded, 1)}服务消失时会发生什么如果运行期间必需服务消失比如提供方被卸载会发生两件事。第一依赖它的插件会自动 dispose释放资源。第二当服务重新出现时插件自动重新加载。这防止插件调用一个已不存在的服务。提示这条规则与自动清理配合——卸载会触发第 8 篇讲的 disposer。小结与自测用 inject 声明必需服务框架保证服务就绪后才执行 apply可选服务用 ctx.get() 查询。1. inject 数组声明的是什么2. 服务未就绪时插件处于什么状态3. 可选依赖应该怎么声明