跳到主要内容

从 OpenClaw 迁移

hermes claw migrate 可以把你的 OpenClaw(或旧版 Clawdbot / Moldbot)配置导入到 Hermes 中。本指南会精确说明会迁移哪些内容、配置键如何映射,以及迁移完成后应检查什么。

快速开始

# 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.jsonmoltbot.json)同样会自动识别。

选项

OptionDescription
--dry-run仅预览,不做任何修改
--preset <name>full(默认,包含密钥)或 user-data(不含 API key)
--overwrite发生冲突时覆盖已有 Hermes 文件(默认是跳过)
--migrate-secrets包含 API key(--preset full 默认启用)
--source <path>指定自定义 OpenClaw 目录
--workspace-target <path>指定 AGENTS.md 放置位置
--skill-conflict <mode>skip(默认)、overwriterename
--yes预览后跳过确认提示

会迁移什么

Persona、记忆和指令

WhatOpenClaw sourceHermes destinationNotes
Personaworkspace/SOUL.md~/.hermes/SOUL.md直接复制
Workspace instructionsworkspace/AGENTS.md--workspace-target 下的 AGENTS.md需要显式提供 --workspace-target
Long-term memoryworkspace/MEMORY.md~/.hermes/memories/MEMORY.md解析为条目,与现有内容合并并去重,使用 § 分隔符
User profileworkspace/USER.md~/.hermes/memories/USER.md与 memory 相同的条目合并逻辑
Daily memory filesworkspace/memory/*.md~/.hermes/memories/MEMORY.md所有日记式 memory 文件会合并进主记忆

此外,迁移程序还会尝试在 workspace.default/workspace-main/ 中查找 workspace 文件,作为回退路径(OpenClaw 近版本把 workspace/ 重命名成了 workspace-main/,多 agent 模式则使用 workspace-{agentId})。

技能(4 个来源)

SourceOpenClaw locationHermes destination
Workspace skillsworkspace/skills/~/.hermes/skills/openclaw-imports/
Managed/shared skills~/.openclaw/skills/~/.hermes/skills/openclaw-imports/
Personal cross-project~/.agents/skills/~/.hermes/skills/openclaw-imports/
Project-level sharedworkspace/.agents/skills/~/.hermes/skills/openclaw-imports/

技能冲突由 --skill-conflict 控制:skip 会保留 Hermes 现有技能,overwrite 会替换它,rename 会创建一个 -imported 副本。

模型与 provider 配置

WhatOpenClaw config pathHermes destinationNotes
Default modelagents.defaults.modelconfig.yaml -> model可以是字符串,也可以是 {primary, fallbacks} 对象
Custom providersmodels.providers.*config.yaml -> custom_providers映射 baseUrlapiType/api,同时处理短格式(如 "openai""anthropic")和带连字符格式(如 "openai-completions""anthropic-messages""google-generative-ai"
Provider API keysmodels.providers.*.apiKey~/.hermes/.env需要 --migrate-secrets。详见下方 API key resolution

Agent 行为

WhatOpenClaw config pathHermes config pathMapping
Max turnsagents.defaults.timeoutSecondsagent.max_turns使用 timeoutSeconds / 10,上限 200
Verbose modeagents.defaults.verboseDefaultagent.verbose"off" / "on" / "full"
Reasoning effortagents.defaults.thinkingDefaultagent.reasoning_effort"always" / "high" / "xhigh" -> "high""auto" / "medium" / "adaptive" -> "medium""off" / "low" / "none" / "minimal" -> "low"
Compressionagents.defaults.compaction.modecompression.enabled"off" -> false,其它任意值 -> true
Compression modelagents.defaults.compaction.modelcompression.summary_model直接复制字符串
Human delayagents.defaults.humanDelay.modehuman_delay.mode"natural" / "custom" / "off"
Human delay timingagents.defaults.humanDelay.minMs / .maxMshuman_delay.min_ms / .max_ms直接复制
Timezoneagents.defaults.userTimezonetimezone直接复制字符串
Exec timeouttools.exec.timeoutSecterminal.timeout直接复制(字段名是 timeoutSec,不是 timeout
Docker sandboxagents.defaults.sandbox.backendterminal.backend"docker" -> "docker"
Docker imageagents.defaults.sandbox.docker.imageterminal.docker_image直接复制

Session reset 策略

OpenClaw config pathHermes config pathNotes
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 servers

OpenClaw fieldHermes fieldNotes
mcp.servers.*.commandmcp_servers.*.commandstdio 传输
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(text-to-speech)

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

  1. messages.tts.providers.{provider}.*(规范位置)
  2. 顶层 talk.providers.{provider}.*(回退位置)
  3. 旧式平铺键 messages.tts.{provider}.*(更老的格式)
WhatHermes destination
Provider nameconfig.yaml -> tts.provider
ElevenLabs voice IDconfig.yaml -> tts.elevenlabs.voice_id
ElevenLabs model IDconfig.yaml -> tts.elevenlabs.model_id
OpenAI modelconfig.yaml -> tts.openai.model
OpenAI voiceconfig.yaml -> tts.openai.voice
Edge TTS voiceconfig.yaml -> tts.edge.voice(OpenClaw 曾把 "edge" 重命名为 "microsoft",两种写法都能识别)
TTS assets~/.hermes/tts/(文件复制)

消息平台

PlatformOpenClaw config pathHermes .env variableNotes
Telegramchannels.telegram.botToken.accounts.default.botTokenTELEGRAM_BOT_TOKENtoken 可以是字符串,也可以是 SecretRef。同时支持扁平布局和 accounts 布局
Telegramcredentials/telegram-default-allowFrom.jsonTELEGRAM_ALLOWED_USERSallowFrom[] 数组拼接成逗号分隔
Discordchannels.discord.token.accounts.default.tokenDISCORD_BOT_TOKEN
Discordchannels.discord.allowFrom.accounts.default.allowFromDISCORD_ALLOWED_USERS
Slackchannels.slack.botToken.accounts.default.botTokenSLACK_BOT_TOKEN
Slackchannels.slack.appToken.accounts.default.appTokenSLACK_APP_TOKEN
Slackchannels.slack.allowFrom.accounts.default.allowFromSLACK_ALLOWED_USERS
WhatsAppchannels.whatsapp.allowFrom.accounts.default.allowFromWHATSAPP_ALLOWED_USERS认证依赖 Baileys QR 配对,迁移后需要重新配对
Signalchannels.signal.account.accounts.default.accountSIGNAL_ACCOUNT
Signalchannels.signal.httpUrl.accounts.default.httpUrlSIGNAL_HTTP_URL
Signalchannels.signal.allowFrom.accounts.default.allowFromSIGNAL_ALLOWED_USERS
Matrixchannels.matrix.accessToken.accounts.default.accessTokenMATRIX_ACCESS_TOKEN使用的是 accessToken,不是 botToken
Mattermostchannels.mattermost.botToken.accounts.default.botTokenMATTERMOST_BOT_TOKEN

其它配置

WhatOpenClaw pathHermes pathNotes
Approval modeapprovals.exec.modeconfig.yaml -> approvals.mode"auto" -> "off""always" -> "manual""smart" -> "smart"
Command allowlistexec-approvals.jsonconfig.yaml -> command_allowlist模式会合并并去重
Browser CDP URLbrowser.cdpUrlconfig.yaml -> browser.cdp_url
Browser headlessbrowser.headlessconfig.yaml -> browser.headless
Brave search keytools.web.search.brave.apiKey.env -> BRAVE_API_KEY需要 --migrate-secrets
Gateway auth tokengateway.auth.token.env -> HERMES_GATEWAY_TOKEN需要 --migrate-secrets
Working directoryagents.defaults.workspace.env -> MESSAGING_CWD

已归档(没有直接对应的 Hermes 等价项)

这些内容会被保存到 ~/.hermes/migration/openclaw/<timestamp>/archive/,供你手动复查:

WhatArchive fileHow to recreate in Hermes
IDENTITY.mdarchive/workspace/IDENTITY.md合并进 SOUL.md
TOOLS.mdarchive/workspace/TOOLS.mdHermes 已内建工具说明
HEARTBEAT.mdarchive/workspace/HEARTBEAT.md用 cron 任务替代
BOOTSTRAP.mdarchive/workspace/BOOTSTRAP.md用 context files 或技能替代
Cron jobsarchive/cron-config.jsonhermes cron create 手动重建
Pluginsarchive/plugins-config.json参考 plugins guide
Hooks/webhooksarchive/hooks-config.jsonhermes webhook 或 gateway hooks 重新搭建
Memory backendarchive/memory-backend-config.json通过 hermes honcho 等方式配置
Skills registryarchive/skills-registry-config.jsonhermes skills config
UI/identityarchive/ui-identity-config.json/skin 命令
Loggingarchive/logging-diagnostics-config.jsonconfig.yaml 的 logging 段配置
Multi-agent listarchive/agents-list.json用 Hermes profiles
Channel bindingsarchive/bindings.json每个平台手动重新设置
Complex channelsarchive/channels-deep-config.json手动平台配置

API key 解析

启用 --migrate-secrets 后,API key 会按优先级从 四个来源 收集:

  1. 配置值 —— openclaw.jsonmodels.providers.*.apiKey 和 TTS provider keys
  2. 环境文件 —— ~/.openclaw/.env(如 OPENROUTER_API_KEYANTHROPIC_API_KEY 等)
  3. 配置里的 env 子对象 —— openclaw.json -> "env""env"."vars"(有些版本把密钥放这里而不是单独的 .env
  4. Auth profiles —— ~/.openclaw/agents/main/agent/auth-profiles.json(按 agent 保存的凭据)

优先使用配置值。后续来源只会补齐前面没填上的空缺。

支持的密钥目标

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

不在这个 allowlist 里的 key 永远不会被复制。

SecretRef 处理

OpenClaw 中 token 和 API key 可能有三种格式:

// 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" } } }

迁移程序会解析这三种格式。对于 env 模板和 source: "env" 的 SecretRef,它会去 ~/.openclaw/.envopenclaw.json 的 env 子对象中查值。对于 source: "file"source: "exec" 的 SecretRef,无法自动解析;迁移过程会给出警告,这些值需要你之后通过 hermes config set 手动补上。

迁移后要做什么

  1. 查看迁移报告 —— 迁移结束时会打印迁移、跳过和冲突项目的统计
  2. 检查归档文件 —— ~/.hermes/migration/openclaw/<timestamp>/archive/ 中的内容都需要人工确认
  3. 开启新会话 —— 导入的技能和记忆只会在新会话中生效,不会影响当前会话
  4. 验证 API key —— 运行 hermes status 检查 provider 认证情况
  5. 测试消息平台 —— 如果迁移了平台 token,请重启 gateway:systemctl --user restart hermes-gateway
  6. 检查 session 策略 —— 用 hermes config get session_reset 确认结果符合预期
  7. 重新配对 WhatsApp —— WhatsApp 用的是 Baileys QR 配对,不支持 token 迁移。请运行 hermes whatsapp
  8. 清理归档 —— 确认一切正常后,可以运行 hermes claw cleanup,把遗留 OpenClaw 目录重命名为 .pre-migration/,避免后续状态混淆

故障排除

"OpenClaw directory not found"

迁移会依次检查 ~/.openclaw/~/.clawdbot/~/.moltbot/。如果你的安装不在这些位置,请显式使用 --source /path/to/your/openclaw

"No provider API keys found"

不同版本的 OpenClaw 会把 key 放在不同位置:可能直接嵌在 openclaw.jsonmodels.providers.*.apiKey,也可能在 ~/.openclaw/.envopenclaw.json"env" 子对象里,或者 agents/main/agent/auth-profiles.json 中。迁移程序会检查这四处。如果 key 使用的是 source: "file"source: "exec" SecretRef,就无法自动解析,需要你之后用 hermes config set 手动添加。

迁移后技能没有出现

导入后的技能会放到 ~/.hermes/skills/openclaw-imports/。请启动一个新会话让它们生效,或者执行 /skills 确认它们是否已加载。

TTS voice 没有迁移过来

OpenClaw 的 TTS 设置有两个可能位置:messages.tts.providers.* 和顶层 talk 配置。迁移程序都会检查。如果你的 voice ID 是通过 OpenClaw UI 设置的(存放在不同路径),可能需要手动补上,例如:

hermes config set tts.elevenlabs.voice_id YOUR_VOICE_ID