[开源] myclaw:2000 行 Go 平替 43 万行的 OpenClaw
TL;DR myclaw 是一个用 Go 编写的开源 AI Agent Gateway,核心功能包括多通道消息路由(Telegram + 飞书)、持久化记忆系统和定时任务调度。约 2000 行核心代码实现了 OpenClaw 的核心 Gateway 架构,编译出来就一个二进制文件,适合想要自托管 AI 助手但不想折腾 Node.js 或 Python 环境的开发者。
AI Agent Gateway 赛道的现状
2026 年初,AI Agent 领域最火的项目非 OpenClaw 莫属。这个前身为 Clawdbot 🦞(后改名 Moltbot,最终定名 OpenClaw)的项目,在 GitHub 上已经积累了超过 17 万 Star。它的核心理念很直接:给 LLM 一双"手",让 AI 能操作你的本地系统------执行命令、读写文件、控制浏览器。
OpenClaw 的架构确实强大:
- • Gateway + Pi Agent :Gateway 是 Node.js WebSocket 服务(默认绑
ws://127.0.0.1:18789),内嵌 Pi(Mario Zechner 写的开源 Coding Agent)通过 JSON-RPC over stdio 做推理和工具调用 - • 多模型支持:通过 Pi 的统一 LLM API 接 Anthropic、OpenAI、Google、Ollama 等多家 Provider
- • 支持 WhatsApp、Telegram、Discord、iMessage、Slack、Signal 等消息通道
- • 沙箱模式、设备配对审批、加密凭据存储
但它也有明显的代价:43 万行 TypeScript 代码,Node.js 运行时,以及相当复杂的依赖链。
对于只想自托管一个 AI 助手的个人开发者来说,这个体量太重了。myclaw 想做的事情很简单------用 Go 写一个够用的轻量替代。
myclaw 是什么
myclaw 是一个 Go 编写的自托管 AI Agent Gateway。设计目标三条:
-
- 轻量:核心代码约 2000 行,单二进制部署,无运行时依赖
-
- 实用:覆盖日常场景------Telegram 和飞书双通道、定时任务、记忆持久化
-
- 可扩展:模块化架构,Channel 接口抽象清晰,加新通道写一个 struct 就行
架构上借鉴了 OpenClaw 的 Gateway 模式,但实现上砍掉了所有我用不到的东西。
架构设计
myclaw 的整体架构可以用一句话概括:消息总线驱动的服务编排。
┌─────────────┐ ┌──────────┐ ┌──────────────┐
│ Telegram │────▶│ │────▶│ Claude / │
│ Channel │ │ Message │ │ OpenAI │
└─────────────┘ │ Bus │ │ Agent │
│ │ └──────┬───────┘
┌─────────────┐ │ │ │
│ Feishu │────▶│ │◀───────────┘
│ Channel │ └──────────┘
└─────────────┘ │
▼
┌─────────────┐ ┌──────────┐
│ Cron │ │ Memory │
│ Service │ │ System │
└─────────────┘ └──────────┘
│
┌─────────────┐
│ Heartbeat │
│ Service │
└─────────────┘
核心组件包括:
1. Message Bus(消息总线)
消息总线是 myclaw 的中枢。两种消息类型:
- • InboundMessage:从通道流入,携带 Channel、SenderID、ChatID、Content、Timestamp 等字段
- • OutboundMessage:从 Agent 流出,携带 Channel、ChatID、Content、ReplyTo 等字段
通过 Pub/Sub 模式(SubscribeOutbound / DispatchOutbound),各服务之间实现松耦合的事件路由。缓冲区默认 100 条消息,Goroutine 安全。
2. Gateway(网关编排器)
Gateway 是顶层编排器,负责:
- • 组装系统 Prompt(从
AGENTS.md+SOUL.md+ 记忆上下文拼接) - • 处理入站消息,调用 Agent 运行时(支持 Anthropic 和 OpenAI 两种 Provider)
- • 将 Agent 输出路由到对应的消息通道
- • 处理
SIGINT/SIGTERM优雅关闭
Provider 切换的逻辑很直接------配置里 provider.type 写 openai 就走 OpenAI,其他情况默认 Anthropic。不搞什么抽象工厂,一个 switch 解决。
3. Channel(消息通道)
Channel 接口定义了四个方法:Name()、Start()、Stop()、Send()。目前实现了两个通道:
Telegram 通道:
- • 基于
telegram-bot-api/v5长轮询 - • Markdown → Telegram HTML 格式转换
- • 消息分片(4096 字符限制)
- • 发送者白名单过滤
- • 代理配置支持(方便国内网络环境)
飞书通道:
- • Webhook 模式,启动一个 HTTP Server 监听
/feishu/webhook(默认端口 9876) - • Tenant Access Token 管理,带缓存和双重检查锁
- • URL Verification Challenge 自动应答
- • 事件驱动的消息接收(
im.message.receive_v1) - • 发送者白名单过滤(基于 open_id)
- • Verification Token 校验
飞书通道需要一个公网可达的 Webhook URL。本地开发可以用 Cloudflared 临时隧道,生产环境建议配 DNS。
4. Memory(记忆系统)
记忆系统分为两层:
- • 长期记忆 (
MEMORY.md):持久化的知识库 - • 每日日记 (
YYYY-MM-DD.md):按日期归档的交互记录
提供 ReadLongTerm()、WriteLongTerm()、ReadToday()、AppendToday() 和 GetRecentMemories(days) 方法。默认取最近 7 天的日记,和长期记忆一起组装进 LLM 的系统 Prompt。
文件就是 Markdown,想手动改也行。
5. Cron(定时任务)
支持三种调度模式:
- •
cron:标准 Cron 表达式(基于robfig/cron/v3) - •
every:固定间隔(毫秒级) - •
at:一次性定时执行
任务持久化为 JSON(存在 ~/.myclaw/data/cron/jobs.json),支持状态追踪(LastRunAtMs、LastStatus、LastError)和执行后自动删除。任务的执行结果可以通过 deliver 字段指定是否推送到某个消息通道。
6. Heartbeat(心跳服务)
定期读取 HEARTBEAT.md 文件内容,触发 Agent 处理。Agent 返回 HEARTBEAT_OK 表示无需进一步操作。默认间隔 30 分钟,适合做周期性自检或主动提醒。
为什么用 Go
选 Go 不是为了赶时髦,是几个实际的考量:
-
- 单二进制部署 :
go build产出一个可执行文件,不需要 Node.js 运行时或 Python 虚拟环境。scp到服务器直接跑
- 单二进制部署 :
-
- 并发原语:Goroutine + Channel 天然适合消息总线架构。每个通道、每个定时任务、Webhook Server 都是独立的 Goroutine,代码写起来比 async/await 回调链清爽
-
- 内存占用:Go 运行时的内存开销远低于 Node.js / Python,一个长期驻留的 Gateway 进程,这点差别会累积
-
- 交叉编译 :
GOOS=linux GOARCH=arm64 go build一行命令编译到任意平台
- 交叉编译 :
快速开始
安装
bash
go install github.com/stellarlinkco/myclaw/cmd/myclaw@latest
初始化
bash
myclaw onboard
这会在 ~/.myclaw/ 下创建配置文件和工作空间:
~/.myclaw/
├── config.json # 主配置
├── workspace/
│ ├── AGENTS.md # Agent 角色定义
│ ├── SOUL.md # 人格特质
│ ├── HEARTBEAT.md # 心跳任务提示词
│ └── memory/
│ └── MEMORY.md # 长期记忆
└── data/
└── cron/
└── jobs.json # 定时任务持久化
配置
编辑 ~/.myclaw/config.json:
json
{
"agent": {
"model": "claude-sonnet-4-5-20250929",
"maxTokens": 8192,
"temperature": 0.7,
"maxToolIterations": 20
},
"provider": {
"type": "anthropic",
"apiKey": "sk-ant-..."
},
"channels": {
"telegram": {
"enabled": true,
"token": "your-bot-token",
"allowFrom": ["123456789"],
"proxy": ""
},
"feishu": {
"enabled": true,
"appId": "cli_xxx",
"appSecret": "xxx",
"verificationToken": "xxx",
"port": 9876,
"allowFrom": ["ou_xxx"]
}
},
"gateway": {
"host": "0.0.0.0",
"port": 18790
}
}
想用 OpenAI 兼容的 API?把 provider.type 改成 "openai",填上对应的 Key 和 Base URL 就行。
也支持环境变量覆盖:
| 环境变量 | 用途 |
|---|---|
MYCLAW_API_KEY / ANTHROPIC_API_KEY |
Anthropic API Key |
OPENAI_API_KEY |
OpenAI API Key(自动切换 Provider) |
MYCLAW_BASE_URL / ANTHROPIC_BASE_URL |
API 地址(可接自定义 Endpoint) |
MYCLAW_TELEGRAM_TOKEN |
Telegram Bot Token |
MYCLAW_FEISHU_APP_ID |
飞书 App ID |
MYCLAW_FEISHU_APP_SECRET |
飞书 App Secret |
一个细节:如果只设了 OPENAI_API_KEY 而没有配 provider.type,myclaw 会自动把 Provider 切到 OpenAI。少一步配置。
运行
bash
# REPL 模式(命令行交互)
myclaw agent
# 单条消息模式
myclaw agent -m "今天的任务清单"
# 完整 Gateway 模式(启动所有服务)
myclaw gateway
# 查看状态
myclaw status
部署
Docker
myclaw 提供了多阶段 Dockerfile(golang:1.24-alpine 构建,alpine:3.21 运行),编译产物约 10MB。
bash
# 构建并启动
docker compose up -d --build
# 如果需要飞书 Webhook 的公网隧道
docker compose --profile tunnel up -d --build
Docker Compose 里包含一个可选的 Cloudflared 隧道服务,通过 --profile tunnel 激活。它会自动把飞书 Webhook 端口暴露到公网,省去自己配 Nginx 反向代理的麻烦。
本地开发也可以直接用 Make:
bash
make tunnel # 启动 cloudflared 临时隧道
拿到 *.trycloudflare.com 的 URL 后填到飞书开放平台的事件订阅里就行。
裸机部署
bash
# 交叉编译
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o myclaw ./cmd/myclaw
# 丢到服务器上
scp myclaw user@server:/usr/local/bin/
ssh user@server "myclaw onboard && myclaw gateway"
人格定制
myclaw 的一个有趣设计是通过 Markdown 文件定义 Agent 的"灵魂"。
AGENTS.md 定义角色和行为准则------你是谁、你能做什么、你的边界在哪里。SOUL.md 定义人格特质------语气、偏好、思维方式。这两个文件会被 Gateway 拼接到系统 Prompt 中。
这意味着你可以通过编辑两个 Markdown 文件来完全自定义 AI 助手的行为,不需要改任何代码。想要一个严肃的工作助手?改 SOUL.md。想要一个幽默的聊天伙伴?也是改 SOUL.md。
与 OpenClaw 的对比
| 维度 | OpenClaw | myclaw |
|---|---|---|
| 语言 | TypeScript | Go |
| 代码量 | ~430,000 行 | ~2,000 行 |
| 部署方式 | npm + Node.js | 单二进制 / Docker |
| 消息通道 | WhatsApp/Telegram/Slack/etc | Telegram + 飞书(可扩展) |
| 模型支持 | 多模型(Pi 统一 API) | Anthropic + OpenAI |
| 定时任务 | Cron + Skills 系统 | Cron/Interval/One-shot |
| 记忆系统 | Markdown + SQLite 混合搜索 | 长期 + 日记 |
| 适用场景 | 企业级全功能 | 个人/小团队自托管 |
myclaw 不试图替代 OpenClaw。如果你需要多平台消息通道、完整的沙箱安全模型、Pi Agent 的 Skills 扩展体系,OpenClaw 是更好的选择。myclaw 的定位是:你只需要一个能通过 Telegram 或飞书控制的、带记忆的、能跑定时任务的 AI 助手,并且希望它是一个 10MB 的二进制文件而不是一个 Node.js 项目。
测试
myclaw 的测试覆盖率在 82%-100% 之间,核心模块都有单元测试:
- •
bus_test.go:消息总线的发布/订阅 - •
channel_test.go:通道接口、Telegram 适配和飞书 Webhook 处理 - •
config_test.go:配置加载和环境变量覆盖 - •
cron_test.go:三种调度模式 - •
gateway_test.go:服务编排和优雅关闭(90.2% 覆盖) - •
heartbeat_test.go:心跳触发逻辑 - •
memory_test.go:记忆读写和上下文组装 - •
main_test.go:CLI 命令注册
使用依赖注入的 Factory 模式,测试时替换外部依赖。RuntimeFactory、BotFactory、FeishuClientFactory 这些接口让你不需要真实的 Telegram Bot 或 Anthropic API 也能跑完所有测试。
bash
make test # 跑全部测试
make test-race # 带竞态检测
make test-cover # 生成覆盖率报告
安全考量
AI Agent Gateway 的安全性不容忽视。OpenClaw 社区已经多次讨论过"投毒网页"导致的 Prompt 注入攻击问题。myclaw 采取了几个基本措施:
- • 发送者白名单 :Telegram 和飞书通道都支持
allowFrom配置,只有白名单中的用户才能触发 Agent - • 工具迭代上限 :
maxToolIterations限制单次对话中的工具调用次数,防止 Agent 失控循环 - • 工作空间隔离 :
tools.restrictToWorkspace默认开启,Agent 的文件操作限制在工作空间目录内 - • Webhook 验证:飞书通道支持 Verification Token 校验,防止伪造请求
对于生产环境,建议配合 Docker 容器运行以提供进程级隔离。
关键依赖
myclaw 的外部依赖保持精简,直接依赖只有 4 个:
- •
agentsdk-go(v0.8.0):Agent 运行时,底层包了 Anthropic SDK 和 OpenAI SDK,处理 ReAct 循环和工具调用 - •
telegram-bot-api/v5:Telegram Bot API 客户端 - •
robfig/cron/v3:Cron 表达式解析和调度 - •
spf13/cobra:CLI 框架
间接依赖包括 anthropic-sdk-go、openai-go、go-sdk(MCP)和 OpenTelemetry 相关的 Tracing 库。go.sum 里条目不少,但运行时真正加载的东西不多。
我的看法
myclaw 证明了一件事:构建一个实用的 AI Agent Gateway 不需要 43 万行代码。2000 行 Go,两个消息通道,一套记忆系统,一个 Cron 调度器------日常够用了。
当然它也有明显的不足。没有 Web UI,没有多用户会话隔离,飞书通道目前只支持纯文本消息。如果你的场景需要这些,OpenClaw 或者自己加功能。
Go 的单二进制部署和低内存占用让它特别适合丢在一台小 VPS 上长期跑着。如果你认同"能用 2000 行解决的问题不要用 43 万行"这个理念,可以试试。
参考
- • OpenClaw GitHub - 前身 Clawdbot,17 万+ Star 的 AI Agent 平台
- • Anthropic MCP - Model Context Protocol 规范
- • agentsdk-go - Claude Agent SDK 的 Go 实现
- • myclaw - 项目仓库