故障排除 🔧

当 OpenClaw 出问题时,这里教你怎么修。

如果你只想要快速排查方法,先看 FAQ 的前 60 秒。本页深入讲解运行时故障和诊断。

Provider 专属快捷方式:/channels/troubleshooting

状态与诊断

快速排查命令(按顺序):

命令告诉你什么什么时候用
openclaw status本地摘要:操作系统 + 更新、Gateway 可达性/模式、服务、Agent/Session、Provider 配置状态首次检查,快速概览
openclaw status --all完整本地诊断(只读、可粘贴、相对安全),包含日志尾部需要分享调试报告时
openclaw status --deep运行 Gateway 健康检查(包含 Provider 探测;需要 Gateway 可达)当”已配置”不等于”能用”时
openclaw gateway probeGateway 发现 + 可达性(本地 + 远程目标)怀疑探测了错误的 Gateway 时
openclaw channels status --probe向运行中的 Gateway 询问 Channel 状态(可选探测)Gateway 可达但 Channel 异常时
openclaw gateway statusSupervisor 状态(launchd/systemd/schtasks)、运行时 PID/退出、最后的 Gateway 错误服务”看起来已加载”但什么都不运行时
openclaw logs --follow实时日志(运行时问题的最佳信号)需要实际失败原因时

分享输出: 优先用 openclaw status --all(它会隐藏 Token)。如果你要粘贴 openclaw status,考虑先设置 OPENCLAW_SHOW_SECRETS=0(Token 预览)。

另见:健康检查日志

常见问题

找不到 Provider “anthropic” 的 API key

这意味着 Agent 的认证存储为空 或缺少 Anthropic 凭据。 认证是 按 Agent 的,所以新 Agent 不会继承主 Agent 的密钥。

修复选项:

  • 重新运行引导并为该 Agent 选择 Anthropic
  • 或在 Gateway 主机 上粘贴 setup-token:
    openclaw models auth setup-token --provider anthropic
  • 或从主 Agent 目录复制 auth-profiles.json 到新 Agent 目录。

验证:

openclaw models status

OAuth Token 刷新失败(Anthropic Claude 订阅)

这意味着存储的 Anthropic OAuth Token 过期且刷新失败。 如果你用的是 Claude 订阅(没有 API key),最可靠的修复方法是 切换到 Claude Code setup-token 并在 Gateway 主机 上粘贴它。

推荐(setup-token):

# 在 Gateway 主机上运行(粘贴 setup-token)
openclaw models auth setup-token --provider anthropic
openclaw models status

如果你在别处生成了 Token:

openclaw models auth paste-token --provider anthropic
openclaw models status

更多详情:AnthropicOAuth

Control UI 在 HTTP 上失败(“device identity required” / “connect failed”)

