前阵子,本地优先(Local-first)的开源自主 AI Agent OpenClaw 在圈子里爆火,我自然也忍不住一探究竟。但深入折腾后发现,原版虽然功能强大,可代码属实有些臃肿,甚至还存在明文存密钥、容易被提示词注入等高危风险。
为了少走弯路,我花了不少时间把 OpenClaw 及其衍生变体,外加同赛道的 AstrBot 摸了个透。今天就给大家整理一份保姆级的对比和避坑指南,希望能帮到同样想入门 AI Agent 开发的朋友们。
一、核心运行环境:我的折腾平台
对于跑这类 AI Agent,环境的选择丰俭由人。对我来说,目前的部署方案主要分为两套:
一套是跑在我的京东云服务器上。这台机器平时用来挂载我的博客,现在我也在这上面跑像 AstrBot 这样需要全天候在线、接入多渠道社交平台的云端助理。服务器的环境配置很简单,装好 Docker 和 Python 3.10+ 基本就能通吃。
另一套则是本地环境。如果用到像原版 OpenClaw 或 IronClaw 这种需要深度控制本地浏览器和文件系统的 Agent,我强烈建议放在本地的虚拟机里跑,或者通过 Tailscale 组建的虚拟局域网进行隔离,千万别直接在存有重要资料的主力机上裸奔。
二、核心软件:OpenClaw 家族与 AstrBot 怎么选?
为了让大家直观了解发展状态,我把目前最主流的变体和平替做了一个梳理:
追求大而全:OpenClaw 原版
基于 TypeScript 构建,生态极其丰富。如果你想快速拥有一个能深度接管本地浏览器、处理邮件的助理,选它没错。但记得,安全隔离要做好。
OpenClaw GitHub 地址
代码洁癖与定制开发首选:Nanobot (强烈推荐)
这个版本简直长在我的审美上。它把原版极度臃肿的代码用 Python 重新实现了,精简到了约 4000 行!剔除了复杂的插件市场,只保留最核心的 Agentic Loop(智能体循环)和图谱记忆。内存占用才几十兆。对于想从头剖析 Agent 底层机制、有 Python 基础的朋友来说,这是最好的实战切入点。
Nanobot GitHub 地址
多平台社交枢纽平替:AstrBot (强烈推荐)
严格来说它不是 OpenClaw 的变体,而是一个同赛道的神器。它放弃了本地系统控制,主攻全渠道接入(QQ、微信、Telegram、飞书等)。自带开箱即用的 WebUI 面板,部署极其丝滑。非常适合用来做社群运营助理或跨平台数字分身。
AstrBot GitHub 地址
其他极客变体:
* IronClaw (Rust):主打企业级安全,WASM 沙盒隔离,适合处理敏感数据。
* PicoClaw (Go):单一文件即开即用,零依赖。
* ZeroClaw (Rust):体积 3.4MB,专为树莓派等受限设备打造。
* TrustClaw:完全托管的云原生沙盒版本,免运维。
三、关键配置/插件:防患于未然
在折腾这些 Agent 时,有几个关键配置一定要注意:
1. API Key 环境变量隔离:
千万不要把 DeepSeek 或 OpenAI 的 API Key 直接硬编码在代码里!在部署 Nanobot 或 AstrBot 时,务必使用 .env 文件来管理敏感信息,并将其加入 .gitignore。
2. AstrBot 必备插件:
如果你选了 AstrBot,推荐安装 astrbot-plugin-websearch(联网搜索)和 astrbot-plugin-summary(群聊总结)。这俩能极大地扩展机器人的实用性,让它从一个“聊天机器”变成真正的“助理”。

四、深度定制:写一个专属的 AstrBot 插件
既然咱平时写了不少 Python 工具脚本,不如直接将其转化为 AstrBot 的能力。AstrBot 的插件系统非常松耦合,下面我演示一个极其简单的“获取每日毒鸡汤”插件的基础代码结构。这能让你快速了解它是如何进行 Function Calling 的。
首先,在插件目录下创建一个 main.py,代码如下:
import aiohttp
from astrbot.api.event import filter, AstrMessageEvent
from astrbot.api.star import Context, Star, register
@register("toxic_soup", "绿洲日志", "1.0.0", "获取每日毒鸡汤的简单插件")
class ToxicSoupPlugin(Star):
def __init__(self, context: Context):
super().__init__(context)
# 拦截特定的指令
@filter.command("毒鸡汤")
async def get_soup(self, event: AstrMessageEvent):
<!-- 这里通过 API 获取数据 -->
url = "https://api.oick.cn/dutang/api.php"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
text = await response.text()
# 将结果返回给发送指令的用户
yield event.plain_result(f"喝汤了:\n{text}")
else:
yield event.plain_result("今天没有鸡汤,只有 Bug。")
上面的代码展示了最基础的指令注册和异步网络请求。你可以把平时写的自动化运维脚本、数据抓取脚本,稍微包装一下接入进来,你的 Agent 就会越来越懂你的业务流。
参考链接
在折腾过程中,除了官方文档,也参考了不少大佬的踩坑记录,在这里一并致谢:
好啦,今天的分享就到这里。后面我会在博客和视频里继续更新 AI Agent 相关的硬核实战教程,敬请期待!