[开源] myclaw:2000 行 Go 平替 43 万行的 OpenClaw

[开源] 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。设计目标三条:

    1. 轻量:核心代码约 2000 行,单二进制部署,无运行时依赖
    1. 实用:覆盖日常场景------Telegram 和飞书双通道、定时任务、记忆持久化
    1. 可扩展:模块化架构,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.typeopenai 就走 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),支持状态追踪(LastRunAtMsLastStatusLastError)和执行后自动删除。任务的执行结果可以通过 deliver 字段指定是否推送到某个消息通道。

6. Heartbeat(心跳服务)

定期读取 HEARTBEAT.md 文件内容,触发 Agent 处理。Agent 返回 HEARTBEAT_OK 表示无需进一步操作。默认间隔 30 分钟,适合做周期性自检或主动提醒。

为什么用 Go

选 Go 不是为了赶时髦,是几个实际的考量:

    1. 单二进制部署go build 产出一个可执行文件,不需要 Node.js 运行时或 Python 虚拟环境。scp 到服务器直接跑
    1. 并发原语:Goroutine + Channel 天然适合消息总线架构。每个通道、每个定时任务、Webhook Server 都是独立的 Goroutine,代码写起来比 async/await 回调链清爽
    1. 内存占用:Go 运行时的内存开销远低于 Node.js / Python,一个长期驻留的 Gateway 进程,这点差别会累积
    1. 交叉编译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 模式,测试时替换外部依赖。RuntimeFactoryBotFactoryFeishuClientFactory 这些接口让你不需要真实的 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-goopenai-gogo-sdk(MCP)和 OpenTelemetry 相关的 Tracing 库。go.sum 里条目不少,但运行时真正加载的东西不多。

我的看法

myclaw 证明了一件事:构建一个实用的 AI Agent Gateway 不需要 43 万行代码。2000 行 Go,两个消息通道,一套记忆系统,一个 Cron 调度器------日常够用了。

当然它也有明显的不足。没有 Web UI,没有多用户会话隔离,飞书通道目前只支持纯文本消息。如果你的场景需要这些,OpenClaw 或者自己加功能。

Go 的单二进制部署和低内存占用让它特别适合丢在一台小 VPS 上长期跑着。如果你认同"能用 2000 行解决的问题不要用 43 万行"这个理念,可以试试。

参考

相关推荐
孞㐑¥13 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Libraeking14 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
方见华Richard15 小时前
世毫九量子原住民教育理念全书
人工智能·经验分享·交互·原型模式·空间计算
三水不滴18 小时前
计网ping原理
经验分享·笔记·计算机网络
架构师沉默20 小时前
这个问题,决定你能不能进大厂!
经验分享
软件检测小牛玛20 小时前
软件功能测试机构推荐:资质权威,报告认可的软件测评机构 中承信安
经验分享·软件功能测试·第三方软件检测·软件测评机构·软件功能测试报告
方见华Richard21 小时前
方见华个人履历|中英双语版
人工智能·经验分享·交互·原型模式·空间计算
acrelwwj21 小时前
智慧照明新引擎,ASL600 4GWJ开启城市照明精细化管理新时代
大数据·经验分享·物联网
智者知已应修善业1 天前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法