DeepSeek Harness 声明依赖:inject 与内置服务 菜鸟教程
之前我们以及学会了独立运行的插件,但多数插件要用别人的能力:工具注册表、LLM、Agent。
本章节我们将介绍如何声明依赖,以及框架如何保证依赖就绪后才执行 apply。
什么是服务
服务是一个插件向其他插件公开的命名能力。
在 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.ts
import type { Context } from ‘@deepseek-ai/cordis’
export 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/cordis’
export 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. 可选依赖应该怎么声明?
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/gpt/post/20260818/DeepSeek-Harness-%E5%A3%B0%E6%98%8E%E4%BE%9D%E8%B5%96inject-%E4%B8%8E%E5%86%85%E7%BD%AE%E6%9C%8D%E5%8A%A1-%E8%8F%9C%E9%B8%9F%E6%95%99%E7%A8%8B-2/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com