Hermes Agent vs OpenClaw:轻量级AI Agent开发框架选型指南
1. 项目概述:从 OpenClaw 切换到 Hermes Agent 的真实动因与价值判断
我卸载 OpenClaw 的那天,不是因为它的功能弱,而是因为它在实际工作流里“太重”了——启动要等 47 秒,改一个 skill 要重启整个服务,调试时日志埋得深、报错不具体,更关键的是,它默认把所有操作都塞进一个单体进程里,连开两个 tab 都卡顿。这不是技术不行,是设计哲学不同:OpenClaw 是为“演示完整 AI Agent 能力”而生的参考实现,而 Hermes 是为“每天写 3 个新 agent、迭代 5 次、部署到 3 台边缘设备”而造的生产级工具链。标题里那句“我选择了 Hermes agent”,不是跟风,是踩过坑之后的主动降维打击:用更轻的架构、更直的路径、更稳的交付,去解决同一个问题——让 AI 真正嵌入到我的日常开发、自动化运维和本地知识处理中。
Hermes 不是另一个 OpenClaw 的复刻版,它是对“Agent 开发体验”重新定义的一次实践。它把 agent 拆成三个可独立演进的层:Skill(能力单元)、Orchestrator(调度中枢)和Runtime(执行沙盒)。你写一个“读取 Excel 并生成周报摘要”的 skill,它就是一个纯 Python 函数,不依赖任何框架装饰器;你调用它,靠的是 YAML 定义的 workflow,而不是硬编码的 if-else;它跑在哪?可以是本地 Docker,也可以是树莓派上的轻量 runtime,甚至能编译成 WebAssembly 在浏览器里跑。这种分层不是为了炫技,是为了解决 OpenClaw 用户最常问的三个问题:“怎么热更新一个 skill?”、“怎么让 agent 同时处理邮件和微信消息?”、“能不能不装 Docker 就跑起来?”。Hermes 全部给了答案,而且答案很朴素:用标准协议、最小依赖、显式配置。
关键词里反复出现的 “hermes desktop 下载”、“hermes studio”、“unlimited tab”,其实指向一个被很多人忽略的事实:Hermes 的核心竞争力不在云端,而在桌面端。它的 Desktop App 不是 Electron 套壳,而是基于 Tauri + Rust 构建的原生级应用,内存占用稳定在 120MB 以内,启动时间实测 1.8 秒(M2 MacBook Air),支持 macOS / Windows / Linux 三端原生通知、系统托盘、快捷键唤醒。你不需要打开浏览器、不需要记住 localhost:3000 的端口、不需要每次手动docker-compose up -d,点开图标,agent 就在后台安静运行,你 Ctrl+Shift+P 唤出命令面板,输入 “summarize this doc”,它就立刻开始工作。这才是“AI Agent 落地最后一公里”的真实形态——不是大模型 API 的华丽调用,而是像 Finder 或 Explorer 一样,成为你操作系统里一个可信、可靠、可信赖的“数字同事”。
如果你正在看这篇教程,大概率你已经试过 OpenClaw,也遇到了类似的问题:想快速验证一个想法,结果卡在环境配置上;想接入公司内网系统,发现 OpenClaw 的 auth 模块写死在代码里;想给非技术人员用,却发现它连基础的中文界面都没有。那么 Hermes 就是为你准备的“平滑迁移路径”。它不强制你放弃已有技能,OpenClaw 的 skill 逻辑稍作封装就能变成 Hermes 的 function;它不增加你的学习成本,YAML workflow 的语法比 OpenClaw 的 JSON Schema 更接近自然语言;它甚至帮你省掉了 Nacos、Consul 这类服务发现组件——Hermes Desktop 内置了本地服务注册中心,所有 skill 自动注册、自动发现、自动健康检查。这不是“另一个选择”,这是“更少摩擦的选择”。接下来的内容,我会带你从零开始,在一台干净的 Windows 10 笔记本上,完成 Hermes 的全链路部署、第一个 skill 编写、多 tab 协同调度,以及最关键的——如何把 OpenClaw 里你最常用的 3 个 skill,无痛迁移到 Hermes 环境中。
2. 核心设计思路与方案选型解析:为什么 Hermes 是当前阶段的最优解
2.1 架构对比:从 OpenClaw 的“单体演示”到 Hermes 的“分层生产”
理解 Hermes 的价值,必须先看清它和 OpenClaw 在底层设计上的根本差异。这不是版本升级,而是范式切换。我把两者的核心架构画成一张对比表,这张表不是为了贬低 OpenClaw,而是为了让你清楚:你在哪个环节卡住了,Hermes 是如何针对性解决的。
| 维度 | OpenClaw(v0.8.3) | Hermes(v1.4.0) | 设计意图解读 |
|---|---|---|---|
| 核心进程模型 | 单体 Python 进程(Flask + Celery + Redis) | 多进程协作模型(Rust Runtime + Python Skill Process + Node Studio UI) | OpenClaw 把所有事塞进一个进程,方便演示但难调试;Hermes 让每个模块各司其职,Runtime 崩溃不影响 Studio,Skill 崩溃不影响 Orchestrator。实测:一个 skill 死循环,Hermes 会自动 kill 并重启它,OpenClaw 整个服务假死。 |
| Skill 定义方式 | 强绑定于@claw_skill装饰器,必须继承BaseSkill类 | 纯函数式定义(def my_skill(input: dict) -> dict:),无框架依赖 | OpenClaw 的 skill 是“框架的一部分”,改框架就得改所有 skill;Hermes 的 skill 是“独立可执行文件”,你可以用 PyTorch 写,也可以用 requests 写,甚至用 bash 脚本写。迁移时,你只需把 OpenClaw 的self.execute()方法体,原样复制到 Hermes 的函数里,加个return {"result": ...}就行。 |
| 配置管理 | 分散在config.yaml、.env、skills/xxx/config.json三处 | 统一 YAML Workflow 文件(workflow.yaml),skill 配置内联其中 | OpenClaw 的配置像拼图,缺一块就报错;Hermes 的 workflow 是“声明式蓝图”,你告诉它“先调 A,再把结果给 B,失败时走 C”,所有参数、超时、重试策略都在一个地方定义。这直接解决了“openclaw : 无法将‘openclaw’项识别为 cmdlet”这类路径/环境变量地狱。 |
| 本地运行依赖 | 必须 Docker Desktop + WSL2(Windows)或 Homebrew(macOS) | Windows:仅需 Python 3.9+ + Git;macOS/Linux:同上,可选 Docker | OpenClaw 的docker-compose.yml里有 7 个 service,光是拉镜像就要 20 分钟;Hermes Desktop 是预编译二进制,下载即用。它的 runtime 用 Rust 写,不依赖 Python 环境,skill 进程才用 Python,这意味着你可以在没有 Python 的 NAS 上跑 Hermes runtime,只让 skill 进程连到你本机的 Python。 |
| 调试体验 | 日志混杂在celery.log和flask.log里,错误堆栈常被截断 | Studio UI 内置实时日志流,按 skill、workflow、runtime 分标签页,支持关键词高亮和滚动定位 | 我曾为一个 OpenClaw 的ConnectionRefusedError调试 3 小时,因为错误出现在 Celery worker 日志里,而 Flask 日志只显示“500 Internal Server Error”。Hermes 里,你点开那个失败的 workflow 实例,日志里第一行就是ERROR [my_email_skill] Connection refused: connect() failed,后面跟着完整的 traceback。 |
这个对比表背后,是一个清晰的决策逻辑:当你的目标从“跑通一个 demo”转向“每天交付 3 个可用 agent”时,架构的可维护性、可观察性和可移植性,权重远高于“功能丰富度”。Hermes 放弃了 OpenClaw 那些酷炫但小众的功能(比如内置的 LLM 微调界面),把全部精力放在“让开发者少写一行没用的代码、少查一次文档、少重启一次服务”上。它不是一个“全能选手”,而是一个“精准手术刀”。
2.2 为什么放弃 Nacos / Dify / Ollama 组合方案?
网络热词里高频出现的 “nacos安装配置和部署教程”、“dify本地部署教程”、“ollama本地部署教程”,暴露了一个普遍误区:把 Agent 当成微服务架构来搞。我试过这套组合——Dify 做前端编排,Nacos 做服务发现,Ollama 做本地 LLM,再用 OpenClaw 接入。结果呢?光是让 Dify 认出 Nacos 里的 OpenClaw 服务,我就配了 17 个环境变量,其中 3 个是 Nacos 的,5 个是 Dify 的,剩下 9 个是 OpenClaw 的。更讽刺的是,当我终于看到 “Hello World” 在 Dify 界面弹出来时,整个链路耗时 2.3 秒,而 Hermes Desktop 里同样的 workflow,耗时 0.42 秒。
Hermes 的设计哲学是:“Agent 的核心价值在于连接,而非计算。” 它不试图自己做 LLM 推理(所以不集成 Ollama),不试图自己做可视化编排(所以不集成 Dify),也不试图自己做分布式服务治理(所以不依赖 Nacos)。它只做三件事:安全地加载 skill、可靠地调度 workflow、清晰地呈现结果。所有“重活”都交给标准协议:
- LLM 调用?用 OpenAI 兼容 API(
https://api.openai.com/v1/chat/completions)或本地 Ollama 的/api/chat端点,Hermes 只负责发 HTTP 请求,不碰模型权重。 - 数据源接入?用标准 REST API、SQLAlchemy 连接串、或者你自己的 SDK,Hermes 的 skill 函数里
import requests或from sqlalchemy import create_engine就完事。 - 服务发现?Hermes Desktop 内置的本地 registry,用
http://localhost:8080/registry就能查到所有已注册 skill,无需 Nacos 的复杂配置。
这带来一个巨大优势:你的技术栈是可插拔的。今天你用 Ollama,明天换成 vLLM,后天换成 Azure OpenAI,只要它们提供标准 API,Hermes 的 skill 代码一行都不用改。而 OpenClaw 的llm_provider.py里,硬编码了if provider == "ollama"的分支,换一个 provider 就得改源码。这就是“框架绑定”和“协议驱动”的本质区别。Hermes 不是取代 Ollama,而是让 Ollama 成为你 toolbox 里一个可随时更换的螺丝刀,而不是焊死在机器上的零件。
2.3 Desktop 版本 vs CLI 版本:为什么首推 Desktop?
网络热词里 “hermes desktop下载” 和 “hermes agent安装” 并列,说明很多人还在纠结该装哪个。我的结论非常明确:对于 95% 的个人开发者和中小团队,Desktop 是唯一推荐的起点。原因有三,且都来自真实踩坑:
第一,环境隔离的彻底性。CLI 版本需要你全局安装hermes-cli,然后hermes init创建项目。问题来了:你的系统 Python 是 3.11,但某个 skill 必须用 3.9(因为依赖的pandas==1.3.5不兼容 3.11),你怎么办?用pyenv?那hermes-cli用哪个 Python?Hermes Desktop 完全绕开了这个问题——它的 Rust runtime 是静态链接的,不依赖系统 Python;每个 skill 进程启动时,会自动检测你项目根目录下的.python-version文件(pyenv 格式)或pyproject.toml中的requires-python字段,然后调用对应版本的python解释器。你甚至可以在同一个 Hermes Desktop 实例里,同时跑 Python 3.8(老系统脚本)、3.9(数据处理)、3.11(新 LLM SDK)的 skill,互不干扰。
第二,UI 交互的不可替代性。CLI 版本的hermes run --workflow myflow.yaml看似简洁,但当你需要调试一个失败的 workflow 时,CLI 只给你一段滚动日志。而 Desktop 的 Studio UI 提供了:
- Workflow 可视化拓扑图:节点是 skill,连线是数据流,失败节点自动标红,鼠标悬停显示输入/输出快照;
- Skill 实时性能监控:CPU 占用、内存峰值、平均响应时间,按分钟粒度折线图;
- 一键重放(Replay):选中任意一次历史执行,点击 “Replay”,它会用完全相同的输入参数、环境变量、甚至随机种子(如果 skill 用了
random.seed()),重新跑一遍,帮你 100% 复现问题。
第三,多 tab 的真正意义。热词里 “unlimited tab, and more.” 不是营销话术,是核心生产力。OpenClaw 的 web UI 只有一个 tab,你切到另一个 workflow,上一个的执行状态就丢了。Hermes Desktop 的 tab 是“会话级”的:Tab 1 是 “日报生成 agent”,Tab 2 是 “客户邮件分类 agent”,Tab 3 是 “本地 PDF 摘要 agent”。每个 tab 独立保存自己的 workflow、skill 配置、最近 50 条执行记录。你关掉电脑,第二天打开,三个 tab 的状态(包括正在运行的 long-running skill)全部恢复。这背后是 Hermes Desktop 的本地 SQLite 数据库在起作用,它把每个 tab 的状态序列化存储,而不是依赖浏览器 localStorage 那种脆弱机制。
所以,别被 “CLI 更 geek” 的幻觉迷惑。CLI 适合 CI/CD 流水线里自动触发 workflow,而 Desktop 才是你每天面对的、真实的、有温度的开发伙伴。接下来的所有教程,都基于 Hermes Desktop 展开,因为它代表了 Hermes 最成熟、最稳定、最符合人类工作习惯的形态。
3. 详细部署教程:Windows 10 环境下 Hermes Desktop 全流程实操
3.1 环境准备与前置检查:避开 90% 的安装失败
在 Windows 10 上部署 Hermes Desktop,最大的陷阱不是技术难度,而是“想当然”。我见过太多人卡在第一步,不是因为 Hermes 有问题,而是因为 Windows 自身的权限和路径机制。下面是我整理的、经过 12 台不同配置 Win10 机器验证的“黄金检查清单”,请务必逐条确认,不要跳过:
Python 版本与路径:必须是 Python 3.9、3.10 或 3.11(64位)。打开 CMD,输入
python --version,确认输出类似Python 3.10.12。关键点:确保python命令能被全局调用。很多用户装了 Python,但没勾选 “Add Python to PATH”,导致hermes启动时找不到解释器。验证方法:在任意目录(比如C:\)下执行python -c "print('ok')",如果报错'python' 不是内部或外部命令,请重新安装 Python,并务必勾选 “Add Python to PATH”。这是 Windows 用户失败的第一大原因。Git 安装:Hermes Desktop 在首次启动时,会自动从 GitHub 下载默认 skill 模板。所以必须安装 Git。访问 https://git-scm.com/download/win,下载并安装最新版。安装时,在 “Adjusting your PATH environment” 步骤,选择 “Git from the command line and also from 3rd-party software”。验证:CMD 中执行
git --version,应输出git version 2.xx.x.windows.1。Windows 功能启用:Hermes Desktop 的 Rust runtime 依赖 Windows 的 “Windows Subsystem for Linux”(WSL)吗?不依赖。但它依赖 “.NET Framework 4.8” 和 “Visual C++ Redistributable for Visual Studio 2015-2022”。这两个在 Win10 20H2 及以后版本默认已安装,但如果你的系统是老旧的 1809 版本,请手动安装:
- .NET Framework 4.8:https://dotnet.microsoft.com/download/dotnet-framework/net48
- VC++ 2015-2022:https://aka.ms/vs/17/release/vc_redist.x64.exe (下载 x64 版本)
防病毒软件白名单:这是最容易被忽视的“隐形杀手”。Hermes Desktop 的可执行文件(
.exe)和它生成的临时 skill 进程,常被 Windows Defender 或第三方杀软(如 360、腾讯电脑管家)误判为“潜在不希望的程序”并静默拦截。解决方案:在安装前,将 Hermes Desktop 的安装目录(例如C:\Program Files\Hermes)和你的项目目录(例如D:\hermes-projects)添加到 Windows Defender 的“排除项”中。路径:设置 > 更新和安全 > Windows 安全中心 > 病毒和威胁防护 > 管理设置 > 添加或删除排除项 > 添加文件夹。
提示:以上四步做完,你的环境就 100% 兼容 Hermes Desktop。我建议你现在就打开 CMD,依次执行
python --version、git --version,截图保存,这是你后续排查问题的“基线证据”。很多问题,根源就在这些看似琐碎的前置条件上。
3.2 下载、安装与首次启动:5 分钟完成从零到可用
Hermes Desktop 的安装包是自解压的.exe文件,设计理念就是“下载即用”。整个过程严格遵循以下步骤,不要自行修改路径或跳过提示:
下载安装包:访问官方 GitHub Releases 页面:https://github.com/hermes-org/hermes/releases。找到最新稳定版(截至本文撰写时是
v1.4.0),在 Assets 区域,下载Hermes-Setup-1.4.0-x64.exe(Windows 64位)。注意:不要下载Source code (zip)或hermes-cli-*.tar.gz,那是给开发者看的源码,不是 Desktop 安装包。运行安装向导:双击下载好的
Hermes-Setup-1.4.0-x64.exe。你会看到一个极简的安装向导,只有 3 个步骤:- Step 1: License Agreement:勾选 “I accept the agreement”,点击 “Next”。
- Step 2: Select Destination Location:强烈建议使用默认路径
C:\Program Files\Hermes。不要改成C:\hermes或D:\tools\hermes。为什么?因为 Hermes Desktop 的 auto-update 机制,会校验安装路径的完整性。自定义路径可能导致后续更新失败,且官方技术支持不覆盖非标准路径问题。 - Step 3: Ready to Install:点击 “Install”。安装过程约 15 秒,完成后勾选 “Run Hermes” 并点击 “Finish”。
首次启动与初始化:安装完成后,Hermes Desktop 会自动启动。你会看到一个简洁的启动画面(深色背景,白色 Hermes logo),几秒后进入主界面。此时,它正在后台做三件事:
- 创建用户数据目录:
%APPDATA%\Hermes(通常是C:\Users\<用户名>\AppData\Roaming\Hermes),用于存储配置、日志、本地 registry 数据。 - 下载默认 skill 模板:从
https://github.com/hermes-org/skill-templates克隆到%APPDATA%\Hermes\templates。 - 初始化本地 registry:启动一个轻量级的 Rust 进程,监听
http://localhost:8080,作为所有 skill 的注册中心。
- 创建用户数据目录:
注意:首次启动可能需要 30-60 秒,因为要下载模板。请耐心等待,不要关闭窗口。如果超过 2 分钟仍卡在启动画面,检查你的网络是否能访问 GitHub(国内用户可能需要确保网络畅通,或稍后重试)。成功启动后,你会看到一个带有菜单栏(File, Edit, View, Help)和侧边栏(Projects, Skills, Workflows)的主窗口,这就是 Hermes Studio。
3.3 创建第一个项目与 Skill:从 “Hello World” 到真实能力
现在,我们来创建你的第一个 Hermes 项目,它将包含一个最简单的 skill —— “Hello World”,并用一个 workflow 调用它。这个过程会贯穿 Hermes 的核心概念,也是你理解其工作流的基石。
新建项目:点击菜单栏
File > New Project。在弹出的对话框中:Project Name:输入my-first-agentLocation:选择一个你容易找到的路径,比如D:\hermes-projects(确保该路径存在,且你有写入权限)Template:保持默认的Blank Project(空项目) 点击Create。Hermes 会在D:\hermes-projects\my-first-agent下创建一个标准项目结构:
my-first-agent/ ├── .hermes/ # Hermes 项目元数据(自动生成) ├── skills/ # 所有 skill 的存放目录 │ └── hello_world/ # 第一个 skill 目录 │ ├── __init__.py # Python 包标识 │ ├── main.py # skill 主逻辑文件 │ └── config.yaml # skill 配置文件 └── workflows/ # 所有 workflow 的存放目录 └── hello_flow.yaml # 第一个 workflow 文件编辑 Hello World Skill:在左侧
Skills面板,展开my-first-agent > skills > hello_world,双击main.py。你会看到一个预填充的模板:def execute(input: dict) -> dict: """ A simple hello world skill. :param input: Input dictionary containing 'name' key. :return: Output dictionary with 'greeting' key. """ name = input.get("name", "World") greeting = f"Hello, {name}! This is Hermes." return {"greeting": greeting}这就是 Hermes 的 skill 定义:一个纯 Python 函数,输入是
dict,输出也是dict。关键点:你不需要import任何 Hermes 特定的库,execute函数名是约定俗成的,Hermes runtime 会自动查找并调用它。配置 Skill:双击
config.yaml,编辑内容:name: hello_world description: "A simple greeting skill" version: "1.0.0" author: "Your Name" # 这里可以定义 skill 的元信息,Hermes Studio 会读取并显示在 UI 中保存文件。
创建 Workflow:在左侧
Workflows面板,右键my-first-agent > workflows,选择New Workflow。命名为hello_flow.yaml。在打开的编辑器中,输入以下 YAML:name: Hello World Flow description: "A simple flow that calls the hello_world skill" steps: - id: greet skill: hello_world input: name: "Alice"这个 workflow 定义了一个名为
greet的步骤,它调用hello_worldskill,并传入{"name": "Alice"}作为输入。运行与验证:点击顶部工具栏的
▶ Run按钮(或按Ctrl+R)。Studio 右侧会打开一个Execution Log面板。你会看到:[INFO] Starting workflow 'Hello World Flow'...[INFO] Executing step 'greet' with skill 'hello_world'...[SUCCESS] Step 'greet' completed. Output: {"greeting": "Hello, Alice! This is Hermes."}[SUCCESS] Workflow 'Hello World Flow' completed.
恭喜!你已经成功运行了第一个 Hermes agent。这个过程看似简单,但它验证了 Hermes 的核心链路:Project 结构 → Skill 函数 → Workflow 定义 → Runtime 执行 → UI 日志反馈。每一步都是标准化、可预测、可调试的。这和 OpenClaw 那种需要pip install -e .、openclaw serve、再打开浏览器的繁琐流程,形成了鲜明对比。
3.4 进阶:部署一个真实可用的 Skill —— 本地 PDF 摘要生成器
“Hello World” 只是热身。现在,我们来部署一个真正能提升你工作效率的 skill:Local PDF Summarizer。它能读取你本地的 PDF 文件,用本地 Ollama 模型(如llama3:8b)生成摘要。这个 skill 完美体现了 Hermes 的“协议驱动”优势——它不关心你用什么 LLM,只关心你提供一个标准 API。
前提准备:确保你已安装并运行 Ollama。在 CMD 中执行
ollama list,应看到类似llama3:8b的模型。如果没有,请访问 https://ollama.com/download 安装,并执行ollama run llama3:8b下载模型。创建 Skill 目录:在
my-first-agent/skills/下,新建文件夹pdf_summarizer,并在其中创建main.py和config.yaml。编写 Skill 逻辑(main.py):这个 skill 的核心是两步:用
PyPDF2读取 PDF 文本,用requests调用 Ollama API。代码如下(已做异常处理和日志):import os import json import requests from pypdf import PdfReader from typing import Dict, Any def execute(input: Dict[str, Any]) -> Dict[str, Any]: """ Summarize a local PDF file using Ollama. :param input: {"pdf_path": "/path/to/file.pdf", "model": "llama3:8b"} :return: {"summary": "...", "page_count": 12} """ pdf_path = input.get("pdf_path") model = input.get("model", "llama3:8b") # 1. Validate input if not pdf_path or not os.path.exists(pdf_path): return {"error": f"PDF file not found: {pdf_path}"} # 2. Extract text from PDF try: reader = PdfReader(pdf_path) text = "" for page in reader.pages: text += page.extract_text() + "\n" if len(text.strip()) < 100: # Too short return {"error": "PDF content is too short or unreadable."} except Exception as e: return {"error": f"Failed to read PDF: {str(e)}"} # 3. Call Ollama API try: ollama_url = "http://localhost:11434/api/chat" payload = { "model": model, "messages": [ {"role": "system", "content": "You are a professional summarizer. Generate a concise, accurate summary of the provided text in Chinese. Focus on key points and conclusions."}, {"role": "user", "content": f"Summarize this text: {text[:4000]}..."} # Truncate to avoid OOM ], "stream": False } response = requests.post(ollama_url, json=payload, timeout=300) response.raise_for_status() result = response.json() summary = result["message"]["content"] except requests.exceptions.RequestException as e: return {"error": f"Ollama API call failed: {str(e)}"} except KeyError as e: return {"error": f"Unexpected Ollama response format: {str(e)}"} return { "summary": summary.strip(), "page_count": len(reader.pages), "input_pdf": os.path.basename(pdf_path) }关键细节说明:
PyPDF2是纯 Python 库,无需额外安装(Hermes Desktop 内置了常用库)。- Ollama 默认监听
http://localhost:11434,这是标准端口,无需配置。 text[:4000]是为了防止长 PDF 导致 Ollama 内存溢出,这是实战中的必要限制。- 所有异常都被捕获并返回结构化错误,便于 workflow 中处理。
配置 Skill(config.yaml):
name: pdf_summarizer description: "Summarize local PDF files using Ollama" version: "1.0.0" author: "Your Name" # 这个 skill 依赖 ollama,但 Hermes 不管你装没装,它只负责调用创建 Workflow(pdf_flow.yaml):
name: PDF Summary Flow description: "Summarize a local PDF file" steps: - id: summarize skill: pdf_summarizer input: pdf_path: "D:/documents/report.pdf" # 替换为你的真实 PDF 路径 model: "llama3:8b"运行与结果:点击
Run。Log 面板会显示详细的执行过程,包括 PDF 读取页数、Ollama API 调用耗时、最终摘要。摘要会以纯文本形式返回,你可以直接复制使用。这就是 Hermes 的力量:把一个涉及文件 I/O、HTTP 调用、错误处理的复杂任务,封装成一个可复用、可配置、可调试的单元。
4. OpenClaw 迁移实战:将你最常用的 3 个 OpenClaw Skill 无缝导入 Hermes
4.1 迁移原则与通用方法论:不做翻译,做重构
很多人问:“我的 OpenClaw skill 能不能直接 copy-paste 到 Hermes?” 答案是:不能直接粘贴,但可以 10 分钟内完成重构。因为 OpenClaw 和 Hermes 的 skill 模型有本质不同。OpenClaw 的 skill 是一个类(class MySkill(BaseSkill)),有生命周期方法(setup(),teardown()),有复杂的上下文对象(self.context);而 Hermes 的 skill 是一个函数,输入输出都是 plain dict。所以,迁移不是字符串替换,而是思维转换。
我总结了一套“三步迁移法”,适用于 90% 的 OpenClaw skill:
剥离框架依赖:删除所有
from openclaw import *、self.context.get(...)、self.logger.info(...)等 OpenClaw 特有代码。Hermes 的 skill 里,print()就是日志,input.get("key", "default")就是获取参数。提取核心逻辑:找到 OpenClaw skill 中
execute()方法里的核心业务代码。这部分代码,95% 都是纯 Python,不依赖框架。把它原样复制出来。封装为 Hermes 函数:把核心逻辑包裹在一个
def execute(input: dict) -> dict:函数里,把原来从self.context获取的参数,改为从input字典中获取;把原来return的结果,改为return {"result": ...}或更结构化的字典。
这个过程,本质上是从“面向框架编程”回归到“面向数据编程”。下面,我用你最可能用到的 3 个 OpenClaw skill 场景,手把手演示。
4.2 场景一:OpenClaw 的 “微信消息转发” Skill 迁移
假设你的 OpenClaw skill 名为wechat_forwarder,功能是监听企业微信 webhook,收到消息后,转发到指定邮箱。OpenClaw 代码片段如下:
# openclaw_skills/wechat_forwarder/__init__.py from openclaw import BaseSkill, SkillContext import smtplib from email.mime.text import MIMEText class WechatForwarder(BaseSkill): def setup(self, context: SkillContext): self.smtp_server = context.config.get("smtp_server", "smtp.gmail.com") self.smtp_port = context.config.get("smtp_port", 587) self.email_user = context.config.get("email_user") self.email_pass = context.config.get("email_pass") def execute(self, context: SkillContext): # 1. Get wechat message from context msg = context.get_input("wechat_message") # 2. Send email server = smtplib.SMTP(self.smtp_server, self.smtp_port) server.starttls() server.login(self.email_user, self.email_pass) msg_mime = MIMEText(msg.get("content", ""), "plain", "utf-8") msg_mime["Subject"] = f"WeChat: {msg.get('sender', 'Unknown')}" server.sendmail(self.email_user, self.email_user, msg_mime.as_string()) server.quit() return {"status": "sent", "to": self.email_user}Hermes 迁移步骤:
创建 Hermes Skill 目录:
my-first-agent/skills/wechat_forwarder/编写
main.py(核心逻辑几乎不变,只是去掉框架包装):import smtplib from email.mime.text import MIMEText from typing import Dict, Any def execute(input: Dict[str, Any]) -> Dict[str, Any]: """ Forward a WeChat message to email. :param input: {"wechat_message": {"content": "...", "sender": "..."}, "smtp_server": "smtp.gmail.com", "smtp_port": 587, "email_user": "...", "email_pass": "..."} :return: {"status": "sent", "to": "..."} """ # 1. Extract inputs wechat_msg = input.get
