从 OpenClaw 迁移
hermes claw migrate 可以把你的 OpenClaw 配置导入 Hermes,也兼容旧版 Clawdbot / Moltbot 目录。本指南会说明哪些内容能自动迁移、配置项如何映射,以及迁移完成后该重点检查什么。
快速开始
# Preview then migrate (always shows a preview first, then asks to confirm)
hermes claw migrate
# Preview only, no changes
hermes claw migrate --dry-run
# Full migration including API keys, skip confirmation
hermes claw migrate --preset full --yes
迁移过程始终会先显示完整的预览,展示即将导入的内容,之后才执行实际操作。请仔细审查列表,确认无误后再继续。
默认读取 ~/.openclaw/ 目录。系统会自动检测旧版 ~/.clawdbot/ 或 ~/.moltbot/ 目录。同样地,旧版配置文件名(clawdbot.json、moltbot.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(默认)、overwrite 或 rename。 |
--yes | 跳过预览后的确认提示。 |
迁移内容
人物设定、记忆与指令
| 内容 | OpenClaw 来源 | Hermes 目标位置 | 说明 |
|---|---|---|---|
| 人物设定 | workspace/SOUL.md | ~/.hermes/SOUL.md | 直接复制 |
| 工作区指令 | workspace/AGENTS.md | AGENTS.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/ 和 workspace-main/ 路径下检查作为备用路径(OpenClaw 在近期版本中将 workspace/ 重命名为 workspace-main/,并使用 workspace-{agentId} 用于多代理设置)。
技能(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.model | config.yaml → model | 可为字符串或 {primary, fallbacks} 对象 |
| 自定义提供者 | models.providers.* | config.yaml → custom_providers | 映射 baseUrl、apiType/api —— 支持短名称(如 "openai"、"anthropic")和连字符形式(如 "openai-completions"、"anthropic-messages"、"google-generative-ai") |
| 提供者 API 密钥 | models.providers.*.apiKey | ~/.hermes/.env | 需启用 --migrate-secrets。详见下方 API 密钥解析 |
代理行为
| 内容 | OpenClaw 配置路径 | Hermes 配置路径 | 映射规则 |
|---|---|---|---|
| 最大轮次 | agents.defaults.timeoutSeconds | agent.max_turns | timeoutSeconds / 10,上限为 200 |
| 详细模式 | agents.defaults.verboseDefault | agent.verbose | "off" / "on" / "full" |
| 推理努力程度 | agents.defaults.thinkingDefault | agent.reasoning_effort | "always"/"high"/"xhigh" → "high";"auto"/"medium"/"adaptive" → "medium";"off"/"low"/"none"/"minimal" → "low" |
| 压缩功能 | agents.defaults.compaction.mode | compression.enabled | "off" → false,其余值 → true |
| 压缩模型 | agents.defaults.compaction.model | compression.summary_model | 直接复制字符串 |
| 人类延迟 | agents.defaults.humanDelay.mode | human_delay.mode | "natural" / "custom" / "off" |
| 人类延迟时间 | agents.defaults.humanDelay.minMs / .maxMs | human_delay.min_ms / .max_ms | 直接复制 |
| 时区 | agents.defaults.userTimezone | timezone | 直接复制字符串 |
| 执行超时 | tools.exec.timeoutSec | terminal.timeout | 直接复制(字段名为 timeoutSec,而非 timeout) |
| Docker 沙箱 | agents.defaults.sandbox.backend | terminal.backend | "docker" → "docker" |
| Docker 镜像 | agents.defaults.sandbox.docker.image | terminal.docker_image | 直接复制字符串 |
会话重置策略
| OpenClaw 配置路径 | Hermes 配置路径 | 说明 |
|---|---|---|
session.reset.mode | session_reset.mode | "daily"、"idle" 或两者兼有 |
session.reset.atHour | session_reset.at_hour | 每日重置的时间(0–23 小时) |
session.reset.idleMinutes | session_reset.idle_minutes | 闲置分钟数 |
注意:OpenClaw 还支持 session.resetTriggers(一个简单的字符串数组,例如 ["daily", "idle"])。如果未找到结构化的 session.reset,则迁移会回退到从 resetTriggers 推断。
MCP 服务器
| OpenClaw 字段 | Hermes 字段 | 说明 |
|---|---|---|
mcp.servers.*.command | mcp_servers.*.command | 标准输入输出传输 |
mcp.servers.*.args | mcp_servers.*.args | |
mcp.servers.*.env | mcp_servers.*.env | |
mcp.servers.*.cwd | mcp_servers.*.cwd | |
mcp.servers.*.url | mcp_servers.*.url | HTTP/SSE 传输 |
mcp.servers.*.tools.include | mcp_servers.*.tools.include | 工具过滤 |
mcp.servers.*.tools.exclude | mcp_servers.*.tools.exclude |
TTS(文本转语音)
TTS 设置会从 三个 OpenClaw 配置来源读取,优先级如下:
messages.tts.providers.{provider}.*(标准位置)- 顶层
talk.providers.{provider}.*(备用位置) - 旧版扁平键
messages.tts.{provider}.*(最老格式)
| 内容 | Hermes 目标位置 |
|---|---|
| 提供商名称 | config.yaml → tts.provider |
| ElevenLabs 语音 ID | config.yaml → tts.elevenlabs.voice_id |
| ElevenLabs 模型 ID | config.yaml → tts.elevenlabs.model_id |
| OpenAI 模型 | config.yaml → tts.openai.model |
| OpenAI 语音 | config.yaml → tts.openai.voice |
| Edge TTS 语音 | config.yaml → tts.edge.voice(OpenClaw 将 "edge" 重命名为 "microsoft" —— 两者均被识别) |
| TTS 资源文件 | ~/.hermes/tts/(文件复制) |
消息平台
| 平台 | OpenClaw 配置路径 | Hermes .env 变量 | 说明 |
|---|---|---|---|
| Telegram | channels.telegram.botToken 或 .accounts.default.botToken | TELEGRAM_BOT_TOKEN | Token 可为字符串或 SecretRef。支持扁平结构和账户分层结构。 |
| Telegram | credentials/telegram-default-allowFrom.json | TELEGRAM_ALLOWED_USERS | 从 allowFrom[] 数组中以逗号连接 |
| Discord | channels.discord.token 或 .accounts.default.token | DISCORD_BOT_TOKEN | |
| Discord | channels.discord.allowFrom 或 .accounts.default.allowFrom | DISCORD_ALLOWED_USERS | |
| Slack | channels.slack.botToken 或 .accounts.default.botToken | SLACK_BOT_TOKEN | |
| Slack | channels.slack.appToken 或 .accounts.default.appToken | SLACK_APP_TOKEN | |
| Slack | channels.slack.allowFrom 或 .accounts.default.allowFrom | SLACK_ALLOWED_USERS | |
channels.whatsapp.allowFrom 或 .accounts.default.allowFrom | WHATSAPP_ALLOWED_USERS | 通过 Baileys 二维码配对认证 — 迁移后需重新配对 | |
| Signal | channels.signal.account 或 .accounts.default.account | SIGNAL_ACCOUNT | |
| Signal | channels.signal.httpUrl 或 .accounts.default.httpUrl | SIGNAL_HTTP_URL | |
| Signal | channels.signal.allowFrom 或 .accounts.default.allowFrom | SIGNAL_ALLOWED_USERS | |
| Matrix | channels.matrix.accessToken 或 .accounts.default.accessToken | MATRIX_ACCESS_TOKEN | 使用 accessToken(非 botToken) |
| Mattermost | channels.mattermost.botToken 或 .accounts.default.botToken | MATTERMOST_BOT_TOKEN |
其他配置
| 项目 | OpenClaw 路径 | Hermes 路径 | 说明 |
|---|---|---|---|
| 审批模式 | approvals.exec.mode | config.yaml → approvals.mode | "auto"→"off", "always"→"manual", "smart"→"smart" |
| 命令白名单 | exec-approvals.json | config.yaml → command_allowlist | 模式合并并去重 |
| 浏览器 CDP URL | browser.cdpUrl | config.yaml → browser.cdp_url | |
| 浏览器无头模式 | browser.headless | config.yaml → browser.headless | |
| Brave 搜索密钥 | tools.web.search.brave.apiKey | .env → BRAVE_API_KEY | 需要 --migrate-secrets |
| 网关认证令牌 | gateway.auth.token | .env → HERMES_GATEWAY_TOKEN | 需要 --migrate-secrets |
| 工作目录 | agents.defaults.workspace | .env → MESSAGING_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 | 使用上下文文件或技能 |
| 定时任务(cron jobs) | archive/cron-config.json | 使用 hermes cron create 重建 |
| 插件 | archive/plugins-config.json | 参见 构建 Hermes 插件 |
| 钩子/Webhook | archive/hooks-config.json | 使用 hermes webhook 或网关钩子 |
| 记忆后端 | archive/memory-backend-config.json | 通过 hermes honcho 配置 |
| 技能注册表 | archive/skills-registry-config.json | 使用 hermes skills config |
| UI/身份标识 | archive/ui-identity-config.json | 使用 /skin 命令 |
| 日志记录 | archive/logging-diagnostics-config.json | 在 config.yaml 的日志部分设置 |
| 多代理列表 | archive/agents-list.json | 使用 Hermes 配置文件 |
| 通道绑定 | archive/bindings.json | 按平台手动设置 |
| 复杂通道 | archive/channels-deep-config.json | 手动平台配置 |
API 密钥解析
当启用 --migrate-secrets 时,API 密钥将按优先级从 四个来源 获取:
- 配置值 —
models.providers.*.apiKey和openclaw.json中的 TTS 提供商密钥 - 环境文件 —
~/.openclaw/.env(如OPENROUTER_API_KEY、ANTHROPIC_API_KEY等) - 配置 env 子对象 —
openclaw.json→"env"或"env"."vars"(某些部署将密钥存储于此而非独立的.env文件) - 认证配置文件 —
~/.openclaw/agents/main/agent/auth-profiles.json(每个代理的凭据)
配置值具有最高优先级。后续来源用于补全缺失项。
支持的密钥目标
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 和 openclaw.json 环境子对象中的值。而使用 source: "file" 或 source: "exec" 的 SecretRef 对象无法自动解析——迁移将发出警告,这些值必须通过 hermes config set 手动添加至 Hermes。
迁移后操作
- 检查迁移报告 — 迁移完成后打印,包含已迁移、跳过和冲突项的数量。
- 审查归档文件 —
~/.hermes/migration/openclaw/<timestamp>/archive/中的内容需手动处理。 - 启动新会话 — 导入的技能和记忆条目仅在新会话中生效,当前会话不受影响。
- 验证 API 密钥 — 运行
hermes status以检查提供方认证状态。 - 测试消息功能 — 若已迁移平台令牌,请重启网关:
systemctl --user restart hermes-gateway - 检查会话策略 — 确保
hermes config get session_reset符合预期。 - 重新配对 WhatsApp — WhatsApp 使用二维码配对(Baileys),不支持令牌迁移。运行
hermes whatsapp完成配对。 - 清理归档 — 确认一切正常后,运行
hermes claw cleanup将遗留的 OpenClaw 目录重命名为.pre-migration/(防止状态混淆)。
故障排除
“未找到 OpenClaw 目录”
迁移工具会依次检查 ~/.openclaw/、~/.clawdbot/、~/.moltbot/。若安装位置不同,请使用 --source /path/to/your/openclaw 指定路径。
“未找到提供方 API 密钥”
根据 OpenClaw 版本,密钥可能存储于以下位置之一:openclaw.json 内的 models.providers.*.apiKey 下方、~/.openclaw/.env、openclaw.json 的 "env" 子对象,或 agents/main/agent/auth-profiles.json。迁移工具会检查全部四项。若密钥使用 source: "file" 或 source: "exec" 的 SecretRef,将无法自动解析——请通过 hermes config set 手动添加。
迁移后技能未显示
导入的技能位于 ~/.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。