Skip to main content

从 OpenClaw 迁移

本文将为您提供从 OpenClawClawdbot 平台完整迁移到 Hermes Agent 的详细步骤。涵盖数据迁移范围、配置文件映射方法,以及迁移完成后必须执行的验证与检查流程。

📌 一、迁移概览

项目OpenClaw / ClawdbotHermes Agent
核心架构基于 Python + Discord/Telegram 等 Bot 框架基于 MCP(Model Control Protocol)+ 多 Agent 协作系统
配置管理YAML/JSON 文件 + 环境变量config.yaml + env 文件 + CLI/HTTP API
数据存储SQLite / MongoDB / 自定义数据库支持 PostgreSQL / MySQL / SQLite / Redis(可选)
插件机制内置插件 + 手动脚本扩展Agent Skills + Plugin Registry(如 agentskills.io)
多平台支持有限(主要限于 Telegram/Discord)全面支持:Telegram, Discord, Slack, WhatsApp, Signal, Matrix, Mattermost, DingTalk, Feishu, WeCom 等

结论:Hermes Agent 是下一代 AI Agent 架构,具备更强的可扩展性、模块化设计和跨平台能力。


🔄 二、哪些内容会被迁移?

✅ 可迁移内容(自动或半自动)

类型是否支持迁移说明
用户权限列表(角色/权限组)映射为 Hermes Agent 中的 rolespermissions
聊天历史记录(部分)⚠️ 有条件支持若使用兼容数据库(如 PostgreSQL),可通过脚本导出并导入到 Hermes 的 chat_history 表中
自定义命令(Command Handlers)转换为 Hermes Agent 的 SkillAction 插件
机器人行为规则(如触发词、响应逻辑)通过 rules.json 导入至 Hermes 的 rule_engine 模块
Webhook 配置迁移为 Hermes 的 webhook_handler 配置项
通知模板(邮件/SMS/消息模板)转换为 Hermes 的 template 模板系统
任务调度(Cron Jobs)使用 Hermes 的 scheduler 模块重新配置

❌ 不支持直接迁移的内容

