OpenClaw源码级解析:3大核心模块实现跨平台AI Agent快速搭建

OpenClaw源码级拆解:3个核心模块,5分钟搭出跨平台AI Agent
卡点在哪
用AutoGen写一个“查天气+发微信通知”的Agent,光是配LLM、定义角色、处理消息循环、适配不同系统命令,就容易卡在TypeError: 'NoneType' object is not callable。换台Mac或Linux机器,脚本直接崩——路径分隔符、shell调用方式、权限模型全得重改。
它怎么解
OpenClaw(yitb.com/openclaw)不堆封装。它把AI Agent最常卡住的三件事,拆成三个可读、可改、可替换的模块:
- 消息路由层:不用
if/elif硬编码,靠规则引擎自动分发消息 - 插件系统:像插USB设备一样加功能(天气、微信、截图、Shell执行)
- OS抽象层:同一段代码,在Windows/Mac/Linux上自动调用对应API
它不追求全能,但保证:你写的第一个Agent,就能跨平台跑起来。
从零启动一个“自动截图+OCR+存为Markdown”的Agent
1. 安装并跑通最小实例
pip install openclaw
openclaw init my-agent
cd my-agent
openclaw run✅ 关键在这:openclaw init生成的agent.py里,已经预置了OS抽象层初始化代码:
from openclaw.os import OS
os_layer = OS() # 自动检测当前系统,返回 WindowsOS / DarwinOS / LinuxOS 实例不用手写platform.system(),也不用操心os.path.join()在Windows下拼错路径。
2. 添加截图+OCR插件(3行代码)
编辑 plugins/__init__.py,加入:
from openclaw.plugins.screenshot import ScreenshotPlugin
from openclaw.plugins.ocr import OCRPlugin
# 注册插件(自动注入到所有Agent上下文)
register_plugin(ScreenshotPlugin())
register_plugin(OCRPlugin())✅ 安全点在这:每个插件都继承BasePlugin,必须实现is_compatible()方法——OCR插件在没装Tesseract的机器上会静默禁用,不抛错。
3. 定义消息路由规则(非硬编码)
修改 routes.yaml:
- when: "用户说'截当前屏幕'"
then:
- plugin: screenshot
- plugin: ocr
- action: save_as_markdown✅ 比AutoGen灵活在哪?OpenClaw的路由引擎基于ruamel.yaml解析+正则匹配,不依赖LLM输出格式。哪怕LLM返回“帮我截个图!”,也能被.*截.*屏.*规则捕获。
4. 写业务逻辑(跨平台安全)
在 actions/save_as_markdown.py 中:
from openclaw.os import OS
import time
def save_as_markdown(image_path: str, text: str):
# OS层自动处理路径和文件操作
safe_path = OS().join("outputs", f"note_{int(time.time())}.md")
with OS().open(safe_path, "w") as f:
f.write(f"# 截图OCR结果\n\n\n{text}")
return f"已保存至 {safe_path}"✅ 关键点:OS().open() 在Windows下用codecs.open()防乱码,在Mac/Linux下用io.open()保Unicode,你完全无感。
真机验证效果
运行后对Agent说:“截当前屏幕” → 瞬间生成outputs/note_171xxxx.md,内容含截图链接和识别文字。
在同事的Mac上git clone项目,pip install -e .后直接openclaw run——无需改一行代码,照样工作。
对比AutoGen:同样需求需手动写3个ConversableAgent、自定义register_function、为每个OS重写subprocess.run()调用方式。
👉 Binance · OKX · Gate.io · HTX · Bitget
常见问题
Q:插件怎么自己写?比如加个“发钉钉通知”?
A:新建plugins/dingtalk.py,继承BasePlugin,实现execute()方法。调用self.config.get("webhook_url")读配置,用requests.post()发消息。注册后,routes.yaml里就能写plugin: dingtalk。
Q:路由规则能支持LLM动态生成吗?
A:可以。OpenClaw预留LLMRouter类,把routes.yaml换成routes.py,用@llm_route("分析日志错误")装饰函数即可,不影响现有规则。
Q:OS抽象层能覆盖哪些差异?
A:已覆盖:路径拼接、文件编码、剪贴板读写(OS().clipboard_get())、后台进程启动(OS().spawn_background())、甚至Windows的PowerShell vs Mac的zsh默认shell切换。
下一步
你现在已掌握OpenClaw的“心脏结构”。下一步建议:
代码永远比文档诚实。打开你的终端,输入openclaw init demo && cd demo——这次,Agent该听你的了。