最近AI圈子里突然流行起一句话:"你领养龙虾了吗?"乍一看以为是宠物博主在整活,点进技术群才发现,大家说的是开源的AI Agent框架OpenClaw。这个名字本身就带梗——Claw和龙虾钳子脱不开关系,社区索性把"部署OpenClaw"叫成"领养龙虾",叫着叫着就成了黑话。
实话实说,OpenClaw这类框架解决的是一个很实际的痛点:你有一个大模型API(比如通义千问),但你和它的交互只停留在网页对话框里,没法让它在飞书、Teams、Discord这些日常办公平台上随时待命。OpenClaw就是中间那层"接线员",把大模型接到IM机器人上,让AI能主动接收消息、执行任务、返回结果。这篇教程会覆盖Windows、Linux、macOS三大平台,从零开始把"龙虾"领养回家,后面还会把我实际踩过的坑完整复盘一遍,包括那个很多人见过的agent failed before reply: session file locked (timeout 60000ms)报错。
适合谁看?如果你已经接触过AI API但没跑过Agent框架,或者你在飞书/Teams里需要一个能干活的机器人,这篇文章可以直接照着抄。
1. 部署之前,这些底层逻辑必须想清楚
1.1 OpenClaw到底是干什么的
别被"Agent框架"这种词唬住。OpenClaw的作用就是三件事:接消息、调模型、回消息。
你用飞书机器人给它发一句话,它把这句话转给配置好的大模型,拿到模型回复之后再通过飞书发回来。整个过程里,OpenClaw本身不产生智能,它更像一个"消息路由器 + 记忆容器"。你可以把大模型理解成大脑,把OpenClaw理解成躯干和神经系统——大脑负责思考,躯干负责把外界的刺激传进来、把思考的结果送出去。
这个定位决定了它的部署思路和普通Web服务不太一样。你不需要关心它的"业务逻辑"——那些都在模型那边;你真正需要关心的只有三块:运行环境够不够稳、模型接口配得对不对、消息平台接入通不通。后面所有踩坑,基本都绕不开这三块。
1.2 "三大平台"和"龙虾领养"怎么理解
"三大平台"指的是Windows、Linux、macOS三套操作系统。OpenClaw本身是跨平台的Python项目,理论上只要有Python环境就能跑,但三套系统在依赖安装、权限管理、开机自启方面差别很大,所以保姆级教程必须分开讲。
"龙虾领养"这个说法,本质是圈内对"自托管部署"的戏称。别人家的AI是云端服务,你用的是别人养的"猫";自己部署OpenClaw,等于把一只"龙虾"领回自己家养。既然是"领养",你就得负责它的吃喝拉撒——定时清理日志、处理会话锁冲突、留意磁盘占用,这些后面都会讲到。
1.3 模型选型:为什么很多人首选通义千问
OpenClaw不绑定任何模型,你可以接OpenAI、Claude、本地Ollama,也可以接国内的通义千问。从社区讨论热度和实际体验来看,千问是目前性价比最稳的选择,原因有三:
一是国内访问延迟低,不需要折腾网络配置;二是千问的API兼容OpenAI格式,OpenClaw里配起来几乎零成本;三是开源版本的Qwen系列配合Ollama也能跑本地部署,方便你处理敏感数据。
如果你手头已经有别的API Key,完全可以先用着,OpenClaw的核心能力不受影响。新手我建议先拿千问练手,原因很简单:文档多、报错好查、出了问题有人跟你踩同一个坑。
| 模型方案 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 通义千问API | 延迟低,兼容性好,文档多 | 按量付费 | 大多数日常使用 |
| OpenAI API | 生态成熟,综合能力强 | 国内访问不便 | 有现成Key的开发者 |
| 本地Ollama模型 | 完全免费,数据不出机器 | 吃硬件,效果参差 | 隐私敏感、离线场景 |
1.4 硬件底线和运行环境
OpenClaw本身是个Python应用,非常轻量,不吃显卡。真正吃资源的是你选用的模型:如果走云API,一台2核4G的小主机就绰绰有余;如果跑本地模型,那就要看模型参数规模了。
我建议的最低配置:2核CPU、4G内存、20G可用磁盘,操作系统方面Windows 10/Server 2016以上、Ubuntu 18.04以上、macOS 11以上均可。需要注意磁盘,OpenClaw会持续写会话记录和日志,跑久了磁盘会被悄悄占满,这个坑后面单开一节。
环境方面,你需要准备Python 3.9以上版本,以及Git(拉取代码用)。Windows用户如果不想手动装Python,也可以用它自带的安装脚本或者社区打包的Windows Hub工具,一键把环境带起来。
2. 三大平台安装步骤,从零到能跑
2.1 Windows:看似简单,坑全在细节里
Windows下安装OpenClaw,官方推荐的方式是拉取仓库代码后用Python虚拟环境运行。命令行操作如下:
git clone https://github.com/example/openclaw.git cd openclaw python -m venv venv venv\Scripts\activate pip install -r requirements.txt如果你用的是Windows Hub工具,流程会更简单——下载Hub安装器,勾选Python组件,它会帮你把环境、依赖、配置文件一次性生成好。我自己实际测试下来,手动安装比Hub更可控,因为Hub在部分精简版系统上会因为缺失Visual C++运行库而静默失败。
Windows最容易踩的三个坑:
第一是PowerShell执行策略。如果你在终端运行激活脚本时提示"禁止运行脚本",需要以管理员身份执行:
Set-ExecutionPolicy RemoteSigned第二是中文路径。千万别把项目放在C:\Users\张三\这种路径下,Python环境在中文路径下偶尔会出奇怪的编码错误,尤其是涉及session文件读写的时候。放在C:\openclaw这种纯英文路径最省心。
第三是杀毒软件拦截。OpenClaw运行时会在本地起Web服务、监听端口,部分杀毒软件会误判。建议添加目录白名单,否则Agent会莫名奇妙地"启动失败但没有任何报错"。
成功启动的标志是终端出现一行类似Agent is running and listening...的日志,这时候说明"龙虾"已经在本地爬动了。
2.2 Linux:推荐Debian系,一条龙服务
Linux部署最稳的路线是Ubuntu/Debian系。我的推荐步骤:
# 安装基础依赖 sudo apt update sudo apt install -y git python3 python3-venv python3-pip # 拉取项目 git clone https://github.com/example/openclaw.git /opt/openclaw cd /opt/openclaw # 创建虚拟环境 python3 -m venv venv source venv/bin/activate pip install -r requirements.txtLinux下最常见的坑是内存不足导致编译中断。某些依赖包在安装时需要用pip从源码编译,如果内存不够,编译进程会直接被系统OOM杀掉。解决办法是启用swap:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile配好之后建议用systemd把它注册成系统服务,这样不用挂着一个终端不放:
[Unit] Description=OpenClaw Agent After=network.target [Service] Type=simple User=claw WorkingDirectory=/opt/openclaw ExecStart=/opt/openclaw/venv/bin/python main.py Restart=always RestartSec=5 EnvironmentFile=/opt/openclaw/.env [Install] WantedBy=multi-user.target注意EnvironmentFile这一行,很多人漏了它,导致环境变量里写的API Key在系统服务模式下完全不生效。这个后面会展开讲。
2.3 macOS:Homebrew装完,记得处理Gatekeeper
macOS和Linux同源,安装过程类似,只是依赖管理建议用Homebrew:
brew install git python@3.11 git clone https://github.com/example/openclaw.git ~/openclaw cd ~/openclaw python3 -m venv venv source venv/bin/activate pip install -r requirements.txtmacOS上最容易踩的坑是Gatekeeper拦截未签名二进制。OpenClaw某些依赖包附带的可执行文件如果没签名,第一次运行会被macOS拦截,弹窗提示"无法打开,因为无法验证开发者"。你不一定看得到弹窗,因为Agent作为后台进程运行时,弹窗可能被忽略,表现就是功能异常。
解决办法两种:一是到"系统设置 → 隐私与安全性"里允许该软件运行;二是对特定二进制文件执行:
xattr -dr com.apple.quarantine ~/openclaw/venv/bin/另外,macOS用zsh,环境变量要写进~/.zshrc而不是~/.bash_profile,否则终端重启后环境变量又丢了。
3. Channels接入:让Agent进入飞书、Teams、Discord
3.1 channel机制与选择逻辑
OpenClaw把不同类型的消息来源抽象成channel。每个channel对应一个IM平台的接入方式,你可以在配置文件里启用一个或多个。很多新手的第一个困惑是"agent怎么选择channel"——其实不是agent选channel,而是你在配置里声明了哪些channel,agent就监听哪些。
配置文件里大概是这样:
channels: feishu: enabled: true type: webhook webhook_url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" teams: enabled: true type: teams_bot app_id: "xxx" app_secret: "xxx" discord: enabled: false新手入门,强烈建议一次只开一个channel。我见过太多人一上来把三个平台全开了,结果连报错都分不清是哪个平台的,飞书那边报超时、Teams那边报token无效,手忙脚乱。先把一个平台跑通,再加第二个,这是最稳的节奏。
3.2 飞书接入与输出截断的根治
飞书是OpenClaw用户最常用的channel,社区里"在飞书输出容易被截断"的讨论也最多。这事的根因是飞书自定义机器人的消息长度限制——单条消息不能超过一定字符数,而大模型回答问题时根本不会考虑飞书的限制,一次性吐几千字很正常。
我踩过的坑是:机器人发消息发一半就断了,不报错,只是静默截断。排查了半天才意识到是长度问题。
解决办法有三个层次:
第一,在配置里限制模型输出长度。把max_tokens值设小一点,比如800,让模型别一次说太多话。这能减少截断概率,但很笨,因为有些场景确实需要长回答。
第二,开启OpenClaw的分片发送。有些版本支持将长消息拆成多段发送,等于是自动把长文案切成消息1、消息2、消息3。缺点是有延迟,消息一段段蹦出来,体验一般。
第三,配置摘要模式。让OpenClaw先把模型的长回复做一轮压缩,再发送摘要版到飞书。这适合你只是想快速知道AI干了什么,不需要看完整分析过程的场景。
我的实践经验是:日常问答用摘要模式,代码生成和长文写作直接切到本地命令行模式,绕开飞书限制。
3.3 Teams接入的权限细节
Teams比飞书麻烦不少。用Microsoft Teams Bot,你需要先在Azure门户注册一个Bot应用,拿到app_id和app_secret,然后配置到channel里。这个流程本身不复杂,真正的坑在Teams的权限策略。
很多人的Bot应用都建好了,消息收发也配了,就是收不到消息。排查到最后发现是Azure上忘了配置"Client credentials"流,或者Bot和Teams应用之间没关联。简单说,光有Bot应用不顶用,你还要在Teams管理后台把应用发布到自己的组织里,才能让它出现在联系人中。
3.4 Discord接入的最小权限原则
Discord相对最简单,建一个Bot应用、复制Token填到配置里就能用。但有个细节非常容易忽视:Discord Bot的权限需要勾选Message Content Intent,否则Bot无法读取频道里的消息,表现为"在线但无视你"。
进入Discord开发者后台 → 你的应用 → Bot页面,把MESSAGE CONTENT INTENT开关打开。这个开关在2022年以后成了默认关闭项,新手踩的特别多。
权限点不要全勾,只勾Send Messages、Read Message History、Send Messages in Threads就够日常使用了。权限太大等于给恶意消息开了后门,Agent意外执行某些危险的系统命令时就麻烦了。
4. 必坑指南:我实际踩过的五个故障复盘
4.1 session file locked:锁文件到底被谁锁了
这个报错在社区里出现频率极高,完整报错是agent failed before reply: session file locked (timeout 60000ms)。字面意思:OpenClaw在回复之前,发现会话文件被锁住了,等了60秒还没拿到锁,于是放弃。
我第一次遇到时,第一反应是检查磁盘是不是满了、文件权限是不是有问题,结果都不是。最后定位出来的根因是同时运行了两个OpenClaw实例——我原本只是想让Agent同时服务飞书和Discord,就开了一个进程跑飞书channel,又开了一个进程跑Discord channel,两个进程操作同一个session目录,后启动的进程就永远拿不到锁。
排查方法如下:
# 查看是不是有多个claw进程 ps aux | grep openclaw # 查看锁文件的持有者 ls -la /path/to/openclaw/sessions/*.lock lsof /path/to/openclaw/sessions/*.lock如果你的场景确实需要多个channel,解决方案是在配置里同时启用多个channel,而不是启动多个进程。OpenClaw设计上就是单进程多channel,你只需要在配置文件里把它们都打开,一个进程就能处理全部平台的消息。
还有一种容易忽略的情况:session目录在NFS挂载或网络盘上。锁文件的机制在某些网络文件系统上不可靠,导致锁永远无法释放。解决办法是把session_path改到本地磁盘。
4.2 channel配置错误导致Agent"装死"
"装死"的表现是:OpenClaw启动了、日志也显示Agent is running,但你给机器人发消息它就是不回,也没有任何报错。这个最气人——没有崩溃,没有异常,就是不理你。
我遇到过三次,三次原因各不相同:
第一次是飞书webhook地址复制的时候漏了后面几个字符,地址无效,但OpenClaw启动时不会去校验webhook,直到发消息才发现发不出去。第二次是channel的enabled: true写成了enabled: yes,YAML解析出来是字符串而不是布尔值,OpenClaw直接把channel当成未启用。第三次是同时配置了多个channel,其中一个channel没有正确连接导致整个agent的启动状态混乱。
排查思路:先看OpenClaw启动日志里每个channel有没有输出connected之类的状态;再检查配置文件里对应channel的参数;最后直接用配置里的webhook地址往飞书发一条测试消息,看能不能收到。不要相信"没报错就是没问题"这回事。
4.3 环境变量不生效:隐蔽的配置失败
OpenClaw支持通过.env文件注入API Key和网络配置,但很多部署方式最终读到的环境变量是空的。
最常见的一个坑:systemd服务里没有读取.env文件。你可能会写:
API_KEY=qwen_xxx放在.env里,然后在终端python main.py跑,一切正常。但一旦用systemd注册成服务,就发现Agent一直报"API key not found"。原因就是systemd的默认环境不读项目目录下的.env,你需要显式告诉它:
EnvironmentFile=/opt/openclaw/.env另一坑是Windows服务模式或计划任务模式下,环境变量的作用域跟当前用户不一致。解决方案不是去系统设置里手动加环境变量,而是把.env文件放在项目根目录并确认程序会自动加载。如果程序没有自动加载,就在启动脚本里手动写:
from dotenv import load_dotenv load_dotenv()4.4 上下文超限与token成本失控
大模型的上下文窗口是有限的。千问这种商业API固然支持很长的上下文,但代价是每次请求都要把历史消息全部发给模型,token消耗随轮数指数上涨。你聊得越久,单次请求就越贵。
OpenClaw默认会保留对话历史,这本意是好的——让AI记得你们之前聊过什么。但我不止一次看到有人早上随手聊了几十轮,下午再看账单,下午茶钱没了。
有两个实用配置:
memory: max_turns: 20 # 只保留最近20轮 summary_threshold: 10 # 超过10轮时自动做摘要含义是:对话轮次超过上限后,只把最近的对话发给模型;更早的内容如果超过摘要阈值,就先用模型生成一段摘要,然后用摘要代替完整历史。
这个设计很巧妙——你既保留了关键的上下文记忆,又不会让token费用无限膨胀。如果你跑的是本地模型,上下文限制会更严格,这个配置基本必开。
4.5 磁盘缓存与日志暴涨:看不见的磁盘杀手
OpenClaw会为每次会话保存独立的session文件,还会写大量日志。平时没感觉,但跑上一个月,磁盘占用通常会超出你的预期。我自己的机器上一次手滑,日志文件加session文件吃掉了30多个G。
根治思路是三层:
日志层面,用logrotate按天切割并保留最近7天:
/opt/openclaw/logs/*.log { daily rotate 7 compress missingok notifempty copytruncate }会话文件层面,写一个简单的定时清理脚本:
find /opt/openclaw/sessions -name "*.json" -mtime +7 -delete find /opt/openclaw/sessions -name "*.lock" -delete锁文件一定要单独清,因为会话结束后锁文件可能残留,下次启动再遇到就是那个session file locked报错。定时任务可以放到crontab里,每周跑一次。
5. 日常使用与进阶配置
5.1 配置通义千问的具体参数
如果你决定用千问作为OpenClaw的模型后端,配置大概是这样的:
model: provider: qwen model_name: qwen-plus api_key: ${QWEN_API_KEY} base_url: https://dashscope.aliyuncs.com/compatible-mode/v1 temperature: 0.7 max_tokens: 1024三个注意事项:
第一,base_url必须带末尾的/v1,很多人的报错就出在这,少写一个/v1直接401。第二,model_name建议用qwen-plus起步,比最便宜的qwen-turbo回答质量高不少,价格也还在可接受范围。第三,api_key建议通过.env传入,而不是直接写在YAML配置文件里,否则你把配置截图发群里的时候,等于把钥匙也发出去了。
5.2 让人设明确的提示词模板
OpenClaw这类Agent框架,提示词的重要性往往被严重低估。很多人只是配置好模型就开聊,结果AI的表现时好时坏——今天像个专家,明天像个复读机。
我的做法是给OpenClaw设定一份"岗位说明书"式的基础人设。它的作用不是限制模型,而是让Agent在收到任何消息时都有一个稳定的响应框架:
你是一个严谨的AI助手,会先理解用户的真实意图,再决定回答方式。 如果问题涉及代码,先分析再给完整代码段。 如果问题模糊,先追问确认,不猜测。 回答保持简洁,中文为主。把这个模板写进OpenClaw的系统提示词配置以后,日常使用的体验会稳定非常多。它不是魔法,但就像给新员工发了一本员工手册,至少不会跑偏太严重。
5.3 让它真正7x24小时待命
部署OpenClaw的核心目的就是让它常驻。Windows下可以用任务计划程序或NSSM把Python进程注册为Windows服务;Linux用前面的systemd方式;macOS用LaunchAgent。
macOS的LaunchAgent示例:
<?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"> <dict> <key>Label</key> <string>com.openclaw.agent</string> <key>ProgramArguments</key> <array> <string>/Users/you/openclaw/venv/bin/python</string> <string>main.py</string> </array> <key>WorkingDirectory</key> <string>/Users/you/openclaw</string> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/Users/you/openclaw/logs/agent.log</string> <key>StandardErrorPath</key> <string>/Users/you/openclaw/logs/agent.err.log</string> </dict> </plist>文件保存到~/Library/LaunchAgents/com.openclaw.agent.plist后,执行launchctl load即可加载。这里要注意:日志路径的目录必须提前建好,否则launchctl会静默启动失败,这个问题我折腾了整整一个下午。
最后分享几个实用的小技巧:
- 调试时别直接开常驻服务,先在前台
python main.py跑,所有日志直接打屏,排查问题比翻日志文件快十倍。 - OpenAI兼容格式的API(比如千问)配置起来最省心,如果你要接的模型不确定是否兼容,先在代码里用
requests裸调一下它的接口,再填进OpenClaw。 session file locked报错如果实在排查不出来,最粗暴但有效的办法是停掉所有进程、删掉session目录下的.lock文件再重启。删文件前看一眼那个session是不是你自己正在用的,重要对话记录建议先备份。
"领养"一只OpenClaw不等于一劳永逸,它更像养一只真的宠物——喂食(配置模型)、清理(管理日志)、看病(排查报错)都是日常工作。但当你看到它在飞书里按时回复你、帮你处理重复性工作的时候,前面那些折腾就都值了。