Appearance
新增能力(贡献者指南)
这是面向 OpenClaw 核心开发者的贡献者指南。如果你在构建外部插件,请参阅 构建插件。
当 OpenClaw 需要一个新领域(如图像生成、视频生成或未来的厂商支持功能)时,使用本指南。
核心规则:
- plugin = 所有权边界
- capability = 共享核心契约
这意味着你不应该从把某个厂商直接接入某个 channel 或 tool 开始——而要从定义 capability 开始。
何时创建新 Capability
当以下所有条件均成立时,才创建新 capability:
- 多个厂商都可能合理地实现它
- channels、tools 或 feature plugins 应该能够消费它,而无需关心具体厂商
- core 需要拥有回退、策略、配置或交付行为
如果工作仅限于单一厂商且尚无共享契约,先停下来定义契约。
标准开发顺序
- 定义有类型的 core 契约。
- 为该契约添加插件注册。
- 添加共享运行时辅助函数。
- 接入一个真实厂商插件作为验证。
- 将 feature/channel 消费者迁移到运行时辅助函数。
- 添加契约测试。
- 编写面向运维者的配置文档和所有权模型说明。
代码归属
Core:
- 请求/响应类型
- Provider 注册表 + 解析
- 回退行为
- 配置 schema 及标签/帮助文本
- 运行时辅助函数接口
Vendor plugin:
- 厂商 API 调用
- 厂商认证处理
- 厂商特定的请求规范化
- capability 实现的注册
Feature/channel plugin:
- 调用
api.runtime.*或对应的plugin-sdk/*-runtime辅助函数 - 绝不直接调用厂商实现
文件清单
新增 capability 时,预计需要涉及以下区域:
src/<capability>/types.tssrc/<capability>/...registry/runtime.tssrc/plugins/types.tssrc/plugins/registry.tssrc/plugins/captured-registration.tssrc/plugins/contracts/registry.tssrc/plugins/runtime/types-core.tssrc/plugins/runtime/index.tssrc/plugin-sdk/<capability>.tssrc/plugin-sdk/<capability>-runtime.ts- 一个或多个
extensions/<vendor>/... - 配置/文档/测试
示例:图像生成
图像生成遵循标准模式:
- core 定义
ImageGenerationProvider - core 暴露
registerImageGenerationProvider(...) - core 暴露
runtime.imageGeneration.generate(...) openai和google插件注册各自的厂商实现- 未来的厂商可以注册相同契约,无需修改 channels/tools
配置 key 与视觉分析路由相互独立:
agents.defaults.imageModel= 分析图像agents.defaults.imageGenerationModel= 生成图像
保持两者独立,使回退和策略保持明确。
审查清单
在发布新 capability 之前,请验证:
- 没有 channel/tool 直接导入厂商代码
- 运行时辅助函数是唯一的共享路径
- 至少有一个契约测试断言了捆绑所有权
- 配置文档列出了新的 model/config key
- 插件文档说明了所有权边界
如果 PR 跳过 capability 层,直接将厂商行为硬编码到 channel/tool 中,请退回并先定义契约。