---
summary: "用于向插件系统添加功能的序列、文件清单和契约测试模式"
read_when:
- "添加新的插件功能"
- "您正在决定应该拥有什么核心与供应商插件"
- "您需要文件清单和合同测试模式来实现新功能"
title: "添加新功能"
sidebarTitle: "新能力"
---
添加插件 API 尚不具备的功能的推荐顺序,加上文件清单和合同测试模式。 [插件架构内部](/plugins/architecture-internals)指南的一部分。
## 添加新能力
当插件需要当前 API 无法满足的行为时,不要通过私有方式绕过插件系统。应当补齐缺失的能力。
推荐顺序:
1. **定义核心契约。** 决定 core 应当拥有哪些共享行为: 策略、回退、配置合并、生命周期、面向通道的语义,以及运行时辅助函数的形态。
2. **添加类型化插件registration/runtime表面。** 使用最小的有用类型化功能表面扩展`OpenClawPluginApi` and/or `api.runtime`。
3. **Wire 核心 + channel/feature 消费者。** 通道和功能插件应通过核心使用新功能,而不是直接导入供应商实现。
4. **注册厂商实现。** 然后由厂商插件围绕该能力注册它们的后端。
5. **添加契约覆盖。** 添加测试,使所有权和注册形态在长期内保持明确。
这就是 OpenClaw 保持固执己见而不硬编码到某个提供商的世界观的方式。有关具体文件清单和工作示例,请参阅 [添加功能](/plugins/adding-capabilities)。
### 能力检查清单
当你添加一种新能力时,实现通常应该同时涉及这些表面:
- `src//types.ts` 中的 core 契约类型
- core runner/runtime `src//runtime.ts` 中的帮助程序
- `src/plugins/types.ts` 中的插件 API 注册表面
- `src/plugins/registry.ts` 中的插件注册表连接线
- 当 feature/channel 插件需要使用它时,plugin 运行时会在 `src/plugins/runtime/*` 中暴露
- capture/test `src/test-utils/plugin-registration.ts` 中的助手
- ownership/contract `src/plugins/contracts/registry.ts` 中的断言
- operator/plugin `docs/` 中的文档
如果其中某个表面缺失,通常意味着该能力还没有完全集成。
### 能力模板
最小模式:
```ts
// core contract
export type VideoGenerationProviderPlugin = {
id: string;
label: string;
generateVideo: (req: VideoGenerationRequest) => Promise;
};
// plugin API
api.registerVideoGenerationProvider({
id: "xai",
label: "xAI",
async generateVideo(req) {
// generateXaiVideo is a placeholder for your own vendor call.
return await generateXaiVideo(req);
},
});
// shared runtime helper for feature/channel plugins
const clip = await api.runtime.videoGeneration.generate({
prompt: "Show the robot walking through the lab.",
cfg,
});
```
契约测试模式(`src/plugins/contracts/registry.ts` 暴露诸如 `providerContractPluginIds` 之类的所有权查找;测试断言某个插件的 `contracts.videoGenerationProviders` 列表与其实际注册内容一致):
```ts
expect(pluginManifest.contracts?.videoGenerationProviders).toEqual(["xai"]);
```
这样可以让规则保持简单:
- core 负责能力契约 + 编排
- 厂商插件负责厂商实现
- feature/channel 插件使用运行时助手
- 契约测试让所有权保持明确。