一、Provider 扩展定位
Provider 扩展是 OpenClaw 的模型接入层——通过插件机制接入 40+ 模型厂商,对上提供统一的 ProviderPlugin 接口。
┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Agent RT │ │ Channel │ │ Skills │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ProviderPlugin Interface │ │
│ │ id · label · auth · catalog · resolveDynamicModel │ │
│ └──────────────────────────────────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┼─────────────────────────────────┐
│ extensions/providers/ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ openai/ │ │anthropic/│ │ ollama/ │ │ gemini/ │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
二、模块结构
| 文件 | 职责 |
|---|---|
src/plugins/types.ts | ProviderPlugin 类型定义 |
extensions/providers/<name>/index.ts | Provider 插件入口 |
extensions/providers/<name>/api.ts | 运行时 API 实现 |
extensions/providers/<name>/provider-discovery.ts | 独立发现插件 |
extensions/providers/<name>/openclaw.plugin.json | Manifest 元数据 |
src/agents/model-catalog.ts | 模型目录加载 |
src/agents/model-catalog.types.ts | ModelCatalogEntry 类型 |
三、ProviderPlugin 接口
文件:
src/plugins/types.ts
3.1 核心字段
| |
3.2 模型解析上下文
| |
3.3 Catalog 类型
| |
3.4 ModelCatalogEntry
| |
四、认证系统
4.1 ProviderAuthMethod
| |
4.2 ProviderAuthContext
| |
4.3 ProviderAuthResult
| |
4.4 API Key 认证辅助函数
| |
五、文件结构
5.1 标准 Provider 扩展结构
extensions/<provider-name>/
├── index.ts # 插件入口(definePluginEntry)
├── api.ts # 运行时 API 实现
├── setup-api.ts # 轻量级 Setup 钩子(可选)
├── provider-discovery.ts # 独立发现插件(可选)
├── openclaw.plugin.json # Manifest 元数据
├── package.json # 包元数据
├── tsconfig.json # TypeScript 配置
└── src/
├── discovery-shared.ts # 共享发现逻辑
├── defaults.ts # 常量默认值
├── embedding-provider.ts # 记忆嵌入适配器(可选)
├── stream.ts # 自定义流处理(可选)
├── provider-models.ts # 模型目录构建器
└── provider-base-url.ts # Base URL 解析
5.2 Ollama 示例
extensions/ollama/
├── index.ts # 插件入口
├── provider-discovery.ts # 独立发现插件
├── openclaw.plugin.json # Manifest
└── src/
├── discovery-shared.ts # 共享 auth/discovery 逻辑
├── defaults.ts # OLLAMA_DEFAULT_BASE_URL 等
├── provider-models.ts # 模型目录构建器
├── provider-base-url.ts # URL 工具
├── embedding-provider.ts # 记忆嵌入适配器
├── setup.ts # 交互式安装向导
└── stream.ts # 自定义流封装
六、完整实现示例
6.1 index.ts(插件入口)
| |
6.2 api.ts(运行时实现)
| |
6.3 OpenAI Provider 示例
| |
6.4 Discovery Only Provider 示例
| |
七、Manifest 配置
文件:
extensions/ollama/openclaw.plugin.json
| |
八、开发步骤
8.1 创建扩展目录
extensions/<provider-name>/
8.2 创建 package.json
| |
8.3 创建 tsconfig.json
| |
8.4 创建 index.ts
| |
8.5 创建 api.ts
实现 ProviderPlugin 接口,包括:
id、label、envVarsauth:认证方法数组catalog或discovery:模型目录resolveDynamicModel:动态模型解析wizard:可选的 Setup UI
8.6 创建 openclaw.plugin.json
配置 Manifest 元数据,包括 contracts、configSchema 等。
九、关键 SDK 导入
| |
十、设计权衡
10.1 auth 必填 vs 可选
auth 数组是必填的,但可以是空数组(用于无认证的本地 provider)。
| |
10.2 catalog vs discovery
| 类型 | 说明 | 适用场景 |
|---|---|---|
catalog | 动态目录,可能有网络 I/O | OpenAI、Anthropic 等需要 API 调用 |
staticCatalog | 离线静态目录 | Setup UI 显示 |
discovery | 运行时发现 | 本地/私有部署(Ollama) |
10.3 Wizard 的双重角色
wizard.setup:在 Provider 选择阶段显示wizard.modelPicker:在模型选择阶段显示
分离允许更细粒度的用户体验控制。
下一步
篇目 09 完成,继续:
| # | 文章 | 说明 |
|---|---|---|
| 10 | Extension 开发:Channel 篇 | 开发新消息渠道 |
| 11 | Extension 开发:Skill 篇 | 开发新 Skill |
| 12 | 测试策略:单元/集成/E2E | Vitest + E2E |
| 13 | 配置系统:Schema 与验证 | 配置管理 |
| 14 | 安全机制:Auth 与权限 | 认证授权 |
| 15 | 部署与运维:Docker 与容器化 | 生产部署 |
OpenClaw 源码剖析系列 · 2026 · skyseraph

