AI Agent 实战:OpenClaw + Hermes 实现无人值守任务自动化
2026/8/27 3:10:42 网站建设 项目流程

手机弹出一条消息,我回了一段任务描述,然后合上电脑。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 ffmpeg

2.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/v1

2.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 的入口。

以飞书自建应用为例,配置逻辑是:

  1. 在开发者后台创建应用;
  2. 开启机器人能力;
  3. 配置事件订阅地址;
  4. 把事件回调地址指向 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: 120

max_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.md

Skill 的好处是,手机派活时只需要说:

@agent 执行:生成一份 OpenClaw、Hermes、Grok Bot 的对照稿

OpenClaw 会自动匹配create_comparison_doc,把topic解析为openclaw_hermes_grokbot,然后执行对应步骤。这样任务描述变得非常短,执行路径变得稳定。

5.3 手机派活到文件落地的执行链路

这次实测中,我在手机上发送任务后,OpenClaw 的执行链路是这样的:

  1. 收到 Webhook 消息;
  2. 校验用户白名单和命令前缀;
  3. 匹配 Skillcreate_comparison_doc
  4. 调用 Hermes 模型生成 Markdown 内容;
  5. 模型输出后,OpenClaw 将内容写入workspace/comparison.md
  6. 任务完成后,通过消息网关回传文件路径和耗时。

整条链路不需要我打开电脑,也没有任何人工干预。最终系统日志显示任务总耗时为 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文件夹名称在不同邮件服务商下可能不同,常见的是DraftsINBOX.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 安装后启动失败

现象:执行启动命令后,进程立即退出,日志里出现ModuleNotFoundErrorAddress already in use

可能原因和排查:

问题现象常见原因检查方式处理建议
ModuleNotFoundError虚拟环境未激活或依赖未装全查看完整堆栈,确认依赖包名重新执行 install.sh 或 pip install 依赖
Address already in use端口被占用`ss -lntpgrep <端口>`
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 问题,我一般按这个顺序排查:

  1. 输入是否正确:任务文本是否被正确解析;
  2. 文件路径和命名是否正确:Skill 和产出目录是否存在;
  3. 依赖是否安装:Python 包、ffmpeg、系统库;
  4. 配置是否生效:模型地址、白名单、命令黑名单;
  5. 权限是否足够:文件写权限、IMAP 登录、SMTP 端口;
  6. 日志是否有明确异常:OpenClaw 日志、Ollama 日志、邮件脚本日志;
  7. 最后才怀疑模型本身能力不足。

大多数问题都不是模型“不够聪明”,而是链路某一环配置错了。

8. 最佳实践:合上电脑前要完成的检查清单

8.1 无人值守运行检查清单

每次让 Agent 合上电脑继续干活之前,我会先过一遍这个清单:

  • [ ] OpenClaw 服务是否以 systemd 或 supervisor 方式常驻,而不是挂在前台终端;
  • [ ] 模型服务(Ollama)是否设置开机自启;
  • [ ] 关键路径是否存在写权限,workspacelogsskills是否可写;
  • [ ] 手机消息入口是否能正常访问 Webhook;
  • [ ] 任务最大执行时间是否覆盖最长任务;
  • [ ] 邮件类任务是否只配置了草稿保存,没有发送权限。

这条清单的价值在于,合上电脑前 5 分钟检查一次,能避免人离开后任务卡在“模型起不来”“目录不存在”这种低级问题上。

8.2 安全边界:最小权限原则

自托管 Agent 的权限一定不要给满。我的原则是:

  • Agent 只能写workspacelogs,不能写系统目录;
  • 邮件账号使用应用专用密码,并限制只能访问邮件 API;
  • 数据库和核心业务系统,Agent 只通过只读账号访问;
  • 危险命令如rmsendmaildrop table默认加入黑名单;
  • 任何自动发送动作必须由人工二次确认。

生产环境里,权限控制不是一项可选配置,而是 Agent 能否上线的前提。

8.3 日志与可观测性

无人值守任务最怕“静默失败”。任务明明没执行成功,但没有任何告警,人会误以为已经完成。我的做法是:

  • 每个任务结束后,写一条 JSON 日志,包含任务 ID、耗时、输出文件、错误信息;
  • 超过 30 分钟的任务,主动推送一条进度消息到手机;
  • 失败任务自动重试最多两次,重试仍失败则进入待人工处理队列。

没有日志的 Agent 等于没有仪表盘的飞机,飞起来不可怕,降不下去才可怕。

8.4 模型选型与后续扩展

本文实验中,我用 Hermes 完成推理,但生产环境完全可以根据任务类型切换模型:

  • 结构化文档生成,优先本地 7B 到 14B 模型,速度快、成本低;
  • 复杂任务拆解,可以接入更强云端模型,但要注意数据边界;
  • 录屏理解,需要视觉能力,建议单独部署一个支持图像输入的模型服务。

下一步可以在 OpenClaw 里加入定时器,让 Agent 每天早上自动生成工作日志草稿、每周五自动汇总版本发布清单。只要消息入口、Skill、模型、权限四个部分都稳定,合上电脑活照干就不再是演示功能,而是一种可以长期运行的工作方式。

真正的边界不在模型会不会生成内容,而在你敢不敢让它在没有人工盯着的时候执行文件操作、访问邮件、调用内部系统。建议先从“只生成文件草稿”开始,把每一条 Skill 的权限边界都写清楚,跑熟后再逐步放开更复杂的操作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询