一、开场:一个让客户付费”求我改代码”的夜晚
朋友们,我是老金。
今天这篇,是 OpenClaw 系列的进阶教程——二次开发。
讲一个真实的故事。
去年年底,一个做跨境电商的朋友找到我,说他的客户 Servicing 系统要疯了。
他的需求很简单:客户下单后,自动给客户发一封”感谢信”,信的内容要根据客户购买的商品类型个性化。
比如买宠物粮的,信里加一句”祝您的毛孩子健康成长”;买电子产品的,加一句”希望新设备能帮到您”。
他看 OpenClaw 有 Skills,自己搞了3天,搞不定。
最后找到我,说:”金哥,你帮我写个 Skill,钱好说!”
我看了他的需求,笑了:
“你根本不需要写新 Skill,用 OpenClaw 的模板引擎 + 条件分支,10分钟搞定。”
结果,我花了15分钟,给他搭了一个“动态内容生成 Skill”。
他看完源码,震惊了:
“原来 OpenClaw 还能这样玩?”
是的,OpenClaw 不只是”用别人的 Skill”,它支持深度的二次开发。
今天这篇文章,我就把 OpenClaw 二次开发的全部实战经验,从源码构建到自定义 Skill,从 API 扩展到插件机制,给你讲透。
看完这篇,你将掌握:
- 如何从源码构建 OpenClaw(而不是只使用 Docker 镜像)
- 自定义 Skill 开发:从 0 到 1 创建可复用的功能插件
- 内核 API 扩展:如何修改和扩展 OpenClaw 的核心能力
- 插件机制最佳实践:代码结构、配置模式、测试策略
- 实战案例:上面那个”动态感谢信”Skill 的完整源码
如果你是开发者,想在 OpenClaw 上定制自己的功能,这篇就是你的”开发手册”。
二、OpenClaw 源码结构解读:你需要知道的一切
在二次开发之前,先搞懂 OpenClaw 的代码长什么样。
2.1 目录结构
openclaw/
├── cmd/ # 命令行入口
│ └── openclaw/ # 主程序
├── internal/ # 内部模块(不对外暴露)
│ ├── agent/ # Agent 运行时
│ ├── core/ # 核心抽象(Task、Skill、Context)
│ ├── llm/ # LLM 客户端封装
│ ├── memory/ # 记忆存储(Redis、SQLite、向量库)
│ ├── skill/ # Skill 加载与执行引擎
│ └── web/ # API 和 Web 界面
├── pkg/ # 公共库(可独立使用)
│ ├── config/ # 配置解析
│ ├── logger/ # 日志
│ ├── util/ # 工具函数
│ └── models/ # 数据结构定义
├── skills/ # 内置 Skills
│ ├── web_search/
│ ├── email/
│ ├── spreadsheet/
│ └── ...
├── configs/ # 配置文件
│ ├── config.yaml
│ └── skills/
├── scripts/ # 辅助脚本
├── tests/ # 测试代码
├── docs/ # 文档
├── Dockerfile
├── Makefile
├── go.mod
└── README.md
2.2 核心模块说明
| 模块 | 职责 | 扩展点 |
|---|---|---|
| cmd/openclaw | 程序入口,初始化配置和服务 | 修改启动参数、添加子命令 |
| internal/agent | Agent 生命周期管理、执行循环 | 自定义 Agent 类型 |
| internal/core | Task 编排、Skill 调度、上下文传递 | 核心抽象,一般不修改 |
| internal/skill | Skill 加载、注册、执行、沙箱 | 新增 Skill 实现 |
| pkg/models | Request/Response 数据结构 | 新增消息类型或字段 |
| skills/ | 内置 Skill 实现 | 参考实现,复制修改 |
三、源码构建:从零编译你的 OpenClaw
别只会用 Docker,学会自己构建。
3.1 环境准备
OpenClaw 使用 Go 语言开发(Go 1.21+)。
# 1. 安装 Go
# Ubuntu/Debian
sudo apt update && sudo apt install -y golang
验证安装
go version # 应输出 go version go1.21+
2. 克隆仓库
git clone https://github.com/openclaw/openclaw.git
cd openclaw
3. 下载依赖
go mod download
3.2 编译与运行
# 编译
make build # 输出: bin/openclaw
运行(开发模式,热重载)
./bin/openclaw serve --dev
或者直接运行
go run cmd/openclaw/main.go serve
3.3 自定义构建标签
OpenClaw 支持build tags来编译特定功能:
# 编译无 UI 的纯后端版本(节省资源)
go build -tags "cli" -o openclaw-cli cmd/openclaw/main.go
编译带调试信息的版本
go build -gcflags="all=-N -l" -o openclaw-debug cmd/openclaw/main.go
3.4 常见编译问题
- go: module requires Go 1.21:升级 Go 版本
- cannot find module:检查
GOPROXY设置export GOPROXY=https://goproxy.cn,direct - 端口占用:修改
config.yaml中的server.port
四、自定义 Skill 开发:从 0 到 1 的完整流程
这是二次开发的核心。
4.1 Skill 解剖
一个 Skill 就是实现了Skill接口的结构体:
type Skill interface {
// Metadata 返回 Skill 元信息
Metadata() SkillMetadata
// Execute 执行 Skill 逻辑
Execute(ctx context.Context, input SkillInput) (SkillOutput, error)
// Validate 验证输入参数
Validate(input SkillInput) error
}
type SkillMetadata struct {
Name string
Description string
Version string
Author string
Parameters []Parameter
}