类型原因替代方案
旧版自定义 Python 脚本(非标准插件)架构不兼容重写为符合 Hermes Skill 规范的 .py 插件
本地缓存文件(如 cache.db, temp/无结构化定义清理或重建
未文档化的私有功能模块缺乏接口描述评估是否必要,否则建议弃用

🔧 三、配置映射表(Config Mapping)

以下为关键配置项的迁移对照表:

OpenClaw / Clawdbot 配置项Hermes Agent 对应项迁移方式
bot_tokenagent.bot.token直接复制
admin_idsagent.security.admins列表格式转换
database_urlstorage.database.url更新连接字符串(支持 PostgreSQL/MySQL)
plugins.enabledskills.enabled逐个启用对应 Skill
command_prefixagent.command.prefix修改为新前缀
webhook_urlwebhook.endpoint配置 HTTPS 地址
languageagent.localezh-CN, en-US
log_levellogging.levelinfo, debug, warn
api_key (OpenAI etc.)providers.openai.api_keyenv 文件中设置
model.defaultagent.default_modelgpt-4o, claude-3-opus
max_context_lengthagent.max_tokens调整数值

💡 提示:推荐使用 hermes-migrate-tool 工具(GitHub)自动化生成初始 config.yaml


🛠 四、迁移步骤详解

步骤 1:备份原始环境

# 备份数据库
cp ./clawdb.sqlite ./backup/clawdb_$(date +%Y%m%d).sqlite

# 备份配置文件
cp config.yaml config_backup.yaml
cp plugins/*.py ./backup/plugins/

步骤 2:安装 Hermes Agent

git clone https://github.com/hermes-agent/hermes-agent.git
cd hermes-agent
pip install -r requirements.txt

步骤 3:创建新配置

# config.yaml
agent:
name: "MyHermesBot"
token: "YOUR_SECRET_TOKEN"
prefix: "/"
locale: "zh-CN"
default_model: "gpt-4o"
max_tokens: 4096

security:
admins:
- 123456789
- 987654321

storage:
database:
url: "postgresql://user:pass@localhost/hermes_db"
cache: "redis://localhost:6379"

providers:
openai:
api_key: "YOUR_OPENAI_API_KEY"
openrouter:
api_key: "YOUR_OPENROUTER_API_KEY"
nous:
api_key: "YOUR_NOUS_API_KEY"

skills:
enabled:
- chat
- weather
- calculator
- file_upload
- rule_engine

📝 注意:请将示例占位值替换为实际密钥,避免泄露。

步骤 4:迁移自定义技能

将原有 plugins/*.py 中的函数封装为 Hermes Skill:

# skills/weather.py
from hermes_agent import Skill

class WeatherSkill(Skill):
def __init__(self):
super().__init__("weather", "获取天气信息")

async def handle(self, query: str) -> str:
# 替换为真实 API 调用
return f"当前天气:晴朗,温度 25°C"

注册到 skills/ 目录,并在 config.yaml 中启用。

步骤 5:启动 Hermes Agent

python main.py --config config.yaml

✅ 五、迁移后必查清单(Post-Migration Checklist)

检查项是否完成说明
✅ 机器人成功启动并登录查看日志输出是否有 Bot is online
✅ 所有管理员账号可访问控制台测试 /admin 命令
✅ 自定义命令正常响应输入 /help/weather 北京
✅ 通知模板已生效触发事件测试邮件/SMS/消息推送
✅ Webhook 接收测试成功使用 curl 发送模拟请求
✅ 数据库连接正常查看 logs/db.log 是否报错
✅ 日志级别正确确保生产环境为 info
✅ 安全密钥已移除明文检查 config.yaml 是否包含硬编码密钥
✅ 多平台消息通道可用测试 Telegram/Discord 消息收发
✅ 任务调度器运行正常查看定时任务是否按计划执行

📚 六、进阶建议

  1. 启用身份认证
    使用 JWT 或 OAuth2 保护 Admin API,防止未授权访问。

  2. 集成监控系统
    推荐接入 Prometheus + Grafana,监控模型调用延迟、错误率等指标。

  3. 使用 AgentSkills.io 注册你的 Skill
    让社区共享你的插件:👉 https://agentskills.io

  4. 启用模型路由策略
    根据负载自动切换模型(如低优先级用 gpt-3.5-turbo,高精度用 gpt-4o)。

  5. 定期审计权限与日志
    使用 hermes audit 命令分析用户行为与操作记录。


📞 七、遇到问题?如何求助


🎯 总结

项目结果
是否能完全迁移?✅ 可实现大部分功能平滑过渡
是否需要重写代码?⚠️ 自定义插件需重构为 Skill 格式
是否更强大?✅ 支持多 Agent、跨平台、可扩展性强
是否推荐迁移?✅ 强烈推荐!Hermes Agent 是未来方向

🚀 立即行动:现在就用 hermes-migrate-tool 开始迁移,体验下一代 AI Agent 的强大能力!


📌 附录


从 OpenClaw 迁移

hermes claw migrate 会将你的 OpenClaw(或旧版 Clawdbot/Moldbot)设置导入到 Hermes。本指南详细说明了迁移内容、配置键映射关系,以及迁移后需要验证的事项。

快速开始

# Preview what would happen (no files changed)
hermes claw migrate --dry-run

# Run the migration (secrets excluded by default)
hermes claw migrate

# Full migration including API keys
hermes claw migrate --preset full

迁移默认读取 ~/.openclaw/。如果你仍保留旧版 ~/.clawdbot/~/.moldbot/ 目录,系统会自动检测。同样地,对于旧版配置文件名(clawdbot.jsonmoldbot.json)也会自动识别。

选项

选项描述
--dry-run预览将要迁移的内容,但不写入任何数据。
--preset <name>full(默认,包含密钥)或 user-data(不包含 API 密钥)。
--overwrite在发生冲突时覆盖现有的 Hermes 文件(默认:跳过)。
--migrate-secrets包含 API 密钥(在启用 --preset full 时默认开启)。
--source <path>自定义 OpenClaw 目录路径。
--workspace-target <path>指定 AGENTS.md 的存放位置。
--skill-conflict <mode>skip(默认)、overwriterename
--yes跳过确认提示。

迁移内容

人物设定、记忆与指令

内容OpenClaw 来源Hermes 目标位置说明
人物设定workspace/SOUL.md~/.hermes/SOUL.md直接复制
工作区指令workspace/AGENTS.mdAGENTS.md 中的 --workspace-target需要启用 --workspace-target 标志
长期记忆workspace/MEMORY.md~/.hermes/memories/MEMORY.md解析为条目,与现有内容合并并去重。使用 § 作为分隔符。
用户资料workspace/USER.md~/.hermes/memories/USER.md与记忆相同的条目合并逻辑。
每日记忆文件workspace/memory/*.md~/.hermes/memories/MEMORY.md所有每日文件合并至主记忆中。

所有工作区文件还会检查 workspace.default/ 作为备用路径。

技能(4 种来源)

来源OpenClaw 位置Hermes 目标位置
工作区技能workspace/skills/~/.hermes/skills/openclaw-imports/
管理/共享技能~/.openclaw/skills/~/.hermes/skills/openclaw-imports/
个人跨项目技能~/.agents/skills/~/.hermes/skills/openclaw-imports/
项目级共享技能workspace/.agents/skills/~/.hermes/skills/openclaw-imports/

技能冲突处理方式由 --skill-conflict 决定:skip 保留现有 Hermes 技能,overwrite 替换它,rename 创建一个 -imported 副本。

模型与提供方配置

内容OpenClaw 配置路径Hermes 目标位置说明
默认模型agents.defaults.modelconfig.yamlmodel可为字符串或 {primary, fallbacks} 对象
自定义提供方models.providers.*config.yamlcustom_providers映射 baseUrlapiType(如 "openai"→"chat_completions","anthropic"→"anthropic_messages")
提供方 API 密钥models.providers.*.apiKey~/.hermes/.env需要 --migrate-secrets。详见下方 API 密钥解析

代理行为

内容OpenClaw 配置路径Hermes 配置路径映射关系
最大轮次agents.defaults.timeoutSecondsagent.max_turnstimeoutSeconds / 10,上限为 200
详细模式agents.defaults.verboseDefaultagent.verbose"off" / "on" / "full"
推理努力程度agents.defaults.thinkingDefaultagent.reasoning_effort"always"/"high" → "high","auto"/"medium" → "medium","off"/"low"/"none"/"minimal" → "low"
压缩功能agents.defaults.compaction.modecompression.enabled"off" → false,其他值 → true
压缩模型agents.defaults.compaction.modelcompression.summary_model直接字符串复制
人类延迟agents.defaults.humanDelay.modehuman_delay.mode"natural" / "custom" / "off"
人类延迟时间agents.defaults.humanDelay.minMs / .maxMshuman_delay.min_ms / .max_ms直接复制
时区agents.defaults.userTimezonetimezone直接字符串复制
执行超时tools.exec.timeoutSecterminal.timeout直接复制(字段为 timeoutSec,而非 timeout
Docker沙箱agents.defaults.sandbox.backendterminal.backend"docker" → "docker"
Docker 镜像agents.defaults.sandbox.docker.imageterminal.docker_image直接复制

会话重置策略

OpenClaw 配置路径Hermes 配置路径说明
session.reset.modesession_reset.mode"daily"、"idle" 或两者皆有
session.reset.atHoursession_reset.at_hour每日重置的时间(0–23 小时)
session.reset.idleMinutessession_reset.idle_minutes无操作分钟数

注意:OpenClaw 还有 session.resetTriggers(一个简单的字符串数组,例如 ["daily", "idle"])。如果未找到结构化 session.reset,迁移将回退至从 resetTriggers 推断。

MCP 服务器

OpenClaw 字段Hermes 字段说明
mcp.servers.*.commandmcp_servers.*.command标准输入输出传输
mcp.servers.*.argsmcp_servers.*.args
mcp.servers.*.envmcp_servers.*.env
mcp.servers.*.cwdmcp_servers.*.cwd
mcp.servers.*.urlmcp_servers.*.urlHTTP/SSE 传输
mcp.servers.*.tools.includemcp_servers.*.tools.include工具过滤
mcp.servers.*.tools.excludemcp_servers.*.tools.exclude

TTS(文本转语音)

TTS 设置从 两个 OpenClaw 配置位置读取,优先级如下:

  1. messages.tts.providers.{provider}.*(标准位置)
  2. 顶层 talk.providers.{provider}.*(备用位置)
  3. 旧版扁平键 messages.tts.{provider}.*(最老格式)
内容Hermes 目标位置
提供方名称config.yamltts.provider
ElevenLabs 语音 IDconfig.yamltts.elevenlabs.voice_id
ElevenLabs 模型 IDconfig.yamltts.elevenlabs.model_id
OpenAI 模型config.yamltts.openai.model
OpenAI 语音config.yamltts.openai.voice
Edge TTS 语音config.yamltts.edge.voice
TTS 资源文件~/.hermes/tts/(文件复制)

消息平台

平台OpenClaw 配置路径Hermes .env 变量说明
Telegramchannels.telegram.botTokenTELEGRAM_BOT_TOKENToken 可为字符串或 SecretRef
Telegramcredentials/telegram-default-allowFrom.jsonTELEGRAM_ALLOWED_USERSallowFrom[] 数组以逗号连接生成
Discordchannels.discord.tokenDISCORD_BOT_TOKEN
Discordchannels.discord.allowFromDISCORD_ALLOWED_USERS
Slackchannels.slack.botTokenSLACK_BOT_TOKEN
Slackchannels.slack.appTokenSLACK_APP_TOKEN
Slackchannels.slack.allowFromSLACK_ALLOWED_USERS
WhatsAppchannels.whatsapp.allowFromWHATSAPP_ALLOWED_USERS通过 Baileys QR 扫码认证(非 token)
Signalchannels.signal.accountSIGNAL_ACCOUNT
Signalchannels.signal.httpUrlSIGNAL_HTTP_URL
Signalchannels.signal.allowFromSIGNAL_ALLOWED_USERS
Matrixchannels.matrix.botTokenMATRIX_ACCESS_TOKEN通过 deep-channels 迁移实现
Mattermostchannels.mattermost.botTokenMATTERMOST_BOT_TOKEN通过 deep-channels 迁移实现

其他配置

内容OpenClaw 路径Hermes 路径说明
审批模式approvals.exec.modeconfig.yamlapprovals.mode"auto"→"off","always"→"manual","smart"→"smart"
命令允许列表exec-approvals.jsonconfig.yamlcommand_allowlist模式合并并去重
浏览器 CDP URLbrowser.cdpUrlconfig.yamlbrowser.cdp_url
浏览器无头模式browser.headlessconfig.yamlbrowser.headless
Brave 搜索密钥tools.web.search.brave.apiKey.envBRAVE_API_KEY需要 --migrate-secrets
网关认证令牌gateway.auth.token.envHERMES_GATEWAY_TOKEN需要 --migrate-secrets
工作目录agents.defaults.workspace.envMESSAGING_CWD

已归档(无直接对应的 Hermes 功能)

这些内容将被保存至 ~/.hermes/migration/openclaw/<timestamp>/archive/ 以供手动审查:| 项目 | 归档文件 | 如何在 Hermes 中重建 | |------|-------------|--------------------------| | IDENTITY.md | archive/workspace/IDENTITY.md | 合并至 SOUL.md | | TOOLS.md | archive/workspace/TOOLS.md | Hermes 内置工具指令 | | HEARTBEAT.md | archive/workspace/HEARTBEAT.md | 使用定时任务(cron jobs) | | BOOTSTRAP.md | archive/workspace/BOOTSTRAP.md | 使用上下文文件或技能(skills) | | 定时任务(Cron jobs) | archive/cron-config.json | 使用 hermes cron create 重建 | | 插件(Plugins) | archive/plugins-config.json | 参见 插件指南 | | 钩子/回调(Hooks/webhooks) | archive/hooks-config.json | 使用 hermes webhook 或网关钩子 | | 记忆后端(Memory backend) | archive/memory-backend-config.json | 通过 hermes honcho 配置 | | 技能注册表(Skills registry) | archive/skills-registry-config.json | 使用 hermes skills config | | 用户界面/身份标识(UI/identity) | archive/ui-identity-config.json | 使用 /skin 命令 | | 日志记录(Logging) | archive/logging-diagnostics-config.json | 在 config.yaml 的日志配置部分设置 | | 多代理列表(Multi-agent list) | archive/agents-list.json | 使用 Hermes 配置文件 | | 通道绑定(Channel bindings) | archive/bindings.json | 按平台手动设置 | | 复杂通道(Complex channels) | archive/channels-deep-config.json | 手动进行平台配置 |

API 密钥解析

--migrate-secrets 启用时,API 密钥将按优先级从 三个来源 获取:

  1. 配置值models.providers.*.apiKey 和 TTS 提供商密钥位于 openclaw.json
  2. 环境文件~/.openclaw/.env(如 OPENROUTER_API_KEYANTHROPIC_API_KEY 等密钥)
  3. 认证配置文件~/.openclaw/agents/main/agent/auth-profiles.json(每个代理的独立凭证)

配置值具有最高优先级。.env 用于补充缺失项。认证配置文件则填充剩余空白。

支持的密钥目标

OPENROUTER_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY, ELEVENLABS_API_KEY, TELEGRAM_BOT_TOKEN, VOICE_TOOLS_OPENAI_KEY

不在允许列表中的密钥将不会被复制。

SecretRef 处理

OpenClaw 配置中关于令牌和 API 密钥的值可采用三种格式:

// Plain string
"channels": { "telegram": { "botToken": "123456:ABC-DEF..." } }

// Environment template
"channels": { "telegram": { "botToken": "${TELEGRAM_BOT_TOKEN}" } }

// SecretRef object
"channels": { "telegram": { "botToken": { "source": "env", "id": "TELEGRAM_BOT_TOKEN" } } }

迁移过程会处理所有三种格式。对于包含 source: "env" 的环境模板和 SecretRef 对象,系统会从 ~/.openclaw/.env 中查找对应值。而使用 source: "file"source: "exec" 的 SecretRef 对象无法自动解析——这些值必须在迁移完成后手动添加至 Hermes。

迁移后操作

  1. 检查迁移报告 —— 迁移完成时打印,包含已迁移、跳过及冲突项的数量统计。

  2. 审查归档文件 —— 任何位于 ~/.hermes/migration/openclaw/<timestamp>/archive/ 中的内容需手动处理。

  3. 验证 API 密钥 —— 运行 hermes status 以检查各提供方的身份验证状态。

  4. 测试消息通信 —— 若已迁移平台令牌,请重启网关:systemctl --user restart hermes-gateway

  5. 检查会话策略 —— 确认 hermes config get session_reset 是否符合预期。

  6. 重新配对 WhatsApp —— WhatsApp 使用二维码配对(Baileys),不支持令牌迁移。请运行 hermes whatsapp 完成配对。

故障排除

“未找到 OpenClaw 目录”

迁移流程会依次检查 ~/.openclaw/~/.clawdbot/~/.moldbot/。若您的安装路径不同,请使用 --source /path/to/your/openclaw 指定正确路径。

“未找到提供方 API 密钥”

密钥可能位于你的 .env 文件中,而非 openclaw.json。迁移过程会同时检查两者,请确保 ~/.openclaw/.env 存在且包含所需密钥。若密钥使用了 source: "file"source: "exec" 的 SecretRef,将无法自动解析。

迁移后技能未显示

导入的技能将存放在 ~/.hermes/skills/openclaw-imports/。需启动新会话使其生效,或运行 /skills 以确认其已加载。

TTS 语音未迁移成功

OpenClaw 将 TTS 设置存储于两处:messages.tts.providers.* 以及顶层的 talk 配置。迁移过程会检查这两处。若语音 ID 是通过 OpenClaw UI 设置(保存在其他路径),您可能需要手动重新设置:hermes config set tts.elevenlabs.voice_id YOUR_VOICE_ID