V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xunyu9527
V2EX  ›  程序员

myclaw: 2000 行 Go 平替 43 万行的 OpenClaw

  •  
  •   xunyu9527 · 9 小时 50 分钟前 · 501 次点击
    转载:公众号[星纬智联技术],推荐中转站: https://nicecode.cc/
    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 行,单二进制部署,无运行时依赖
    2. 实用:覆盖日常场景——Telegram 和飞书双通道、定时任务、记忆持久化
    3. 可扩展:模块化架构,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 不是为了赶时髦,是几个实际的考量:
    1. 单二进制部署:go build 产出一个可执行文件,不需要 Node.js 运行时或 Python 虚拟环境。scp 到服务器直接跑
    2. 并发原语:Goroutine + Channel 天然适合消息总线架构。每个通道、每个定时任务、Webhook Server 都是独立的 Goroutine ,代码写起来比 async/await 回调链清爽
    3. 内存占用:Go 运行时的内存开销远低于 Node.js / Python ,一个长期驻留的 Gateway 进程,这点差别会累积
    4. 交叉编译:GOOS=linux GOARCH=arm64 go build 一行命令编译到任意平台
    快速开始:
    安装
    go install github.com/stellarlinkco/myclaw/cmd/myclaw@latest
    初始化
    myclaw onboard
    这会在 ~/.myclaw/ 下创建配置文件和工作空间:
    ~/.myclaw/
    ├── config.json          # 主配置
    ├── workspace/
    │   ├── AGENTS.md        # Agent 角色定义
    │   ├── SOUL.md          # 人格特质
    │   ├── HEARTBEAT.md     # 心跳任务提示词
    │   └── memory/
    │       └── MEMORY.md    # 长期记忆
    └── data/
        └── cron/
            └── jobs.json    # 定时任务持久化
    配置
    编辑 ~/.myclaw/config.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 。少一步配置。
    运行
    # REPL 模式(命令行交互)
    myclaw agent

    # 单条消息模式
    myclaw agent -m "今天的任务清单"

    # 完整 Gateway 模式(启动所有服务)
    myclaw gateway

    # 查看状态
    myclaw status
    部署
    Docker
    myclaw 提供了多阶段 Dockerfile ( golang:1.24-alpine 构建,alpine:3.21 运行),编译产物约 10MB
    # 构建并启动
    docker compose up -d --build

    # 如果需要飞书 Webhook 的公网隧道
    docker compose --profile tunnel up -d --build
    Docker Compose 里包含一个可选的 Cloudflared 隧道服务,通过 --profile tunnel 激活。它会自动把飞书 Webhook 端口暴露到公网,省去自己配 Nginx 反向代理的麻烦。
    本地开发也可以直接用 Make:
    make tunnel  # 启动 cloudflared 临时隧道
    拿到 *.trycloudflare.com 的 URL 后填到飞书开放平台的事件订阅里就行。
    裸机部署
    # 交叉编译
    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 证明了一件事:构建一个实用的 AI Agent Gateway 不需要 43 万行代码。2000 行 Go ,两个消息通道,一套记忆系统,一个 Cron 调度器——日常够用了。当然它也有明显的不足。没有 Web UI ,没有多用户会话隔离,飞书通道目前只支持纯文本消息。如果你的场景需要这些,OpenClaw 或者自己加功能。Go 的单二进制部署和低内存占用让它特别适合丢在一台小 VPS 上长期跑着。如果你认同"能用 2000 行解决的问题不要用 43 万行"这个理念,可以试试。
    转载:公众号[星纬智联技术],推荐中转站: https://nicecode.cc/
    1 条回复    2026-02-09 21:14:01 +08:00
    mit66
        1
    mit66  
       9 小时 31 分钟前 via Android
    意义不大,openclaw 基本上 2-3 天升级一个版本,功能不断增加,这种维护能力可以卷死所有同赛道的其他软件!
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    ♥ Do have faith in what you're doing.