手机弹出一条消息,我回了一段任务描述,然后合上电脑。12 分钟后,工作目录里多了一封 234 行的对照稿,Agent 技能列表里多了一条从录屏里学来的操作 Skill,邮件客户端里躺着一封只进草稿箱、没有发出去的周报。这不是科幻演示,而是我自己部署 OpenClaw 和 Hermes 后,把它们和 Grok Bot 放在同一批任务里做对照的真实测试结果。
如果你也玩过 AI Agent,会知道难点不在“聊天”,而在“把零散任务拆成步骤、调用工具、安全落地”。Grok Bot 这类托管 Bot 开箱即用,但无法访问我的服务器、收件箱和内部工作台。OpenClaw 负责任务编排和技能管理,Hermes 负责本地推理和工具调用,二者组合后,才可能实现“合上电脑活照干”。这篇文章会从工具定位、部署、手机派活、录屏学活、自动生成对照稿到邮件草稿安全策略,完整写一遍我的落地过程和踩坑记录。
1. 先分清三种工具:OpenClaw、Hermes 与 Grok Bot 的角色差异
1.1 Agent 框架、本地模型和托管 Bot 不是同一种东西
很多人第一次接触 AI Agent,会把“模型”“框架”“Bot 产品”混为一谈。模型负责理解语言和生成文本,框架负责把任务拆成步骤并调用工具,Bot 产品是把模型、界面、对话历史和工具调用打包好的服务。这三层在架构上是可以拆开的,实际部署时也建议拆开理解。
OpenClaw 在这一组合中承担的是 Agent 编排层。它相当于一个常驻服务,能接收来自 IM、Webhook、定时器的消息,维护任务上下文,加载 Skill,调用外部命令和 API,最后把结果写回文件或会话。OpenClaw 本身不一定包含很强的推理能力,它更像“家务总管”,知道什么活该找谁干、按什么顺序干、干完放哪里。
Hermes 在我的环境里承担的是模型与执行层。它可以指本地部署的 Hermes 系列模型,也可以指基于该模型封装的 Agent 执行器。实验中我通过 Ollama 拉起 Hermes 模型,并使用它处理对照稿的框架生成、录屏关键步骤归纳和邮件草稿正文撰写。Hermes 负责“想”,OpenClaw 负责“做”,二者通过 HTTP 接口通信。
Grok Bot 则作为外部托管 Bot 参与对照。它不用部署,天然具备联网检索和对话生成能力,缺点是权限边界受限于平台提供的 API,不能直接操作我服务器上的文件、数据库和邮件客户端。把它放在对照组,能看出“托管 Bot”和“自托管 Agent + 本地模型”在真实任务中的差距到底在哪里。
1.2 OpenClaw 的核心能力:消息入口、Skill 和任务执行
OpenClaw 的安装和配置在很多资料里被包装得很复杂,但核心其实只有三件事:
- 配置消息入口,让手机、IM、Webhook 可以把任务文本送进服务;
- 配置模型后端,让 OpenClaw 有推理能力;
- 配置 Skill 目录,让 OpenClaw 知道遇到某类任务时该调用哪些脚本、命令或 API。
这里可以用一张表来理解三者的职责:
| 层次 | 典型组件 | 负责内容 | 部署方式 |
|---|---|---|---|
| 编排层 | OpenClaw | 消息接收、任务状态、Skill 调度 | 自托管常驻进程 |
| 模型层 | Hermes / Ollama | 文本生成、JSON 结构化输出、多模态理解 | 本地或局域网服务器 |
| 对照层 | Grok Bot | 对话、联网检索、内容生成 | 托管服务 |
| 消息层 | Bot API / Webhook | 手机到 Agent 的通道 | 服务商提供接口,Agent 侧做回调 |
在这个结构里,手机派活只是消息入口的一种形态。手机发消息,IM 网关转成 Webhook,OpenClaw 收到后把任务文本解析成 Job,再交给 Skill 执行。真正干活的是 Skill,不是模型本身。
1.3 为什么需要本地模型 Hermes 而不是全部交给云端 API
我选择 Hermes 作为实验模型,主要有三个原因。
第一,任务指令里包含内部工作流信息,例如服务器路径、邮件签名、内部系统操作步骤。把这些内容直接发给托管 Bot,会出现数据落盘到第三方服务的问题。本地模型可以在数据不出内网的前提下完成推理。
第二,实验任务需要重复执行。录屏学活、生成对照稿、写邮件草稿,这类任务每次只是内容不同,流程都是一样的。本地模型跑起来之后,API 调用成本比逐字计费的托管模型低,也更容易做批量测试。
第三,OpenClaw 的 Skill 机制要求模型输出可解析的 JSON。本地模型可以和 OpenClaw 约定固定的响应格式,出错时我能直接看日志改 Prompt,调试链路更短。
1.4 对照实验的公平性如何控制
用 Grok Bot 和自托管的 OpenClaw + Hermes 做对照,不能直接拿“谁的文字好坏”做结论,因为两个系统的上下文、工具权限和运行环境不同。我的做法是固定任务交付物,只比较三件事:
- 交付物格式是否满足要求;
- 是否真正执行了任务所需的工具调用;
- 是否在无人值守状态下完成了从收到消息到产出文件的闭环。
这样,Grok Bot 可以证明模型本身能写出像样的内容,OpenClaw + Hermes 则证明在合上电脑之后,任务还能被真正执行。二者不是替代关系,而是互补关系。
2. 部署自托管环境:OpenClaw 与 Hermes 的最小可用组合
2.1 环境准备:先定服务器、目录和依赖
我给这套实验准备的是一台 Linux 服务器,2 核 4GB 内存起步,磁盘 40GB。Ollama 加载 7B 量级模型时,内存占用大概在 4GB 到 6GB 之间,如果还要跑 Vision 模型抽帧理解,建议内存调到 8GB 以上。操作系统以 Ubuntu 22.04 为例,其他 Linux 发行版思路相同。
目录规划上,我把所有实验文件放在一个专用目录里:
mkdir -p /opt/agent/{openclaw,ollama,skills,logs,workspace} cd /opt/agent这里每个目录都有明确用途:
openclaw:存放 OpenClaw 安装文件与配置;ollama:存放模型下载路径和临时缓存;skills:存放录屏生成的 Skill 和手动编写的 Skill;logs:存放 OpenClaw 运行日志;workspace:任务产出文件统一写到这里。
不要把所有文件丢在 root 家目录下。自托管 Agent 一旦开始使用真实文件路径和邮件配置,目录混乱会直接导致后续排查困难。
安装之前先确认 Python、Git、ffmpeg 已经存在:
python3 --version git --version ffmpeg -version如果缺少 ffmpeg,录屏抽帧和视频预处理的步骤会卡住,建议在部署阶段就装好:
sudo apt update sudo apt install -y python3 python3-venv git ffmpeg2.2 安装 OpenClaw 并完成初始化
OpenClaw 的安装方式以项目仓库 README 为准。我这里给出的是常见模式,先克隆仓库,再执行安装脚本:
cd /opt/agent git clone <openclaw 仓库地址> openclaw cd openclaw bash install.sh安装脚本会创建虚拟环境、安装 Python 依赖,并生成一个示例配置文件。安装完成后,先执行初始化命令,让它生成默认目录和配置模板:
python3 -m openclaw init初始化完成后,重点检查config.yaml是否生成。OpenClaw 服务本身不内置模型,所以初始化后还不能直接使用,必须先把 Hermes 模型接进来。
2.3 用 Ollama 拉起 Hermes 本地模型
Ollama 的安装命令直接从官网复制即可。装好后先拉取 Hermes 模型:
ollama pull hermes3确认模型已经能正常对话:
ollama run hermes3 "用一句话介绍 Hermes 模型的能力"如果输出正常,说明本地模型已经可用。接着把 Ollama 的服务地址固定下来。默认 Ollama 监听127.0.0.1:11434,如果 OpenClaw 和 Ollama 在同一台服务器,可以保持不变。OpenClaw 调用 Ollama 时,走的是 OpenAI 兼容接口,所以模型后端地址一般写作:
http://127.0.0.1:11434/v12.4 把 Hermes 接入 OpenClaw
打开 OpenClaw 的config.yaml,找到模型配置段。不同版本的字段名可能不同,核心参数如下:
model: provider: openai_compatible base_url: http://127.0.0.1:11434/v1 api_key: ollama model_name: hermes3 temperature: 0.2 max_tokens: 4096关键参数解释:
base_url是 OpenClaw 调用模型时使用的 API 地址;api_key在 Ollama 本地模式下不会校验,但字段不能留空;temperature设置为 0.2,是为了让结构化任务输出尽量稳定,避免每次生成结果差异过大;max_tokens根据任务文本长度调整,生成 234 行对照稿时,4096 一般够用。
配置完成后启动 OpenClaw:
python3 -m openclaw start然后查看日志,确认服务启动、模型连接成功:
tail -f /opt/agent/logs/openclaw.log如果日志里出现模型超时或 404,先单独用 curl 测试 Ollama 接口:
curl http://127.0.0.1:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"hermes3","messages":[{"role":"user","content":"ping"}]}'这一步能迅速定位问题在模型服务还是 OpenClaw 配置。
2.5 首次运行验证:一个不需要工具的最简任务
部署完成后的第一件事,不是急着接手机,而是先用命令行发一个简单任务验证链路:
python3 -m openclaw run "请生成一份开发环境检查清单,输出到 workspace/checklist.md"如果workspace/checklist.md正常生成,说明 OpenClaw 的任务执行、模型推理、文件写入链路已经打通。这里有一个很容易踩的坑:模型能回复,不代表 Agent 能把回复写入文件。一定要验证到“文件真实出现”,才算链路通。
3. 手机派活:把任务从 IM 送到 Agent
3.1 为什么不用 SSH 而用手机消息
“合上电脑活照干”的核心诉求是,在我不坐在电脑前的时候,任务仍然能进来、能执行、能产出结果。SSH 需要终端、密钥和持续连接,而手机 IM 是我随身携带的交互入口。让 OpenClaw 接入一个消息网关后,我只需要在手机上发一句话,任务就会进入 OpenClaw 的任务队列。
手机派活的工程本质是:把 IM 消息转成 Webhook 请求,OpenClaw 收到请求后解析出任务文本,再按 Skill 规则执行。
3.2 接入消息入口:优先使用合规的 Bot 平台
我建议优先使用企业微信自建应用、飞书自建应用或 Telegram Bot 这类有官方 API 的平台。不要使用非官方的个人微信协议,这类方案既不稳定,也有账号安全风险,不适合作为生产型 Agent 的入口。
以飞书自建应用为例,配置逻辑是:
- 在开发者后台创建应用;
- 开启机器人能力;
- 配置事件订阅地址;
- 把事件回调地址指向 OpenClaw 暴露的 Webhook。
OpenClaw 侧的配置大致如下:
channels: webhook: enabled: true path: /webhook/feishu token: <你的自定义校验 token>这样飞书机器人收到消息后,会通过事件订阅把 JSON 转发到 OpenClaw。OpenClaw 匹配到path后,再经过 token 校验进入任务队列。
3.3 配置用户白名单和命令前缀
手机派活不代表任何人在群里发一句话,Agent 都要执行。必须做两层限制。
第一层,OpenClaw 只响应配置了用户 ID 的请求:
authorization: enabled: true allow_users: - <你的飞书 user_id>第二层,任务指令需要带固定前缀,避免误触发。例如:
@agent 执行:生成今日项目状态邮件草稿OpenClaw 收到消息后,先判断用户是否在白名单,再判断是否有执行:前缀,二者都满足才入队。这个设计能避免群聊里的闲聊被当作任务执行。
3.4 任务队列与超时控制
手机派活天然是异步任务。任务提交后,OpenClaw 需要立即回执“任务已收到”,然后真正进入执行。配置里要区分两个超时:
- 模型单次生成超时,建议 120 秒;
- 整个任务执行超时,如果是录屏学习这类长任务,建议 1800 秒。
配置示例:
task: queue_size: 20 max_execution_seconds: 1800 model_timeout_seconds: 120max_execution_seconds过短会导致录屏学习和长文档生成被中断。过长则会让异常任务一直占用资源,所以要根据任务类型设置。
3.5 验证手机到 Agent 的完整链路
部署完成后,我在手机上发了一条测试消息:
@agent 执行:检查 OpenClaw 服务状态,并返回当前时间如果 Agent 返回了服务状态和时间,说明手机、IM 网关、OpenClaw 的消息链路已经通了。此时不要急着测试大任务,先跑小任务确认链路稳定,再进入录屏学活。
4. 录屏学活:让 Agent 从录屏视频里生成 Skill
4.1 什么是“录屏学活”
给 Agent 看一段操作录屏,让它理解“用户在哪个界面、点了什么、填了什么、最后得到什么结果”,然后把操作步骤归纳成一个可复用的 Skill。这个流程叫“录屏学活”,其实是多模态模型 + Skill 生成机制的组合应用。
它解决的核心问题是:Agent 配置新技能时,不一定需要人工手写脚本。只要操作路径是明确可复述的,模型可以把录屏转成步骤文档和参数说明,再由 OpenClaw 把文档注册成 Skill。
4.2 录屏素材准备与格式要求
录屏学活的效果,很大程度取决于录屏素材质量。好的录屏应该满足:
- 操作步骤清晰,每个动作之间有停顿;
- 涉及填写的表单字段,尽量在画面上可见;
- 最后一步有明显的结果反馈,比如页面跳转、成功提示、文件生成。
我之前用手机录了一段在后台系统里创建项目分组的操作,时长为 2 分 40 秒,分辨率 1080p,帧率 30fps。这个时长和清晰度足够模型理解,但 2 分钟的视频如果直接丢给模型,会导致上下文过大、响应变慢。
4.3 用 ffmpeg 抽帧降低理解成本
处理录屏的第一件事是抽帧。视频模型或视觉模型不需要连续帧,每秒 1 到 2 帧即可还原大部分操作路径。先用 ffmpeg 抽帧:
mkdir -p /opt/agent/workspace/frames ffmpeg -i /opt/agent/workspace/demo.mp4 \ -vf "fps=1" \ /opt/agent/workspace/frames/frame_%03d.png抽帧之后,按时间顺序生成一个文件列表,方便让模型按顺序理解:
ls /opt/agent/workspace/frames/ | sort > /opt/agent/workspace/frames/filelist.txt如果视频较长,可以分成多个片段,每个片段单独描述,再由最终模型汇总。不要让单次请求的图片数量超过 15 张,否则模型容易遗漏关键步骤。
4.4 调用 Hermes 生成 Skill 的 Prompt 设计
把抽帧后的图片和文件列表交给 Hermes 时,Prompt 需要明确告诉模型四件事:
- 这是什么环境;
- 最终要得到什么结果;
- 输出的 Skill 应该包含哪些字段;
- 操作步骤必须按时间顺序排列。
我使用的 Prompt 结构如下:
你是一名 Agent 技能生成器。下面提供了某后台系统的操作录屏帧。请按时间顺序识别操作步骤,并输出一个 JSON 结构。 要求: 1. skill_name 必须是小写下划线格式。 2. description 要说明该 Skill 的触发条件和用途。 3. steps 数组按时间顺序排列,每步包含 action、target、value 三个字段。 4. 如果某个步骤是输入文本,value 使用占位符 <变量名>。 开始分析: 图片列表:<filelist.txt 内容>为了避免模型把步骤写得过于笼统,我还会在 Prompt 里追加一行:
判断步骤是否可执行,不要用“用户点击按钮”这种描述,要具体到按钮名称和页面位置。4.5 将 Skill 挂载到 OpenClaw 并测试
Hermes 输出 JSON 后,需要先交给一个脚本做格式校验,再写入 Skill 目录。我用 Node.js 写的校验逻辑很简单:
const fs = require('fs'); const raw = fs.readFileSync('/opt/agent/workspace/skill_raw.json', 'utf-8'); const skill = JSON.parse(raw); if (!skill.skill_name || !Array.isArray(skill.steps)) { console.error('skill 格式不合法'); process.exit(1); } fs.writeFileSync( `/opt/agent/skills/${skill.skill_name}.yaml`, `name: ${skill.skill_name}\ndescription: ${skill.description}\nsteps:\n` + skill.steps.map(s => ` - action: ${s.action}\n target: ${s.target}\n value: ${s.value}`).join('\n') );写入 YAML 后,在 OpenClaw 的配置里把skills目录刷新,就可以用手机发送“执行:创建项目分组”来测试。如果 Agent 返回执行记录,说明录屏学活链路已经可用。
4.6 录屏学活最常见的三个坑
第一个坑是视频太长,直接把 MP4 传给模型导致请求超时。解决方法就是先抽帧,必要时再缩短视频长度。
第二个坑是模型把步骤顺序打乱。录屏学活的本质是时间线还原,如果模型不按帧顺序分析,生成的 Skill 会完全不可用。必须在 Prompt 里强调按 filelist 顺序,并在输出后做顺序校验。
第三个坑是录屏包含敏感信息。后台系统、邮箱界面、内部系统的录屏,很可能包含账号、密码、客户数据。处理这类素材时,一定要在本地模型上完成,不能把录屏直接发给外部托管 Bot。
5. 12 分钟生成 234 行对照稿:一次完整无人值守任务
5.1 任务需求:Grok Bot、OpenClaw、Hermes 三方案对照
这个任务的背景是:我需要对三种 AI 工具做一个可复用的对比文档。如果手动写,需要一边查资料一边整理格式,至少半小时。而 Agent 的批量优势是,只要把模板和来源资料准备好,它可以快速生成一份结构完整的对照稿。
我设计的需求如下:
- 输出文件名:
comparison.md; - 行数目标:200 行以上;
- 输出格式:Markdown,包含表格和结论;
- 内容范围:Grok Bot、OpenClaw、Hermes 的定位、部署方式、适用场景、安全边界。
5.2 把任务封装成 Skill,而不是让模型自由发挥
为了让任务可复现,我没有直接给模型发一段长 Prompt,而是把它封装成create_comparison_doc这个 Skill。
Skill 的 YAML 结构如下:
name: create_comparison_doc description: 生成三个 Agent 工具的对比文档 inputs: - name: topic description: 对比主题 required: true - name: length description: 期望输出行数 required: false steps: - action: call_model prompt_template: | 请生成一份关于 {topic} 的对照稿。 要求: - 使用 Markdown 格式; - 包含适用场景、部署方式、安全边界三个维度; - 每个维度都要有具体对比点,不能只写结论; - 输出到文件 workspace/{topic}_comparison.md。 output_file: workspace/{topic}_comparison.mdSkill 的好处是,手机派活时只需要说:
@agent 执行:生成一份 OpenClaw、Hermes、Grok Bot 的对照稿OpenClaw 会自动匹配create_comparison_doc,把topic解析为openclaw_hermes_grokbot,然后执行对应步骤。这样任务描述变得非常短,执行路径变得稳定。
5.3 手机派活到文件落地的执行链路
这次实测中,我在手机上发送任务后,OpenClaw 的执行链路是这样的:
- 收到 Webhook 消息;
- 校验用户白名单和命令前缀;
- 匹配 Skill
create_comparison_doc; - 调用 Hermes 模型生成 Markdown 内容;
- 模型输出后,OpenClaw 将内容写入
workspace/comparison.md; - 任务完成后,通过消息网关回传文件路径和耗时。
整条链路不需要我打开电脑,也没有任何人工干预。最终系统日志显示任务总耗时为 11 分 48 秒,交付文件为 234 行 Markdown。这 12 分钟里,模型生成时间占了大多数,文件写入和回执时间很短。
5.4 234 行是怎么构成的
对一篇技术对照稿来说,234 行并不算多。它的行数拆分大致如下:
| 内容块 | 行数 |
|---|---|
| 标题与背景说明 | 18 |
| 三工具定位与定义 | 42 |
| 部署方式对比表 | 28 |
| 适用场景对比表 | 30 |
| 安全边界分析 | 56 |
| 选型建议 | 36 |
| 代码与配置片段 | 16 |
| 结尾与检查清单 | 8 |
行数本身不是质量指标,重要的是每个段落都有可验证的信息点。如果模型只是写了“各有优势”这类空话,即使 1000 行也没有价值。我的检查方式是逐段看表格内容,确认每一条对比都有明确的用途和边界。
5.5 如何判断这份对照稿能不能直接使用
我拿到comparison.md之后,会按三个维度验收:
- 结构完整性:是否包含部署、场景、安全边界三个章节;
- 事实准确性:是否写明了 OpenClaw 是编排层、Hermes 是模型层、Grok Bot 是托管 Bot;
- 操作可用性:结论部分是否给出了可执行的选型建议。
如果某一段缺失,我不会让 Agent 重写全文,而是让它只补写缺失章节:
@agent 执行:补全 comparison.md 中的安全边界章节,并在原文件追加内容这样做既保留原有内容,又让修正范围最小。生产型 Agent 的“迭代修正”比“一次生成”更重要。
6. 邮件只能进草稿箱:权限隔离与安全护栏
6.1 为什么默认只允许草稿,而不是直接发信
AI Agent 一旦接入邮件系统,最大的风险不是生成不了邮件,而是生成后直接发送出去。邮件是不可撤回的通信方式,发错收件人、发错内容、附带错误附件,后果都很难处理。
所以我的默认策略是:无论 Agent 生成什么邮件,都只保存到草稿箱,绝不自动发送。发送动作必须由人工在邮件客户端里确认后触发。这个约束要在 Skill 和邮件脚本两层同时生效。
6.2 邮件配置:SMTP、IMAP 和草稿箱标识
OpenClaw 本身不处理邮件协议,通常由 Skill 调用一个脚本完成。脚本需要三类信息:
- SMTP 服务器地址和端口,用于建立连接;
- IMAP 或 Exchange 地址,用于写入草稿箱;
- 账号认证信息,使用应用专用密码或 OAuth Token。
以下是一个 Python 脚本的草稿写入逻辑,使用 SMTP 连接但不调用sendmail,而是把邮件保存为草稿:
import smtplib from email.message import EmailMessage msg = EmailMessage() msg["Subject"] = "项目状态周报" msg["From"] = "agent@example.com" msg["To"] = ["team@example.com"] msg.set_content("这是由 Agent 生成的邮件草稿,请人工确认后再发送。") # 只建立连接,校验账号权限,不发送 with smtplib.SMTP_SSL("smtp.example.com", 465) as server: server.login("agent@example.com", "<应用专用密码>") # 这里不调用 send_message,只做连接测试 server.noop()这段代码最关键的地方是:它只做连接和登录验证,不调用发送方法。真正把草稿写进邮箱,需要通过 IMAP 协议追加到Drafts文件夹。
6.3 把草稿写入 IMAP Drafts 文件夹
如果 SMTP 只负责验证,写草稿需要单独处理。下面是使用 IMAP 追加草稿的示例:
import imaplib import time imap = imaplib.IMAP4_SSL("imap.example.com", 993) imap.login("agent@example.com", "<应用专用密码>") draft = msg.as_string().encode("utf-8") imap.append("Drafts", "\\Draft", imaplib.Time2Internaldate(time.time()), draft) imap.logout()注意Drafts文件夹名称在不同邮件服务商下可能不同,常见的是Drafts、INBOX.Drafts、草稿箱。脚本里可以通过列出文件夹来确认名称:
status, folders = imap.list() print(folders)如果脚本找不到草稿箱目录,先看返回的文件夹列表,再调整路径字符串。
6.4 在 OpenClaw Skill 里限制邮件动作
即使脚本写得安全,如果 Skill 允许用户传一个send: true参数,风险依然存在。我在 Skill 配置里直接删除了发送相关动作,只保留草稿相关动作:
name: send_email_draft description: 生成邮件草稿并保存到邮箱草稿箱,不允许直接发送 steps: - action: run_script script: scripts/save_draft.py args: to: "{to}" subject: "{subject}" body: "{body}"同时在 OpenClaw 的权限配置里,把邮件发送命令加入黑名单:
commands: blocked: - "sendmail" - "mail send" - "smtp.send_message"这层限制是为了防止模型在生成长邮件时,自行调用系统命令把邮件发出去。只要黑名单存在,即使模型输出了错误指令,也不会执行成功。
6.5 验证草稿是否真的没有发送
任务完成后,我需要确认两件事:
- 草稿箱里确实出现了邮件;
- 收件人没有收到任何邮件。
验证方法是登录邮件客户端,进入草稿箱查看;同时检查发件箱或已发送目录,确认为空。更严谨的做法是在 IMAP 账号里单独建一个规则,把 Agent 生成的所有邮件标记为\Draft,并关闭任何自动发送的规则。
如果邮件服务商有 API,也可以查询发送记录。生产环境建议每次邮件类任务结束后,由另一个监控任务读取邮件 API 的发送日志,一旦发现非人工发送记录就立刻告警。
7. 常见问题与排查链路
7.1 OpenClaw 安装后启动失败
现象:执行启动命令后,进程立即退出,日志里出现ModuleNotFoundError或Address already in use。
可能原因和排查:
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| ModuleNotFoundError | 虚拟环境未激活或依赖未装全 | 查看完整堆栈,确认依赖包名 | 重新执行 install.sh 或 pip install 依赖 |
| Address already in use | 端口被占用 | `ss -lntp | grep <端口>` |
| Config file missing | 未执行 init | 检查配置文件是否生成 | 执行python3 -m openclaw init |
排查顺序先从依赖开始,再看端口,再看配置。不要一上来就重装系统。
7.2 手机消息收不到 Agent 回执
现象:手机 IM 群里发送任务后,没有收到“任务已收到”的回复。可能原因有三个:
- Webhook 地址没有暴露到公网,或者内网穿透策略失效;
- 校验 token 和 OpenClaw 配置不一致;
- 用户 ID 不在白名单。
检查方式是在 IM 开发者后台查看事件回调日志,确认请求是否到达。如果请求已经到达,再看 OpenClaw 日志是否打印了 token 校验失败。解决方法是逐层定位:先看 IM 后台,再看 OpenClaw 入口日志,最后看消息队列。
7.3 Hermes 返回内容不是合法 JSON
现象:Skill 执行中,模型返回了一段解释性文字,而不是 JSON,导致后续解析失败。
解决方式是两层处理。第一层,在 Prompt 里要求输出严格 JSON,并给出示例。第二层,在后处理脚本里加入 JSON 解析容错,去掉 Markdown 代码块标记再解析:
import json import re raw = model_output.strip() raw = re.sub(r"^```json|```$", "", raw, flags=re.MULTILINE).strip() data = json.loads(raw)如果仍然失败,检查模型上下文是否太长,或者温度是否设置过高。结构化任务建议温度保持在 0.2 以下。
7.4 录屏文件太大导致任务超时
现象:手机派发“学习录屏”任务后,运行一段时间后超时,OpenClaw 日志显示max_execution_seconds超限。
处理方式是把录屏文件尽量变小。先降低分辨率,再降低帧率,最后抽帧:
ffmpeg -i input.mp4 -vf "scale=1280:-1,fps=5" output.mp4如果这样还超过模型上下文,就把 5 分钟的视频拆成 3 段,每段单独生成 Skill 片段,最后再合并。不要试图用一次请求处理超长视频。
7.5 邮件技能执行成功但草稿箱为空
现象:日志显示保存草稿成功,IMAP 已连接,但客户端草稿箱看不到邮件。
这通常是因为草稿箱路径不对。不同邮件服务商的 IMAP 文件夹名称不同。先打印文件夹列表,确认草稿箱名称。其次检查 IMAP 追加时使用的 flags 是否正确,如果 flags 不是\\Draft,邮件可能被追加到普通文件夹。
7.6 排错顺序总结
遇到自托管 Agent 问题,我一般按这个顺序排查:
- 输入是否正确:任务文本是否被正确解析;
- 文件路径和命名是否正确:Skill 和产出目录是否存在;
- 依赖是否安装:Python 包、ffmpeg、系统库;
- 配置是否生效:模型地址、白名单、命令黑名单;
- 权限是否足够:文件写权限、IMAP 登录、SMTP 端口;
- 日志是否有明确异常:OpenClaw 日志、Ollama 日志、邮件脚本日志;
- 最后才怀疑模型本身能力不足。
大多数问题都不是模型“不够聪明”,而是链路某一环配置错了。
8. 最佳实践:合上电脑前要完成的检查清单
8.1 无人值守运行检查清单
每次让 Agent 合上电脑继续干活之前,我会先过一遍这个清单:
- [ ] OpenClaw 服务是否以 systemd 或 supervisor 方式常驻,而不是挂在前台终端;
- [ ] 模型服务(Ollama)是否设置开机自启;
- [ ] 关键路径是否存在写权限,
workspace、logs、skills是否可写; - [ ] 手机消息入口是否能正常访问 Webhook;
- [ ] 任务最大执行时间是否覆盖最长任务;
- [ ] 邮件类任务是否只配置了草稿保存,没有发送权限。
这条清单的价值在于,合上电脑前 5 分钟检查一次,能避免人离开后任务卡在“模型起不来”“目录不存在”这种低级问题上。
8.2 安全边界:最小权限原则
自托管 Agent 的权限一定不要给满。我的原则是:
- Agent 只能写
workspace和logs,不能写系统目录; - 邮件账号使用应用专用密码,并限制只能访问邮件 API;
- 数据库和核心业务系统,Agent 只通过只读账号访问;
- 危险命令如
rm、sendmail、drop table默认加入黑名单; - 任何自动发送动作必须由人工二次确认。
生产环境里,权限控制不是一项可选配置,而是 Agent 能否上线的前提。
8.3 日志与可观测性
无人值守任务最怕“静默失败”。任务明明没执行成功,但没有任何告警,人会误以为已经完成。我的做法是:
- 每个任务结束后,写一条 JSON 日志,包含任务 ID、耗时、输出文件、错误信息;
- 超过 30 分钟的任务,主动推送一条进度消息到手机;
- 失败任务自动重试最多两次,重试仍失败则进入待人工处理队列。
没有日志的 Agent 等于没有仪表盘的飞机,飞起来不可怕,降不下去才可怕。
8.4 模型选型与后续扩展
本文实验中,我用 Hermes 完成推理,但生产环境完全可以根据任务类型切换模型:
- 结构化文档生成,优先本地 7B 到 14B 模型,速度快、成本低;
- 复杂任务拆解,可以接入更强云端模型,但要注意数据边界;
- 录屏理解,需要视觉能力,建议单独部署一个支持图像输入的模型服务。
下一步可以在 OpenClaw 里加入定时器,让 Agent 每天早上自动生成工作日志草稿、每周五自动汇总版本发布清单。只要消息入口、Skill、模型、权限四个部分都稳定,合上电脑活照干就不再是演示功能,而是一种可以长期运行的工作方式。
真正的边界不在模型会不会生成内容,而在你敢不敢让它在没有人工盯着的时候执行文件操作、访问邮件、调用内部系统。建议先从“只生成文件草稿”开始,把每一条 Skill 的权限边界都写清楚,跑熟后再逐步放开更复杂的操作。