如果你通过纯 HTTP 打开控制面板(例如 http://<lan-ip>:18789/http://<tailscale-ip>:18789/),浏览器会在 非安全上下文 中运行并 阻止 WebCrypto,所以无法生成设备身份。

修复:

  • 优先通过 Tailscale Serve 使用 HTTPS。
  • 或在 Gateway 主机上本地打开:http://127.0.0.1:18789/
  • 如果必须用 HTTP,启用 gateway.controlUi.allowInsecureAuth: true 并 使用 Gateway Token(仅 Token;无设备身份/配对)。见 Control UI

CI 密钥扫描失败

这意味着 detect-secrets 发现了基线中尚未包含的新候选项。 遵循密钥扫描

服务已安装但什么都没运行

如果 Gateway 服务已安装但进程立即退出,服务 可能看起来”已加载”但实际什么都没运行。

检查:

openclaw gateway status
openclaw doctor

Doctor/服务会显示运行时状态(PID/最后退出)和日志提示。

日志:

  • 优先:openclaw logs --follow
  • 文件日志(始终):/tmp/openclaw/openclaw-YYYY-MM-DD.log(或你配置的 logging.file
  • macOS LaunchAgent(如果已安装):$OPENCLAW_STATE_DIR/logs/gateway.loggateway.err.log
  • Linux systemd(如果已安装):journalctl --user -u openclaw-gateway[-<profile>].service -n 200 --no-pager
  • Windows:schtasks /Query /TN "OpenClaw Gateway (<profile>)" /V /FO LIST

启用更多日志:

  • 提升文件日志详细度(持久化 JSONL):
    { "logging": { "level": "debug" } }
  • 提升控制台详细度(仅 TTY 输出):
    { "logging": { "consoleLevel": "debug", "consoleStyle": "pretty" } }
  • 快速提示:--verbose 只影响 控制台 输出。文件日志仍由 logging.level 控制。

/logging 了解格式、配置和访问的完整概述。

“Gateway start blocked: set gateway.mode=local”

这意味着配置存在但 gateway.mode 未设置(或不是 local),所以 Gateway 拒绝启动。

修复(推荐):

  • 运行向导并将 Gateway 运行模式设置为 Local
    openclaw configure
  • 或直接设置:
    openclaw config set gateway.mode local

如果你想运行远程 Gateway:

  • 设置远程 URL 并保持 gateway.mode=remote
    openclaw config set gateway.mode remote
    openclaw config set gateway.remote.url "wss://gateway.example.com"

临时/开发专用: 传递 --allow-unconfigured 以在没有 gateway.mode=local 的情况下启动 Gateway。

还没有配置文件? 运行 openclaw setup 创建初始配置,然后重新运行 Gateway。

服务环境(PATH + Runtime)

Gateway 服务使用 最小 PATH 运行以避免 shell/管理器杂项:

  • macOS:/opt/homebrew/bin/usr/local/bin/usr/bin/bin
  • Linux:/usr/local/bin/usr/bin/bin

这故意排除了版本管理器(nvm/fnm/volta/asdf)和包 管理器(pnpm/npm),因为服务不加载你的 shell 初始化。Runtime 变量如 DISPLAY 应该放在 ~/.openclaw/.env 中(由 Gateway 早期加载)。 在 host=gateway 上的 Exec 运行会将你的登录 shell PATH 合并到 exec 环境中, 所以缺少工具通常意味着你的 shell 初始化没有导出它们(或设置 tools.exec.pathPrepend)。见 /tools/exec

WhatsApp + Telegram Channel 需要 Node;不支持 Bun。如果你的 服务是用 Bun 或版本管理的 Node 路径安装的,运行 openclaw doctor 迁移到系统 Node 安装。

Skill 在 Sandbox 中缺少 API key

症状: Skill 在主机上工作但在 Sandbox 中因缺少 API key 而失败。

原因: Sandbox 化的 exec 在 Docker 内运行,不会 继承主机 process.env

修复:

  • 设置 agents.defaults.sandbox.docker.env(或按 Agent 设置 agents.list[].sandbox.docker.env
  • 或将密钥烘焙到你的自定义 Sandbox 镜像中
  • 然后运行 openclaw sandbox recreate --agent <id>(或 --all

服务运行但端口未监听

如果服务报告 运行中 但 Gateway 端口上没有监听, Gateway 可能拒绝绑定。

这里”运行中”的含义

  • Runtime: running 意味着你的 Supervisor(launchd/systemd/schtasks)认为进程还活着。
  • RPC probe 意味着 CLI 实际上可以连接到 Gateway WebSocket 并调用 status
  • 始终相信 Probe target: + Config (service): 作为”我们实际尝试了什么?“的行。

检查:

  • gateway.mode 对于 openclaw gateway 和服务必须是 local
  • 如果你设置了 gateway.mode=remoteCLI 默认 使用远程 URL。服务仍可能在本地运行,但你的 CLI 可能探测了错误的地方。使用 openclaw gateway status 查看服务解析的端口 + 探测目标(或传递 --url)。
  • openclaw gateway statusopenclaw doctor 会在服务看起来运行但端口关闭时从日志中显示 最后的 Gateway 错误
  • 非回环绑定(lan/tailnet/custom,或回环不可用时的 auto)需要认证: gateway.auth.token(或 OPENCLAW_GATEWAY_TOKEN)。
  • gateway.remote.token 仅用于远程 CLI 调用;它 不会 启用本地认证。
  • gateway.token 被忽略;使用 gateway.auth.token

如果 openclaw gateway status 显示配置不匹配

  • Config (cli): ...Config (service): ... 通常应该匹配。
  • 如果不匹配,你几乎肯定在编辑一个配置而服务正在运行另一个。
  • 修复:从你想让服务使用的相同 --profile / OPENCLAW_STATE_DIR 重新运行 openclaw gateway install --force

如果 openclaw gateway status 报告服务配置问题

  • Supervisor 配置(launchd/systemd/schtasks)缺少当前默认值。
  • 修复:运行 openclaw doctor 更新它(或 openclaw gateway install --force 进行完全重写)。

如果 Last gateway error: 提到 “refusing to bind … without auth”

  • 你将 gateway.bind 设置为非回环模式(lan/tailnet/custom,或回环不可用时的 auto)但没有配置认证。
  • 修复:设置 gateway.auth.mode + gateway.auth.token(或导出 OPENCLAW_GATEWAY_TOKEN)并重启服务。

如果 openclaw gateway statusbind=tailnet 但未找到 tailnet 接口

  • Gateway 尝试绑定到 Tailscale IP(100.64.0.0/10)但在主机上未检测到。
  • 修复:在该机器上启动 Tailscale(或将 gateway.bind 改为 loopback/lan)。

如果 Probe note: 说探测使用回环

  • 对于 bind=lan 这是预期的:Gateway 监听 0.0.0.0(所有接口),回环仍应在本地连接。
  • 对于远程客户端,使用真实的 LAN IP(不是 0.0.0.0)加端口,并确保配置了认证。

地址已被占用(端口 18789)

这意味着某些东西已经在监听 Gateway 端口。

检查:

openclaw gateway status

它会显示监听器和可能的原因(Gateway 已运行、SSH 隧道)。 如果需要,停止服务或选择不同的端口。

检测到额外的 Workspace 文件夹

如果你从旧安装升级,磁盘上可能仍有 ~/openclaw。 多个 Workspace 目录可能导致混乱的认证或状态漂移,因为 只有一个 Workspace 是活动的。

修复: 保留一个活动 Workspace 并归档/删除其余的。见 Agent Workspace

主聊天在 Sandbox Workspace 中运行

症状:pwd 或文件工具显示 ~/.openclaw/sandboxes/... 即使你 期望主机 Workspace。

原因: agents.defaults.sandbox.mode: "non-main" 基于 session.mainKey(默认 "main")。 群组/Channel Session 使用自己的密钥,所以它们被视为非主要并 获得 Sandbox Workspace。

修复选项:

  • 如果你想要 Agent 的主机 Workspace:设置 agents.list[].sandbox.mode: "off"
  • 如果你想在 Sandbox 内访问主机 Workspace:为该 Agent 设置 workspaceAccess: "rw"

“Agent was aborted”

Agent 在响应中途被中断。

原因:

  • 用户发送了 stopabortescwaitexit
  • 超时
  • 进程崩溃

修复: 只需发送另一条消息。Session 继续。

“Agent failed before reply: Unknown model: anthropic/claude-haiku-3-5”

OpenClaw 故意拒绝 旧/不安全的模型(尤其是那些更 容易受到 Prompt 注入攻击的模型)。如果你看到此错误,该模型名称不再 受支持。

修复:

  • 为 Provider 选择 最新 模型并更新你的配置或模型别名。
  • 如果你不确定哪些模型可用,运行 openclaw models listopenclaw models scan 并选择一个受支持的。
  • 检查 Gateway 日志以获取详细的失败原因。

另见:Models CLIModel Providers

消息未触发

检查 1: 发送者在白名单中吗?

openclaw status

在输出中查找 AllowFrom: ...

检查 2: 对于群聊,是否需要提及?

# 消息必须匹配 mentionPatterns 或显式提及;默认值在 Channel 群组/公会中。
# 多 Agent:`agents.list[].groupChat.mentionPatterns` 覆盖全局模式。
grep -n "agents\\|groupChat\\|mentionPatterns\\|channels\\.whatsapp\\.groups\\|channels\\.telegram\\.groups\\|channels\\.imessage\\.groups\\|channels\\.discord\\.guilds" \
  "${OPENCLAW_CONFIG_PATH:-$HOME/.openclaw/openclaw.json}"

检查 3: 检查日志

openclaw logs --follow
# 或如果你想要快速过滤:
tail -f "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" | grep "blocked\\|skip\\|unauthorized"

配对码未到达

如果 dmPolicypairing,未知发送者应该收到一个码,他们的消息在批准前被忽略。

检查 1: 是否已有待处理请求在等待?

openclaw pairing list <channel>

待处理的 DM 配对请求默认每个 Channel 上限为 3 个。如果列表已满,新请求在一个被批准或过期前不会生成码。

检查 2: 请求是否已创建但未发送回复?

openclaw logs --follow | grep "pairing request"

检查 3: 确认该 Channel 的 dmPolicy 不是 open/allowlist

图片 + 提及不工作

已知问题:当你发送图片时只有提及(没有其他文本),WhatsApp 有时不包含提及元数据。

解决方法: 在提及中添加一些文本:

  • @openclaw + 图片
  • @openclaw check this + 图片

Session 未恢复

检查 1: Session 文件在那里吗?

ls -la ~/.openclaw/agents/<agentId>/sessions/

检查 2: 重置窗口太短了吗?

{
  "session": {
    "reset": {
      "mode": "daily",
      "atHour": 4,
      "idleMinutes": 10080 // 7 天
    }
  }
}

检查 3: 有人发送了 /new/reset 或重置触发器吗?

Agent 超时

默认超时是 30 分钟。对于长任务:

{
  "reply": {
    "timeoutSeconds": 3600 // 1 小时
  }
}

或使用 process 工具后台运行长命令。

WhatsApp 断开连接

# 检查本地状态(凭据、Session、排队事件)
openclaw status
# 探测运行中的 Gateway + Channel(WA 连接 + Telegram + Discord API)
openclaw status --deep

# 查看最近的连接事件
openclaw logs --limit 200 | grep "connection\\|disconnect\\|logout"

修复: 通常在 Gateway 运行后自动重连。如果卡住了,重启 Gateway 进程(无论你如何监督它),或手动运行并输出详细信息:

openclaw gateway --verbose

如果你已登出/取消链接:

openclaw channels logout
trash "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/credentials" # 如果 logout 无法完全删除所有内容
openclaw channels login --verbose       # 重新扫描 QR

媒体发送失败

检查 1: 文件路径有效吗?

ls -la /path/to/your/image.jpg

检查 2: 太大了吗?

  • 图片:最大 6MB
  • 音频/视频:最大 16MB
  • 文档:最大 100MB

检查 3: 检查媒体日志

grep "media\\|fetch\\|download" "$(ls -t /tmp/openclaw/openclaw-*.log | head -1)" | tail -20

内存使用率高

OpenClaw 在内存中保留对话历史。

修复: 定期重启或设置 Session 限制:

{
  "session": {
    "historyLimit": 100 // 保留的最大消息数
  }
}

常见故障排查

”Gateway 无法启动 — 配置无效”

OpenClaw 现在会在配置包含未知键、格式错误的值或无效类型时拒绝启动。 这是出于安全考虑的故意设计。

用 Doctor 修复:

openclaw doctor
openclaw doctor --fix

注意:

  • openclaw doctor 报告每个无效条目。
  • openclaw doctor --fix 应用迁移/修复并重写配置。
  • 诊断命令如 openclaw logsopenclaw healthopenclaw statusopenclaw gateway statusopenclaw gateway probe 即使配置无效也能运行。

“所有模型都失败了” — 我应该先检查什么?

  • 凭据 是否存在于正在尝试的 Provider(认证配置文件 + 环境变量)。
  • 模型路由:确认 agents.defaults.model.primary 和备用模型是你可以访问的模型。
  • Gateway 日志/tmp/openclaw/… 中查看确切的 Provider 错误。
  • 模型状态:使用 /model status(聊天)或 openclaw models status(CLI)。

我在个人 WhatsApp 号码上运行 — 为什么自聊很奇怪?

启用自聊模式并将你自己的号码加入白名单:

{
  channels: {
    whatsapp: {
      selfChatMode: true,
      dmPolicy: "allowlist",
      allowFrom: ["+15555550123"],
    },
  },
}

WhatsApp 设置

WhatsApp 让我登出了。如何重新认证?

再次运行登录命令并扫描 QR 码:

openclaw channels login

main 分支上的构建错误 — 标准修复路径是什么?

  1. git pull origin main && pnpm install
  2. openclaw doctor
  3. 检查 GitHub issues 或 Discord
  4. 临时解决方法:检出旧提交

npm install 失败(allow-build-scripts / 缺少 tar 或 yargs)。现在怎么办?

如果你从源代码运行,使用仓库的包管理器:pnpm(首选)。 仓库声明了 packageManager: "pnpm@…"

典型恢复:

git status   # 确保你在仓库根目录
pnpm install
pnpm build
openclaw doctor
openclaw gateway restart

原因:pnpm 是此仓库配置的包管理器。

如何在 git 安装和 npm 安装之间切换?

使用 网站安装程序 并用标志选择安装方法。它 就地升级并重写 Gateway 服务以指向新安装。

切换 到 git 安装

curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git --no-onboard

切换 到 npm 全局

curl -fsSL https://openclaw.ai/install.sh | bash

注意:

  • git 流程仅在仓库干净时才 rebase。先提交或 stash 更改。
  • 切换后,运行:
    openclaw doctor
    openclaw gateway restart

Telegram 块流式传输没有在工具调用之间拆分文本。为什么?

块流式传输只发送 完成的文本块。你看到单条消息的常见原因:

  • agents.defaults.blockStreamingDefault 仍然是 "off"
  • channels.telegram.blockStreaming 设置为 false
  • channels.telegram.streamModepartialblock 且草稿流式传输处于活动状态 (私聊 + 主题)。在这种情况下,草稿流式传输会禁用块流式传输。
  • 你的 minChars / 合并设置太高,所以块被合并了。
  • 模型发出一个大文本块(没有中途刷新点)。

修复清单:

  1. 将块流式传输设置放在 agents.defaults 下,而不是根目录。
  2. 如果你想要真正的多消息块回复,设置 channels.telegram.streamMode: "off"
  3. 在调试时使用较小的块/合并阈值。

Streaming

Discord 即使 requireMention: false 也不在我的服务器中回复。为什么?

requireMention 只控制 通过白名单后 的提及门控。 默认情况下 channels.discord.groupPolicyallowlist,所以公会必须显式启用。 如果你设置了 channels.discord.guilds.<guildId>.channels,只有列出的 Channel 被允许;省略它以允许公会中的所有 Channel。

修复清单:

  1. 设置 channels.discord.groupPolicy: "open" 添加公会白名单条目(可选添加 Channel 白名单)。
  2. channels.discord.guilds.<guildId>.channels 中使用 数字 Channel ID
  3. requireMention: false 放在 channels.discord.guilds(全局或按 Channel)。 顶级 channels.discord.requireMention 不是受支持的键。
  4. 确保机器人有 Message Content Intent 和 Channel 权限。
  5. 运行 openclaw channels status --probe 获取审计提示。

文档:DiscordChannels 故障排除

Cloud Code Assist API 错误:无效的工具架构(400)。现在怎么办?

这几乎总是 工具架构兼容性 问题。Cloud Code Assist 端点接受 JSON Schema 的严格子集。OpenClaw 在当前 main 中清理/规范化工具 架构,但修复尚未在最后一个版本中(截至 2026 年 1 月 13 日)。

修复清单:

  1. 更新 OpenClaw
    • 如果你可以从源代码运行,拉取 main 并重启 Gateway。
    • 否则,等待包含架构清理器的下一个版本。
  2. 避免不支持的关键字如 anyOf/oneOf/allOfpatternPropertiesadditionalPropertiesminLengthmaxLengthformat 等。
  3. 如果你定义自定义工具,保持顶级架构为 type: "object"properties 和简单枚举。

ToolsTypeBox schemas

macOS 特定问题

授予权限时应用崩溃(语音/麦克风)

如果你在隐私提示上点击”允许”时应用消失或显示”Abort trap 6”:

修复 1:重置 TCC 缓存

tccutil reset All bot.molt.mac.debug

修复 2:强制新 Bundle ID 如果重置不起作用,在 scripts/package-mac-app.sh 中更改 BUNDLE_ID(例如,添加 .test 后缀)并重建。这会强制 macOS 将其视为新应用。

Gateway 卡在”Starting…”

应用连接到端口 18789 上的本地 Gateway。如果它一直卡住:

修复 1:停止 Supervisor(首选) 如果 Gateway 由 launchd 监督,杀死 PID 只会重新生成它。先停止 Supervisor:

openclaw gateway status
openclaw gateway stop
# 或:launchctl bootout gui/$UID/bot.molt.gateway(替换为 bot.molt.<profile>;旧版 com.openclaw.* 仍然有效)

修复 2:端口忙(找到监听器)

lsof -nP -iTCP:18789 -sTCP:LISTEN

如果是无监督进程,先尝试优雅停止,然后升级:

kill -TERM <PID>
sleep 1
kill -9 <PID> # 最后手段

修复 3:检查 CLI 安装 确保全局 openclaw CLI 已安装并与应用版本匹配:

openclaw --version
npm install -g openclaw@<version>

调试模式

获取详细日志:

# 在配置中打开跟踪日志:
#   ${OPENCLAW_CONFIG_PATH:-$HOME/.openclaw/openclaw.json} -> { logging: { level: "trace" } }
#
# 然后运行详细命令将调试输出镜像到 stdout:
openclaw gateway --verbose
openclaw channels login --verbose

日志位置

日志位置
Gateway 文件日志(结构化)/tmp/openclaw/openclaw-YYYY-MM-DD.log(或 logging.file
Gateway 服务日志(Supervisor)macOS:$OPENCLAW_STATE_DIR/logs/gateway.log + gateway.err.log(默认:~/.openclaw/logs/...;配置文件使用 ~/.openclaw-<profile>/logs/...
Linux:journalctl --user -u openclaw-gateway[-<profile>].service -n 200 --no-pager
Windows:schtasks /Query /TN "OpenClaw Gateway (<profile>)" /V /FO LIST
Session 文件$OPENCLAW_STATE_DIR/agents/<agentId>/sessions/
媒体缓存$OPENCLAW_STATE_DIR/media/
凭据$OPENCLAW_STATE_DIR/credentials/

健康检查

# Supervisor + 探测目标 + 配置路径
openclaw gateway status
# 包含系统级扫描(旧版/额外服务、端口监听器)
openclaw gateway status --deep

# Gateway 可达吗?
openclaw health --json
# 如果失败,用连接详情重新运行:
openclaw health --verbose

# 默认端口上有东西在监听吗?
lsof -nP -iTCP:18789 -sTCP:LISTEN

# 最近活动(RPC 日志尾部)
openclaw logs --follow
# 如果 RPC 宕机的备用方案
tail -20 /tmp/openclaw/openclaw-*.log

重置所有内容

核选项:

openclaw gateway stop
# 如果你安装了服务并想要全新安装:
# openclaw gateway uninstall

trash "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
openclaw channels login         # 重新配对 WhatsApp
openclaw gateway restart           # 或:openclaw gateway

⚠️ 这会丢失所有 Session 并需要重新配对 WhatsApp。

获取帮助

  1. 先检查日志:/tmp/openclaw/(默认:openclaw-YYYY-MM-DD.log,或你配置的 logging.file
  2. 在 GitHub 上搜索现有 issue
  3. 打开新 issue 并附上:
    • OpenClaw 版本
    • 相关日志片段
    • 重现步骤
    • 你的配置(隐藏密钥!)

“你试过关掉再打开吗?” — 每个 IT 人员

🦞🔧

浏览器无法启动(Linux)

如果你看到 "Failed to start Chrome CDP on port 18800"

最可能的原因: Ubuntu 上的 Snap 打包的 Chromium。

快速修复: 改为安装 Google Chrome:

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb

然后在配置中设置:

{
  "browser": {
    "executablePath": "/usr/bin/google-chrome-stable"
  }
}

完整指南:browser-linux-troubleshooting