#我对接了fei shu,并且开放了所有权限,但是我在fei shu与机器人聊天,它不回复我,在日志中没有发现错误信息,很苦恼,求大神

1 messages · Page 1 of 1 (latest)

regal grailBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> ✅ Mark Solution

unkempt knollBOT
#

先按这几个“最常见坑”排查一下(Feishu 这块看起来像是根本没收到事件,所以日志才会“没报错但也没反应”):

文档先放这: https://docs.openclaw.ai/channels/feishu

1) 先确认:Gateway 到底有没有收到你发的消息?

在网关机器上开日志:

openclaw logs --follow

然后你在飞书里给机器人发一句话。

  • 如果日志里完全没有出现 feishu 的 inbound/event:就是飞书的“事件订阅/长连接”没配置好或没生效(看第 2 点)。
  • 如果日志里能看到消息进来,但就是不回:通常是 DM pairing 没批准 或模型/权限阻挡(看第 3/4 点)。

(如果方便,直接贴一下你发消息那一刻的日志片段,打码 token/secret 就行。)

#

2) 飞书开放平台里:事件订阅必须是“长连接 + im.message.receive_v1”

在 Feishu Open Platform → Event Subscription:

  • 选择 Use long connection to receive events (WebSocket)
  • 必须添加事件im.message.receive_v1
  • 另外:先确保网关在跑(文档里强调了:网关不在线时,长连接配置可能保存不成功)

以及确认 App 已经 发布/审核通过,Bot 能力已开启、机器人已加到会话里。

3) DM 不回的超级常见原因:默认是 pairing,需要 approve

Feishu DM 默认是:

  • dmPolicy: "pairing"

也就是说你第一次私聊它,它会走配对流程。请在网关机器上跑:

#
openclaw pairing list feishu
openclaw pairing approve feishu <CODE>

(你也可以改成 allowlist/open,但先用 pairing 跑通最稳。)

4) 你用的是国际版 Lark 还是国内飞书?

如果是 Lark(国际版),需要在配置里加:

channels: { feishu: { domain: "lark" } }

否则会连错域名,看起来就像“啥都没发生”。


#

要快速定位的话,你回我 3 个输出基本就能定性了:

openclaw --version
openclaw channels status
openclaw pairing list feishu

再加上你发消息那一刻 openclaw logs --follow 里对应的几行。

flint belfry
#

在飞书开通权限列表,我没有找到 im.message.receive_v1 这个权限信息

unkempt knollBOT
#

im.message.receive_v1 不是“权限(scope)”,所以你在「权限列表」里找不到它——它是 事件订阅的事件名

你要去飞书开放平台的这个位置加它:

  1. 飞书开放平台 → 你的应用 → 事件订阅(Event Subscription)
  2. 订阅方式选:使用长连接接收事件(WebSocket)(有的界面叫“长连接”)
  3. 在「订阅事件 / 添加事件」里搜索 “接收消息”(通常会显示为“接收消息 v1”),选中后对应的 key 就是:im.message.receive_v1
  4. 保存后(很关键)确保你的 OpenClaw gateway 正在运行,不然有时长连接配置保存/生效会失败(文档也有提醒)。

另外两个常见点也一起确认下(不然即使收到了也可能不回):

  • 机器人能力要开启:应用能力 → 机器人(Bot) 打开(否则消息事件可能根本不会出现在可选事件里)。
  • 回复需要的权限是另外一套(不是事件):比如能读消息/发消息(文档里给的权限 batch import 里包含 im:message:send_as_bot 等)。事件订阅 ≠ 权限。

对应文档在这(里面就是这么分步骤的):https://docs.openclaw.ai/channels/feishu

如果你愿意,我们可以快速定位你现在卡在哪一步:

#

在你网关机器上跑 openclaw logs --follow,然后你在飞书里给 bot 发一句话,看日志里有没有出现 feishu 的 inbound/event。把那几行贴出来(AppSecret 打码)我就能告诉你是“事件没进来”还是“进来了但被 pairing/allowlist 拦了”。

flint belfry
#

我重新安装了,但是一直卡在[2/3] Installing OpenClaw
✓ Git already installed
· Installing OpenClaw v2026.2.26

unkempt knollBOT
#

这一步卡住通常不是“飞书问题”,而是安装脚本在下载/解包/npm 安装阶段没输出(国内网络到 npm/GitHub 也很容易卡住)。

先确认两件事:

  1. 你这行 Installing OpenClaw v2026.2.26 卡了多久?(>10 分钟基本就是卡死/网络问题)
  2. 你用的是什么环境:macOS / Linux / Windows(WSL2)?以及网络在国内吗?

最快的定位方式:加 verbose 重跑(官方 FAQ 推荐)

直接中断(Ctrl+C)后用 verbose 重跑,把输出贴出来(至少最后 50-100 行):

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

文档来源: https://docs.openclaw.ai/help/faq#installer-stuck-how-do-i-get-more-feedback

如果你在国内网络:先临时换 npm registry(常见立刻就好)

#

不改你系统全局配置,只对这次安装生效:

curl -fsSL https://openclaw.ai/install.sh | env NPM_CONFIG_REGISTRY=https://registry.npmmirror.com bash -s -- --verbose

你回我这 3 个信息,我就能继续把你带通

  • 操作系统 + 是否在 WSL2/服务器上
  • “卡住多久”
  • --verbose 的输出(打码 secret/token)

(如果 verbose 里出现 npm/pnpm/git clone 卡住的具体行,就能立刻判断是 registry、DNS、还是 GitHub 拉取问题。)

flint belfry
#

操作系统是macos,继续执行了但是发生了一些警告信息! npm install failed for openclaw@latest
Command: env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm --loglevel error --silent --no-fund --no-audit install -g openclaw@latest
Installer log: /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.4grhjlJNAE
! npm install failed; showing last log lines
! npm install failed; retrying
! npm install failed for openclaw@latest
Command: env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm --loglevel error --silent --no-fund --no-audit install -g openclaw@latest
Installer log: /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.OiBOAzDTxf
! npm install failed; showing last log lines

unkempt knollBOT
#

你贴出来的这段还只是“安装器 wrapper”的提示,真正失败原因在那个 Installer log 文件里(/var/folders/.../tmp.xxx)。先把日志尾巴扒出来,我们才能一锤定音。

1)把 installer log 最后 80~150 行贴出来(打码 token/secret)

用你最后一次提示的那个路径(例如你发的 tmp.OiBOAzDTxf):

tail -n 150 /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.OiBOAzDTxf

(如果还有另一个 tmp 文件,也同样 tail 一下。)

2)同时把这三条输出贴一下

这三条能快速判断是不是 Node 版本 / 权限(prefix) / sharp 编译 问题:

node -v
#
npm -v
npm config get prefix

3)最常见的 3 个根因(macOS 上尤其多)

在你没贴日志前,先给你一个“对号入座”的速查:

  1. Node 版本不对
    OpenClaw 需要 Node >= 22。如果你是 18/20,npm install -g openclaw 会直接失败(通常是 EBADENGINE)。

  2. 全局安装权限问题(EACCES)
    如果 npm config get prefix 指向 /usr/local 之类,可能会权限不足。一般建议用 nvm / fnm / brew 的 node@22,避免 sudo 全局装。

  3. sharp / node-gyp 本地编译失败
    你看到命令里已经带了 SHARP_IGNORE_GLOBAL_LIBVIPS=1(安装器默认就这么做),但如果还是走到编译,通常会报缺 Xcode CLT / python / node-gyp。日志里一般会写得很明确。

#

你把 tail 出来的 installer log + node -v/npm -v/prefix 发出来,我就能告诉你下一步该做哪一种修复(以及对应的最短命令)。此外这段在中文安装文档里也有对应说明:sharp/node-gyp 那块(你现在踩的就是这里)。

#

tail 没有任何输出,基本只有两种情况:

  1. 这个 tmp 日志文件是空的(0 字节)
  2. 你 tail 的路径不对 / 文件已经被清理掉了

先用下面三条确认一下文件到底有没有内容(把输出贴出来):

ls -lah /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.OiBOAzDTxf
wc -c   /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.OiBOAzDTxf
stat    /var/folders/fn/vklv8q_j4z1glfch67ky0wzr0000gn/T/tmp.OiBOAzDTxf

如果 wc -c 显示 0,那这个“installer log”没写进去,我们就去看 npm 自己的 debug log(通常这里才有真错误原因):

#
ls -t ~/.npm/_logs/*debug-0.log | head -3
tail -n 120 ~/.npm/_logs/$(ls -t ~/.npm/_logs/*debug-0.log | head -1 | xargs basename)

另外也把这 3 个信息贴一下(很多安装失败是 Node 版本/全局安装权限导致的):

node -v
npm -v
npm config get prefix

拿到 npm debug log 的最后 100 行后,基本就能直接判断是 EBADENGINE(Node 太旧)、EACCES(全局目录没权限)、还是 sharp/node-gyp 编译失败,然后给你对应的最短修复步骤。

flint belfry
#

我要卸载掉,进行重新安装

unkempt knollBOT
#

在 macOS 上想“彻底卸载再重装”,最省事的是用内置卸载器(会把 gateway 服务 + CLI + 状态目录 都清掉)。

文档: https://docs.openclaw.ai/install/uninstall

方案 A(推荐):如果 openclaw 还能运行

先看下是否还能跑:

openclaw --version

能跑的话直接:

openclaw uninstall --all --yes --non-interactive
#

(交互式也行:openclaw uninstall

注意:--all 会删除 ~/.openclaw(配置/凭据/会话等)。如果你想保留数据,别用 --all,或先备份 ~/.openclaw

方案 B:如果 openclaw 已经坏了/跑不了(手动卸载服务)

按文档的 macOS 手动卸载方式:

launchctl bootout gui/$UID/ai.openclaw.gateway
rm -f ~/Library/LaunchAgents/ai.openclaw.gateway.plist

然后再删除状态目录(会清空配置/会话):

rm -rf ~/.openclaw
#

最后移除全局 CLI(如果之前装成功过):

npm rm -g openclaw

你确认下:你是想完全清空所有配置~/.openclaw 也删掉),还是只想“重装程序但保留配置”?我可以给你对应的最短重装命令(你之前 npm install 失败,重装前最好顺便把那个根因一起解决,否则会再卡一次)。

flint belfry
#

已经卸载完毕了

unkempt knollBOT
#

好,那现在从“干净状态”重装会顺很多。

1) 先确认 Node 版本(这是安装失败最常见原因)

先跑一下把输出贴出来:

node -v
npm -v

OpenClaw 需要 Node >= 22。如果你现在不是 22+,建议先把 Node 升到 22(你用哪种装的:nvm / fnm / Homebrew?我可以按你的方式给最短命令)。

2) 重装(建议用 verbose,失败了能看到原因)

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

如果你在国内网络、npm 经常卡/超时,可以用镜像(只影响这次命令):

curl -fsSL https://openclaw.ai/install.sh | env NPM_CONFIG_REGISTRY=https://registry.npmmirror.com bash -s -- --verbose

3) 安装好后跑这两个验证

openclaw --version
openclaw onboard --install-daemon

如果你这次又遇到 npm install failed,直接把 verbose 输出里最后 50-100 行贴上来就行(记得把任何 token/secret 打码)。我基本可以立刻判断是 Node 版本、权限(prefix)、还是 sharp/node-gyp(需要 Xcode CLT)导致的。

flint belfry
#

MacBook-Pro Desktop % node -v
npm -v
v24.12.0
11.6.2

unkempt knollBOT
#

Node / npm 版本没问题(Node 24.12.0 >= 22)。

接下来直接重装就行——但我提醒一句:你之前失败点很像是 sharp 这类原生依赖(有时在 Node 24 上会更挑版本/预编译包),所以如果你再遇到同样的 npm install failed,我会优先建议你切到 Node 22 LTS 来装(成功率最高)。

现在先按这个顺序来

1)(可选但强烈建议)确保装了 Xcode Command Line Tools

很多原生包需要它:

xcode-select --install

2) 重新跑安装器(带 verbose,方便看错误)

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

如果你在国内网络,npm 经常超时/卡住,用镜像重跑:

curl -fsSL https://openclaw.ai/install.sh | env NPM_CONFIG_REGISTRY=https://registry.npmmirror.com bash -s -- --verbose

3) 安装完成后验证

openclaw --version
openclaw onboard --install-daemon

如果这次又出现 npm install failed

别急着再卸载了,直接把 verbose 输出最后 80 行贴出来;或者贴 npm 的 debug log(最关键):

#
ls -t ~/.npm/_logs/*debug-0.log | head -1
tail -n 120 ~/.npm/_logs/$(ls -t ~/.npm/_logs/*debug-0.log | head -1 | xargs basename)

如果错误确实是 sharp/原生编译相关,我会让你切到 Node 22 再装(你用 nvm/fnm/brew 哪个管理 Node,跟我说一下我给你对应的一行命令)。

flint belfry
#

安装过程中卡住了,我怕可以强行停止安装,使用其他参数安装吗

unkempt knollBOT
#

可以的,卡住时直接 Ctrl+C 强行中断没问题(安装器本质就是在跑一串 shell + npm 命令,中断后不会“把系统弄坏”,最多是留下半装的文件,重跑会覆盖/继续)。

接下来你可以用这些“更稳”的参数/方式重装:

1) 先用 verbose 看它到底卡在哪

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

2) 如果你怀疑是“卡在交互/引导”而不是下载

跳过提示和 onboarding(很多时候看起来像卡住,其实在等输入):

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

3) 如果你怀疑是 npm 网络/registry 卡住(国内很常见)

#
curl -fsSL https://openclaw.ai/install.sh | env NPM_CONFIG_REGISTRY=https://registry.npmmirror.com bash -s -- --verbose

4) 如果你想换安装方式(绕开全局 npm / 强制自带 Node 22)

install-cli.sh(会装到 ~/.openclaw 前缀下,并自带 Node 22.22.0,通常更稳):

curl -fsSL https://openclaw.ai/install-cli.sh | bash -s -- --json
# 或者不需要 json:
curl -fsSL https://openclaw.ai/install-cli.sh | bash

5) 想看所有可用参数(避免我漏了)

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

你现在“卡住”的那一行具体显示什么、卡了多久(比如 2 分钟/10 分钟)?把最后 10 行输出贴一下,我可以判断你该用上面哪条命令最合适。

flint belfry
#

我们的对话会被其他用户看到吗

unkempt knollBOT
#

会的——你现在是在 Discord 服务器的公开频道/帖子里发消息(#fei-shu-fei-shu 这个 thread),所以所有有权限看到这个频道/帖子的用户都能看到我们这段对话。

几点建议:

  • 不要贴:App Secret、Bot Token、Gateway Token、任何 API Key、登录 Cookie、完整的配置文件(除非你先打码)。
  • 贴日志时:把类似 token=...appSecretAuthorization: 这些字段都替换成 ***
  • 如果你想只让少数人看到:可以改成发到私聊,或者用你们内部的私密频道/私密 thread。
flint belfry
#

安装完成后,查看版本信息command not found: openclaw,返回command not found: openclaw

unkempt knollBOT
#

openclaw: command not found 基本就是:OpenClaw 已经装到 npm 的 global bin 目录里了,但你的 PATH 没包含那个目录(或装到本地 prefix 了但没加 PATH)。

按这个顺序排查/修好(把输出贴出来也行):

1) 先看看 openclaw 被装到哪里

npm prefix -g
ls -la "$(npm prefix -g)/bin" | grep -i openclaw || true

如果你能看到 openclaw 在这个目录里,直接用完整路径验证:

"$(npm prefix -g)/bin/openclaw" --version

2) 把 npm 的 global bin 加进 PATH(zsh 默认)

把下面这一行加到 ~/.zshrc(或你用 bash 就加到 ~/.bashrc):

#
echo 'export PATH="$(npm prefix -g)/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
hash -r  # 刷新命令缓存

然后再试:

openclaw --version

3) 如果你之前用的是 install-cli.sh(装到 ~/.openclaw 里)

那可执行文件会在:

ls -la ~/.openclaw/bin/openclaw
~/.openclaw/bin/openclaw --version
#

这种情况就把 ~/.openclaw/bin 加到 PATH。


你把这三条的输出贴一下,我就能判断你是哪一种情况(不用贴任何 token/secret):

echo $SHELL
npm prefix -g
ls -la "$(npm prefix -g)/bin" | head -n 20
flint belfry
#

09:43:25 [feishu] feishu[default]: received message from ou_4611125c5a1709a8727073ff864595a9 in oc_c48cfe0f3731387018e416d8c13e0a18 (p2p) 日志正常,飞书权限全部配置,发送信息依然不回复我

unkempt knollBOT
#

这行日志很关键:

received message … (p2p)

说明两件事:飞书事件订阅/长连接是通的,OpenClaw 确实收到了消息。现在问题基本只剩下两类:消息被策略拦下(pairing/allowlist)或者 模型/发送阶段失败(但你没看到后续日志)。

按这个顺序查,基本 5 分钟能定位:

1) 先查是不是 DM 还在 pairing / allowlist 阶段

飞书 DM 默认是 dmPolicy: "pairing",没批准前不会正常对话。

在网关机器上跑:

openclaw pairing list feishu
#
  • 如果看到 pending:按提示把 code approve 掉
    openclaw pairing approve feishu <CODE>
    
  • 如果 list 里什么都没有,但仍然不回:很可能你把 dmPolicy 配成了 allowlist/disabled,而 allowFrom 没包含你的 open_id(你日志里的是 ou_4611...)。

可以把(打码后)这两项贴出来:

openclaw config get channels.feishu.dmPolicy
openclaw config get channels.feishu.allowFrom

你不需要贴 appSecret/token,只贴这两项的值就行。

2) 看“收到消息后”有没有发生 run / 报错(你现在只贴了第一行)

请你在发消息的同时 tail 日志,贴 收到消息那行之后的 20~50 行

#
openclaw logs --follow

正常情况下你会看到类似:

  • pairing code 发出 / allowlist block 的提示
  • 或者模型请求开始/失败(auth、rate limit、all models failed 等)
  • 或者发送消息失败(权限不足时通常会有错误)

3) 快速排除“模型没配好所以不回”

跑一下(输出通常是安全的):

openclaw models status

如果这里显示 provider 没凭据 / all failed,那就算收到了飞书消息也会“想回但回不了”。

#

openclaw pairing list feishu 的输出 + openclaw models status 的关键几行 + “received message 后面紧跟的日志”贴出来(打码 secret),我就能告诉你具体卡在 pairing/allowlist 还是发送/模型阶段。

flint belfry
#

list有,但是我已经给openclaw pairing approve feishu <CODE>了。这时候重启服务,发送信息,机器人回复访问未配置,并给了一个新的配对吗

unkempt knollBOT
#

这种现象(你 approve 过,但 重启后又发新的配对码,还提示“访问未配置”)基本只说明一件事:

你 approve 的那份配对/allowFrom 状态,没有被当前这个正在跑的 Gateway 读到。
最常见原因是:CLI 用的 state/profile 和后台服务用的不是同一个(等价于“你在 A 目录 approve,但服务从 B 目录读”)。

下面按顺序核对(都不会泄露密钥):

1) 先确认:你重启的 Gateway 用的是哪个配置/状态目录

在网关机器上跑:

openclaw gateway status

把输出里这两行相关信息贴出来即可(不要贴 token):

  • Config (cli) vs Config (service) 是否一致
  • 如果有显示 state dir / profile 相关信息也一起贴
#

如果这两个不一致,修复通常是:

openclaw gateway install --force
openclaw gateway restart

(确保你是在“你想让服务使用的那个环境/profile”里跑的上述命令。)

2) 看 pairing 的“已批准名单”文件有没有写进去

DM pairing 的批准结果会落到这个目录(文档写的):~/.openclaw/credentials/

你执行:

ls -la ~/.openclaw/credentials | grep -i feishu || true
#

正常情况下会看到类似:

  • feishu-allowFrom.json(默认账号)
  • feishu-<accountId>-allowFrom.json(非默认账号)

再看里面有没有你的 ou_...

cat ~/.openclaw/credentials/feishu-allowFrom.json

如果文件不存在、或里面没有你的 ou_4611...,那说明 approve 根本没写到“服务正在用的那份 state”里。

3) 如果你确实有多个 Feishu accountId(或 log 里显示 feishu[xxx])

你那行 log 是 feishu[default],这意味着当前接收消息的 accountId 是 default
但 pairing 文件可能是按 accountId 分开的(例如 feishu-main-allowFrom.json vs feishu-allowFrom.json),一旦写错文件,就会一直让你配对。


#

你先把这两份输出贴一下我就能直接告诉你卡在哪:

  1. openclaw gateway status(重点看 Config(cli/service) 是否一致)
  2. ls -la ~/.openclaw/credentials | grep -i feishu

如果最后发现 allowFrom 文件里已经有 ou_... 但仍然反复配对,那就更像是账号作用域/读取文件名的问题,我再带你对齐 accountId(必要时我会让你跑一下 openclaw pairing approve --help 看是否有 --account 参数,避免我瞎猜参数名)。

flint belfry
#

Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json

unkempt knollBOT
#

Config (cli)Config (service) 一致 👍
那还会反复出新配对码,通常只剩两种原因:

  1. 配对“批准”没有写进 allowFrom 存储文件(或写进了,但不是当前账号/实例读的那份)
  2. 账号作用域没对上(Feishu 日志里是 feishu[default],所以要看 default 这份 allowFrom)

你现在先做这 3 步(都很安全,不会泄露密钥):

1) 看看 Feishu 的 allowFrom 文件到底有没有写进去

在网关机器上:

ls -la ~/.openclaw/credentials | grep -i feishu || true

然后把下面两个文件(存在就看)内容里是否包含你的 ou_4611...

#
cat ~/.openclaw/credentials/feishu-default-allowFrom.json 2>/dev/null || true
cat ~/.openclaw/credentials/feishu-allowFrom.json 2>/dev/null || true

只要任意一个里出现 ou_4611...,理论上就不该再让你配对了。

2) 用“显式 account”再 approve 一次(避免作用域不对)

你现在收到的新 code(飞书里那 8 位)拿来执行:

openclaw pairing approve --channel feishu --account default <CODE>

执行完它应该会打印类似 Approved feishu sender ou_xxx

3) 立刻再发一条消息测试(approve 前那条不会被处理)

#

approve 只是放行,不会补处理之前那条消息;需要你再发一次。


如果你执行完第 2 步后,feishu-default-allowFrom.json 还是空/没变化,那就是写入没成功或写到别的 state dir。这时请你再贴一下 openclaw gateway status 里那行 Service env:(它会显示有没有 OPENCLAW_STATE_DIR / OPENCLAW_PROFILE 之类的隔离配置)。

flint belfry
#

安装完成后,如何配置deepseek模型

unkempt knollBOT
#

如果你说的 “DeepSeek 模型” 是 DeepSeek 官方 API(deepseek-chat / deepseek-reasoner),在 OpenClaw 里通常用 自定义 OpenAI-compatible provider 来配(models.providers)。

参考:

1) 准备 API Key(别在这个公开频道里贴出来)

把 key 放到网关机器的 ~/.openclaw/.env(推荐):

echo 'DEEPSEEK_API_KEY=你的key' >> ~/.openclaw/.env

2) 在 ~/.openclaw/openclaw.json 加一个 provider + 设为默认模型

示例(JSON5):

#
{
  env: {
    // 也可以放这里;但更推荐放 ~/.openclaw/.env
    // DEEPSEEK_API_KEY: "sk-..."
  },

  models: {
    mode: "merge",
    providers: {
      deepseek: {
        baseUrl: "https://api.deepseek.com/v1",
        apiKey: "${DEEPSEEK_API_KEY}",
        api: "openai-completions",
        models: [
          { id: "deepseek-chat", name: "DeepSeek Chat" },
#
          { id: "deepseek-reasoner", name: "DeepSeek Reasoner" },
        ],
      },
    },
  },

  agents: {
    defaults: {
      model: {
        primary: "deepseek/deepseek-chat",
        // 你也可以换成 "deepseek/deepseek-reasoner"
      },
      // 如果你配置过 models allowlist(agents.defaults.models),记得把 deepseek/... 加进去
    },
  },
#
}

3) 重启网关并验证

openclaw gateway restart
openclaw models status

如果还是“不回复”,很常见是你之前设置了 agents.defaults.models 作为模型白名单,但没把 deepseek/deepseek-chat 加进去(会被直接拦掉)。

如果你用的不是 DeepSeek 官方 API,而是 OpenRouter / HuggingFace / Ollama 本地 deepseek,告诉我你是哪一种,我给你对应的最短配置方式。

flint belfry
#

引导Model/auth provider选择模型时选择哪个

unkempt knollBOT
#

如果你目标是用 DeepSeek 官方 API(deepseek-chat / deepseek-reasoner),在引导里 Model/auth provider 那一步一般选:

方案 A(推荐,直连 DeepSeek 官方):选 Custom provider(自定义/OpenAI-compatible)

  • Provider 选:Custom provider
  • Compatibility 选:OpenAI
  • Base URL 填:https://api.deepseek.com/v1
  • Provider id(如果让你填):deepseek
  • Model id 填:
    • 日常对话:deepseek-chat
    • 推理模式:deepseek-reasoner
  • API Key:用 DeepSeek 平台的 key(建议放到 ~/.openclaw/.env,别在 Discord 里直接粘贴)

文档参考(自定义 provider):https://docs.openclaw.ai/gateway/configuration-reference#custom-providers-and-base-urls
DeepSeek 官方文档(base_url):https://api-docs.deepseek.com/

方案 B(你没有 DeepSeek key,但有 HF token):选 Hugging Face (Inference)

  • Provider 选:Hugging Face
#
  • 然后在 “Default Hugging Face model” 下拉里直接搜 DeepSeek 选你要的(例如 DeepSeek R1 / V3.2 等)
  • 这种走的是 HF 的路由 API,不是 DeepSeek 官方直连

文档:https://docs.openclaw.ai/providers/huggingface


你用的是 DeepSeek 官方 key 还是 HuggingFace/OpenRouter/火山引擎 这类代理?告诉我你手头是哪家的 key,我给你对应“引导里每一步该怎么填”的最短路径。

flint belfry
#

Endpoint compatibility
│ ● OpenAI-compatible (Uses /chat/completions)
│ ○ Anthropic-compatible
│ ○ Unknown (detect automatically)
我已经填写key了,这个选哪个

unkempt knollBOT
#

OpenAI-compatible (Uses /chat/completions)

原因:DeepSeek 官方 API 是 OpenAI 格式兼容的(就是走 /chat/completions 这套接口),所以在 OpenClaw 的 “Endpoint compatibility” 这里要选 OpenAI-compatible。

后面一般还会让你填:

  • Base URLhttps://api.deepseek.com/v1
  • Model iddeepseek-chat(常规)或 deepseek-reasoner(推理)

配完后建议跑一下验证:

openclaw models status
openclaw gateway restart
flint belfry
#

Model ID
│ deepseek-reasoner

◇ Verification successful.

◆ Endpoint ID
│ custom-api-deepseek-com█
Endpoint ID输入什么

unkempt knollBOT
#

Endpoint ID 就是你这个自定义供应商在 OpenClaw 配置里的 provider 名称/标识符(会变成 models.providers.<EndpointID> 的那个 key),用来组成最终的模型引用。

你可以:

  • 直接用一个简单的deepseek (最推荐)
  • 或者区分用途:deepseek-official / deepseek-cn 之类
  • 你现在看到的默认值 custom-api-deepseek-com可以直接保留,只是名字比较长。

选了 deepseek 的话,后面模型一般会以这种形式出现/引用:

  • deepseek/deepseek-reasoner
  • deepseek/deepseek-chat

只要记住:Endpoint ID 要唯一、好记、全小写 + -/_ 最稳。

flint belfry
#

Model alias (optional) 是否选择

unkempt knollBOT
#

Model alias (optional) 可以不选/留空,不影响使用。

什么时候建议填一个:

  • 你想在聊天里用更短的名字切模型,比如 /model deepseek/model r1 这种。

例子(选一个就行):

  • deepseek-reasoner:填 r1deepseek-r1
  • deepseek-chat:填 deepseekv3

如果你只配一个模型、也不打算频繁切换:直接跳过最省事。

flint belfry
#

Select channel (QuickStart)
│ Feishu/Lark (飞书)

◆ Install Feishu plugin?
│ ● Download from npm (@openclaw/feishu)
│ ○ Skip for now
该如何选

unkempt knollBOT
#

Download from npm (@openclaw/feishu)

原因:Feishu/Lark 是 插件渠道,不装插件网关就没法连接飞书收发消息。
只有在你已经手动安装过插件(比如你从源码路径 ./extensions/feishu 装过)或者想稍后再配渠道时,才选 “Skip for now”。

选完后如果 npm 下载慢/卡住(国内常见),可以先完成引导再用命令装:

openclaw plugins install @openclaw/feishu
openclaw gateway restart
flint belfry
#

Which Feishu domain?
│ Feishu (feishu.cn) - China

◆ Group chat policy
│ ● Allowlist - only respond in specific groups
│ ○ Open - respond in all groups (requires mention)
│ ○ Disabled - don't respond in groups

unkempt knollBOT
#
  • Which Feishu domain?
    你如果用的是国内版「飞书」(域名 feishu.cn),就选 Feishu (China)
    如果是国际版 Lark(larksuite.com),才选 Lark。

  • Group chat policy 选哪个?(看你想不想让它在群里回复)

    • Disabled:只用私聊(DM),最省事也最安全。
    • Allowlist:只在你指定的群里回复(推荐默认选这个,后面再把需要的群加进去)。
    • Open:所有群都可用,但通常仍需要 @mention 才会回(适合你明确要“到处都能用”)。

你之前日志是 (p2p) 私聊场景,其实跟 group policy 无关;如果你目前只想先把私聊跑通,直接选 DisabledAllowlist 都可以。

flint belfry
#

我选的open,是否在任何群聊都可以添加使用

unkempt knollBOT
#

你选了 Open 的意思是:只要机器人在群里,它就“允许”在所有群聊里处理消息/回复(不用你逐个把群加到 allowlist)。

但注意两点(非常关键):

  1. 默认仍然需要 @ 提及才会回复
    Feishu 插件默认 requireMention: true。所以在群里一般要 @机器人 它才回;不 @ 的消息可能只会被记录到历史,不触发回复。
    (如果你想某个群“不用 @ 也回”,需要对那个群单独设置 requireMention: false。)

  2. 安全风险更高
    Open = 群里任何人都能触发机器人(只要 @ 到它)。如果你只是自己用,通常更建议 Allowlist 或只开特定群。

文档在这里: https://docs.openclaw.ai/channels/feishu (里面有 groupPolicy/requireMention 的配置示例)

如果你想我给你一个“只在某几个群可用,其他群不响应”的配置,我也可以按你的需求写一段最小 config。

flint belfry
#

Set GOOGLE_PLACES_API_KEY for goplaces?
│ ○ Yes / ● No

unkempt knollBOT
#

No 就行。

GOOGLE_PLACES_API_KEY 是给一个叫 goplaces 的工具/技能用的(查地点、地址、POI 之类),跟飞书接入、DeepSeek 模型都没关系。

只有当你之后想让机器人做“查餐厅/地点/地址/附近信息”这类事情,才需要选 Yes 并提供 Google Places API Key。

flint belfry
#

我选择Open the Web UI后,在窗口输入内容,回复我gent failed before reply: Model context window too small (4096 tokens). Minimum is 16000.
Logs: openclaw logs --follow

unkempt knollBOT
#

这个报错的意思很直白:你当前选的模型在 OpenClaw 里被识别成只有 4096 的上下文窗口,而 OpenClaw 启动一次 agent run(系统提示词+工具说明等)最低需要 16000,所以它直接拒绝运行了。

这在 自定义 DeepSeek(OpenAI-compatible)provider 时很常见:模型元数据(context window)没填/没被正确发现,就会落到一个很小的默认值(4096)。

修复方法(推荐):给 DeepSeek 的模型条目显式写 contextWindow

编辑 ~/.openclaw/openclaw.json,在你配置的 models.providers.<你的EndpointID> 里把模型补全,比如你 Endpoint ID 如果是 deepseek

{
  models: {
    mode: "merge",
    providers: {
      deepseek: {
        baseUrl: "https://api.deepseek.com/v1",
        apiKey: "${DEEPSEEK_API_KEY}",
        api: "openai-completions",
#
        models: [
          { id: "deepseek-chat", name: "DeepSeek Chat", contextWindow: 128000, maxTokens: 8192 },
          { id: "deepseek-reasoner", name: "DeepSeek Reasoner", reasoning: true, contextWindow: 128000, maxTokens: 8192 },
        ],
      },
    },
  },

  agents: {
    defaults: {
      model: { primary: "deepseek/deepseek-chat" }, // 或 deepseek/deepseek-reasoner
    },
  },
}
#

然后重启:

openclaw gateway restart

再打开 Web UI 试一句话。

128k / 8192 是 DeepSeek 官方文档描述的量级(至少保证 >16000 就能跑起来;你也可以先填 contextWindow: 16000 做最小修复)。

快速确认你现在到底用的是哪个 provider id / model id

跑一下(把输出贴出来也行,别贴 key):

openclaw models status
#

如果你把 Endpoint ID 设成了 custom-api-deepseek-com,那模型引用会变成:

  • custom-api-deepseek-com/deepseek-reasoner

对应你配置块也要用同一个 id。

如果你愿意,把你 models.providers 里 DeepSeek 那段(打码 apiKey)贴一下,我可以帮你把字段对齐到你实际的 Endpoint ID。

flint belfry
#

EndpointID 这个在哪里

unkempt knollBOT
#

Endpoint ID 就是你在引导里填的那个 自定义 provider 的名字,它会写进配置文件里,位置是:

~/.openclaw/openclaw.json
models.providers.<EndpointID>

你刚才界面里显示的默认值像是:custom-api-deepseek-com,那它在配置里就会长这样:

models: {
  providers: {
    "custom-api-deepseek-com": { ... }
  }
}
#

怎么快速查你当前的 Endpoint ID 是哪个?

在网关机器上跑(不会泄露 key):

openclaw config get models.providers --json

它输出的最外层 key(比如 custom-api-deepseek-comdeepseek)就是 Endpoint ID

另外你也可以用:

openclaw models status

里面会显示当前默认模型类似 custom-api-deepseek-com/deepseek-reasoner,斜杠前面那段也是 Endpoint ID。

flint belfry
#

"models": {
"mode": "merge",
"providers": {
"deepseek": {
"baseUrl": "https://api.deepseek.com/v1",
"apiKey": "xxxxxxx",
"api": "openai-completions",
"models": [
{
"id": "deepseek-reasoner",
"name": "deepseek-reasoner (Custom Provider)",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 4096,
"maxTokens": 4096
}
]
}
}
},

unkempt knollBOT
#

你找到问题根因了:你这个 deepseek provider 里把模型元数据写成了

  • contextWindow: 4096
  • maxTokens: 4096

而 OpenClaw 运行 agent 最低需要 16000,所以才报 Model context window too small.

该怎么改(最小修复)

deepseek 这个 provider 下的 model 条目改大(至少 16000)。建议直接按 DeepSeek 官方文档给的 128K 配:

把这段:

"contextWindow": 4096,
"maxTokens": 4096
#

改成例如:

"contextWindow": 128000,
"maxTokens": 8192

同时你这个是 deepseek-reasoner,建议把 reasoning 也改成 true(不改也能跑,但标记正确更好):

"reasoning": true

最终类似这样(只示例 models 数组这一段):

#
"models": [
  {
    "id": "deepseek-reasoner",
    "name": "DeepSeek Reasoner",
    "reasoning": true,
    "input": ["text"],
    "contextWindow": 128000,
    "maxTokens": 8192,
    "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
  }
]

改完后要重启 Gateway

#
openclaw gateway restart

然后验证:

openclaw models status

重要:别在公开频道放 apiKey

你现在配置里 apiKey 是明文(虽然你贴出来是 xxxxxxx,但真实环境别这么放)。推荐做法:

  1. 把 key 放到 ~/.openclaw/.env
echo 'DEEPSEEK_API_KEY=sk-...' >> ~/.openclaw/.env
#
  1. config 里用引用:
"apiKey": "${DEEPSEEK_API_KEY}"

如果你之前真的在 Discord 里粘贴过真实 key,建议立刻去 DeepSeek 平台把 key rotate 掉。

你改完 contextWindow/maxTokens 后,如果 Web UI 还是不回,把 openclaw models status 里关于 deepseek 的那几行贴出来(打码 key),我再帮你对齐。

flint belfry
#

Restarted LaunchAgent: gui/501/ai.openclaw.gateway

unkempt knollBOT
#

很好,这表示网关服务(LaunchAgent)已经重启起来了。下一步就是确认 DeepSeek 的 contextWindow 已经生效,然后再测试一次聊天。

1) 先确认网关真的起来了

openclaw gateway status

看里面 RPC probe: ok

2) 确认当前默认模型不再是 4096 context

openclaw models status

重点看两件事:

  • 默认模型是不是类似 deepseek/deepseek-reasoner(或你设的那个)
  • 该模型的 contextWindow 是否已经变成你改的(例如 128000),至少要 > 16000

3) 再去 Web UI/飞书发一条新消息测试

#

之前那条触发失败的消息不会“自动补跑”,需要你重新发一句

4) 如果还是不回复:立刻看日志的后续报错

openclaw logs --follow

然后发一条消息,看日志里紧跟着出现的是:

  • 401/403(key/权限问题)
  • “No API key found …”
  • 还是别的模型/路由错误

另外提醒:你刚才贴配置里 apiKey 是明文位置(你贴出来是 xxx 还好)。在公开频道别贴真实 key;如果真实 key 曾经发出来过,建议去 DeepSeek 控制台把 key 旋转/作废。

flint belfry
#

如何启动

unkempt knollBOT
#

启动 OpenClaw Gateway 有两种方式(推荐用“服务模式”):

方式 A(推荐):启动后台服务(LaunchAgent)

openclaw gateway start
openclaw gateway status

openclaw gateway statusRPC probe: ok 就表示启动成功。

想看实时日志:

openclaw logs --follow

打开 Web UI(控制台):

#
openclaw dashboard

方式 B:前台运行(调试用,关掉终端就停)

openclaw gateway

你刚才已经看到 Restarted LaunchAgent: gui/501/ai.openclaw.gateway,一般说明服务已经重启了。现在直接跑:

openclaw gateway status
#

把输出贴出来(尤其是 RPC probe 那行),我就能确认它是否已经在跑。

flint belfry
#

RPC probe: ok

unkempt knollBOT
#

很好,RPC probe: ok 就表示 Gateway 已经正常启动并且 CLI 能连上了。

接下来按这个顺序把“能收能回”跑通:

1) 确认 DeepSeek 的 contextWindow 已经不是 4096

(否则 Web UI 还会报 context too small)

openclaw models status

看一下当前默认模型那条里,contextWindow 至少要 > 16000(你之前要改到 128000/8192 那种)。

2) 确认 Feishu 插件/通道在跑

openclaw channels status
#

里面要能看到 feishu 相关状态是 enabled/configured/running(具体字段可能略不同)。

3) 打开 Web UI / 看日志

openclaw dashboard
openclaw logs --follow

然后你在飞书里 重新发一条新消息(之前失败的那条不会自动重试),看日志里紧跟着有没有:

  • pairing/allowlist 拦截
  • 模型调用失败(401/无 key/超时)
  • 发送失败(权限不足等)

如果你把 openclaw models status(关键几行)和你发消息时 openclaw logs --follow 对应的几行贴出来(记得打码 key/token),基本就能定位最后卡在哪一步。

flint belfry
#

飞书给我发了一个配对码,如何使用,目前给飞书发送信息是不回复我的

unkempt knollBOT
#

飞书发给你的这个 配对码(pairing code),就是用来“授权你这个飞书账号可以跟机器人私聊”的。你需要在运行 OpenClaw 的那台机器上把它 approve 掉。

1) 在网关机器上查看待配对请求(可选)

openclaw pairing list --channel feishu --account default

(如果你不确定 accountId,一般日志里是 feishu[default] 就用 default。)

2) 批准配对码(关键)

把飞书里那 8 位码替换进去:

openclaw pairing approve --channel feishu --account default <CODE>

配对码通常 1 小时过期,过期就会重新发新的。

#

3) 重新发一条消息

注意:approve 只是“放行”,不会补处理你之前那条消息
批准后,你需要在飞书里再发一句新的消息给机器人,它才会开始正常回复。


如果你 approve 了还是一直给新配对码

通常是“账号作用域不对 / allowFrom 没写进去”。你可以检查授权名单文件里有没有你的 ou_...

ls -la ~/.openclaw/credentials | grep -i feishu
cat ~/.openclaw/credentials/feishu-default-allowFrom.json 2>/dev/null || true
cat ~/.openclaw/credentials/feishu-allowFrom.json 2>/dev/null || true

如果你把 openclaw logs --follow 里出现 pairing 的那几行也贴出来(记得打码 token/secret),我可以直接告诉你是被哪条策略拦住了。

flint belfry
#

配置完了配对码,发信息不回复我

unkempt knollBOT
#

你现在的现象一般是两种情况之一:

  1. 其实还在被“未授权”拦截(allowFrom 没真正写进去 / 账号作用域不对)
  2. 已经进到 agent,但模型调用失败(DeepSeek key / 模型上下文 / 429/402 等),所以没回

最有效的定位方式是:边发消息边跟日志,看“收到消息”后面紧跟的那几行到底发生了什么。


A) 先确认 pairing 真的生效(最常见)

在网关机器上跑(别贴任何 key):

openclaw pairing list --channel feishu --account default
ls -la ~/.openclaw/credentials | grep -i feishu || true
cat ~/.openclaw/credentials/feishu-default-allowFrom.json 2>/dev/null || true
#
cat ~/.openclaw/credentials/feishu-allowFrom.json 2>/dev/null || true

你日志里 sender 是 ou_...,上面两个 allowFrom 文件里 必须能看到这个 ou_...,否则就会一直被当成未授权(然后不处理消息/或者继续发配对码)。

如果你 approve 的时候没带 account,建议再用“显式 account” approve 一次(用飞书刚给你的新 code):
openclaw pairing approve --channel feishu --account default <CODE>


B) 看“收到消息后”到底发生了什么(关键)

开日志:

openclaw logs --follow
#

然后你在飞书里再发一句新消息(approve 前那句不会补跑),把日志里这段贴出来(打码 secret/token):

  • received message ... 那行
  • 以及它后面紧跟着的 20 行

我们要找的关键词通常是下面这些之一:

  • blocked unauthorized sender ...
  • pairing request sender=...
  • dispatching to agent ...
  • failed to dispatch message ...
  • 模型相关错误(401/429/context window too small 等)

C) 顺手确认模型没再卡 4096 context(你之前遇到过)

#
openclaw models status

确认 deepseek/...contextWindow 已经 > 16000(你应该已经改到 128000 之类了)。


你先把 **B) 那段日志(received message 后面 20 行)**贴一下,我就能直接告诉你卡在 “pairing/allowlist” 还是 “模型调用/发送失败”。

flint belfry
#

我配置了新的配对码,然后飞书发送信息,它又发给我一个新的配对信息

unkempt knollBOT
#

这说明 Gateway 还是把你当成“未授权的 DM 发送者”,所以每次你一发消息它就走 dmPolicy: pairing 流程,再给你新的配对码(正常聊天内容不会被处理)。

最常见原因是:pairing approve 没有真正写入/被读取到 allowFrom 存储(账号作用域或 state 目录不一致)。

按这个顺序查(都在网关机器上执行,别贴任何 key):

1) 用“明确 account=default”再 approve 一次

用飞书最新发你的 8 位码:

openclaw pairing approve --channel feishu --account default <CODE>

2) 立刻检查 allowFrom 文件里有没有你的 ou_...

你的 open_id 就是日志里的 ou_...(例如 ou_4611...)。看它是否写进去了:

#
ls -la ~/.openclaw/credentials | grep -i feishu || true
cat ~/.openclaw/credentials/feishu-default-allowFrom.json 2>/dev/null || true
cat ~/.openclaw/credentials/feishu-allowFrom.json 2>/dev/null || true

只要其中任意一个文件的 allowFrom 数组里出现你的 ou_...,下一条 DM 就不该再给配对码。

注意:approve 之后要 再发一条新消息,之前那条不会补处理。

3) 如果文件里已经有 ou_...,但还是继续发配对码

那基本就是 服务进程用的 state 目录和你当前终端不一样(虽然 config path 一样,但 OPENCLAW_STATE_DIR/PROFILE 可能不同)。

请把下面这两条的输出贴出来(尤其是 Service env: 那行):

#
openclaw gateway status
echo "$OPENCLAW_STATE_DIR $OPENCLAW_PROFILE"

临时绕开(快速能用)

如果你不想再折腾 pairing,也可以直接改成 allowlist(只允许你这个 open_id):

openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_你的id"]'
openclaw gateway restart

你先做第 1+2 步,把 allowFrom 文件内容(打码无所谓)贴一下,我就能继续帮你把“为什么写不进去/为什么读不到”定位到根。

flint belfry
#

Service env: OPENCLAW_GATEWAY_PORT=18789

unkempt knollBOT
#

Service env 里只有 OPENCLAW_GATEWAY_PORT 这点是正常的(说明不是 profile/state-dir 被环境变量偷偷切走了)。

你现在“每发一次 DM 又给一个新的配对码”,基本只剩下两个最常见原因:

1) 你 approve 的不是同一个 macOS 用户(很常见:之前用过 sudo)

LaunchAgent 是 gui/501 跑的(也就是你登录的那个用户)。如果你用 sudo openclaw pairing approve ...,会把 allowlist 写到 /var/root/ 下,服务读不到,于是一直重新配对。

先确认你不是 root:

whoami
echo "$HOME"

如果不是你正常用户名(或者 HOME 是 /var/root),那就改用“不带 sudo”的 approve。

2) allowFrom 文件根本没写进去(或写到别的 account 文件)

#

批准成功后,应该会把你的 ou_... 写进下面某个文件:

ls -la ~/.openclaw/credentials | grep -i feishu || true
cat ~/.openclaw/credentials/feishu-default-allowFrom.json 2>/dev/null || true
cat ~/.openclaw/credentials/feishu-allowFrom.json 2>/dev/null || true

你日志里那个发送者 open_id(ou_...)必须出现在 allowFrom 数组里,否则就会无限配对。

然后用“显式 account=default”再 approve 一次(用飞书最新那 8 位码):

openclaw pairing approve --channel feishu --account default <CODE>

批准后再发一条新消息测试(approve 不会补处理旧消息)。

#

临时快速绕开(直接让 DM 放行,不走 pairing)

如果你只想先跑通,直接改成 allowlist(只允许你自己这个 ou_...):

openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_你的open_id"]'
openclaw gateway restart

你把 whoami + ls ~/.openclaw/credentials | grep feishu + allowFrom 文件内容贴一下(不涉及密钥),我就能判断是 “sudo/用户不对” 还是 “account 文件名/写入没生效”。

flint belfry
#

openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_你的open_id"]'
openclaw gateway restart 执行后终端卡住了

unkempt knollBOT
#

openclaw gateway restart 在 macOS 上有时会“看起来卡住”(它在等 LaunchAgent 停/起完成或在等 gateway 重新可达)。先别慌,这么处理:

1) 先按 Ctrl+C 终止当前命令(安全)

这不会“把服务杀坏”,最多只是你这个终端不再等待结果。

2) 开一个新的终端窗口/Tab,检查网关是否已经起来

openclaw gateway status
  • 如果你看到 RPC probe: ok:说明其实已经重启成功了,只是你那边命令没返回。
  • 如果 RPC probe 不 ok:继续看日志。

3) 看重启期间有没有报错(macOS 服务日志)

openclaw logs --follow
#

或直接看错误日志文件(常见在这里):

tail -n 200 ~/.openclaw/logs/gateway.err.log 2>/dev/null || true
tail -n 200 ~/.openclaw/logs/gateway.log 2>/dev/null || true

另外一个非常关键的点:你刚才 allowFrom 用的是占位符 ["ou_你的open_id"] 的话,会导致永远不匹配,结果就是“仍然不回复”(但这次不是发配对码,而是直接拦截)。

你需要把它换成你真实的 open_id(日志里那种 ou_...)。比如你之前日志里是 ou_4611...,就改成:

openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_4611125c5a1709a8727073ff864595a9"]'
openclaw gateway restart
#

如果你不确定自己的 ou_...,最简单:跑着 openclaw logs --follow,然后在飞书里再发一条消息,日志会打印 sender 的 ou_...

flint belfry
#

openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_你的open_id"]'
openclaw gateway restart
执行完后返回Restarted LaunchAgent: gui/501/ai.openclaw.gateway

unkempt knollBOT
#

很好,Restarted LaunchAgent: gui/501/ai.openclaw.gateway 说明重启成功了。

但你现在的 allowFrom 还是占位符:["ou_你的open_id"] —— 这样 永远匹配不到,所以机器人会继续“不回复”(只是这次不会再发配对码,而是直接把消息当作未授权忽略)。

你需要把它改成你真实的 open_id(ou_...)

1) 先从日志里拿到你的 open_id

在网关机器开日志:

openclaw logs --follow

然后去飞书里再给机器人发一句话。日志里会出现类似:

received message from ou_xxxxx...

#

把那个 ou_... 复制出来。

2) 把 allowFrom 改成真实的 ou_...

例如你的 open_id 是 ou_4611...,就执行:

openclaw config set channels.feishu.allowFrom '["ou_4611125c5a1709a8727073ff864595a9"]'
openclaw gateway restart

dmPolicy 你已经设成 allowlist 了,不用再改。)

3) 验证配置已生效

openclaw config get channels.feishu.allowFrom --json
#

然后再去飞书发一条新消息测试。


如果你改成真实 ou_... 后还是不回,把 openclaw logs --follow 里“收到消息之后紧跟的几行”(尤其是有没有 blocked unauthorized sender 或模型报错)贴出来,我就能继续定位下一层原因。

flint belfry
#

11:50:43 info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: received message from ou_xxxxxxxxxxxxxx in oc_xxxxxxxx387018e416d8c13e0a18 (p2p)
11:50:43 info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: blocked unauthorized sender ou_xxxxxxxxxxxxxxxx (dmPolicy=allowlist)
发送信息后的日支

unkempt knollBOT
#

日志已经把原因写出来了:

blocked unauthorized sender ... (dmPolicy=allowlist)

也就是说:你现在是 DM 允许名单模式,但 channels.feishu.allowFrom没有包含这个发消息人的 open_id(ou_...),所以它直接拦截,不会回复。

解决:把日志里的 ou_... 加到 allowFrom

在网关机器上执行(把下面的 ou_xxxxx... 换成你日志里的真实值):

openclaw config set channels.feishu.allowFrom '["ou_xxxxxxxxxxxxxxxx"]'
openclaw gateway restart

然后再去飞书 重新发一条新消息 测试。

验证是否写对了

#
openclaw config get channels.feishu.allowFrom --json

它应该输出包含你的 ou_...


如果你想“任何人都能私聊我机器人”(不推荐)

把 DM 政策改成 open,并允许 *

openclaw config set channels.feishu.dmPolicy '"open"'
openclaw config set channels.feishu.allowFrom '["*"]'
openclaw gateway restart
#

(安全上风险很大,除非你很确定要开放。)

如果你把 channels.feishu.allowFrom 当前值贴出来(打码无所谓,不含密钥),我也可以帮你确认格式有没有写错。

flint belfry
#

关闭终端后就不能运行了吗

unkempt knollBOT
#

看你是用哪种方式启动的:

1) 如果你是用“服务/LaunchAgent”在跑(推荐)

你现在看到过 Restarted LaunchAgent: gui/501/ai.openclaw.gatewayRPC probe: ok —— 这就是 后台服务模式

这种情况下:

  • 关掉终端也会继续运行
  • 你随时都能用新的终端检查:
    openclaw gateway status
    openclaw logs --follow
    

2) 如果你是用前台命令启动的(调试模式)

比如你直接跑了:

#
openclaw gateway

这种是前台进程,终端一关就停。


你可以用这条确认当前是不是服务在跑:

openclaw gateway status

只要 RPC probe: ok,就是还在运行。

flint belfry
#

好的,现在可以运行了,请问如何停止呢

unkempt knollBOT
#

停止有两种情况,对应两种命令:

如果你是后台服务(LaunchAgent)在跑(你这种大概率是)

openclaw gateway stop
openclaw gateway status

status 里会显示不再 running / RPC probe 不 ok。

如果你是前台运行(终端里直接跑 openclaw gateway 那种)

在那个终端里按:

  • Ctrl + C

如果你以后想“停掉并且不让它开机自启”,那是卸载服务:

#
openclaw gateway uninstall
flint belfry
#

如何启动

unkempt knollBOT
#

启动 OpenClaw Gateway 分两种方式(推荐用“服务模式”):

方式 A(推荐):启动后台服务(LaunchAgent)

openclaw gateway start
openclaw gateway status

看到 RPC probe: ok 就表示启动成功。

想打开 Web UI:

openclaw dashboard

看实时日志:

#
openclaw logs --follow

方式 B:前台启动(调试用,关掉终端就会停)

openclaw gateway

如果你执行 openclaw gateway start 提示服务没安装/没加载,那先装一次服务:

openclaw gateway install
openclaw gateway start
flint belfry
#

提示没权限

unkempt knollBOT
#

“提示没权限”这个信息是 飞书里提示的,还是 OpenClaw 机器人回复/日志里的?两种原因完全不一样。

先按最常见的几个点排查(基本都在这里了):

  1. 如果你是私聊机器人(DM)
  • OpenClaw 的 Feishu 默认是 dmPolicy: "pairing"没配对前会不回正常内容,而是给配对码。
  • 你需要在网关机器上执行:
    • openclaw pairing list feishu
    • openclaw pairing approve feishu <CODE>
  • 文档这里: https://docs.openclaw.ai/zh-CN/channels/feishu (看“批准配对/Access control”)
  1. 如果你是在群里 @ 机器人
#
  1. “没权限”如果是飞书 API 权限没生效(最常见)
  • 只在权限页勾选/导入还不够:需要“发布应用版本 + 审批通过”,否则调用接口会 403/no permission。
  • 特别注意必须有 im:message:send_as_bot(否则发不出去)以及接收事件 im.message.receive_v1(否则收不到)。
  1. 你说日志没错误:请你这样抓一次关键日志
  • 开两个终端/窗口:
    • A:openclaw logs --follow
    • B:在飞书里再发一条消息(DM 或群里 @)
  • 然后把日志里和这一条消息对应的几行贴出来(特别是有没有看到 im.message.receive_v1chat_id、以及任何 403/permission 字样)。

另外也麻烦发一下版本号,避免踩到旧版问题:openclaw --version

flint belfry
#

OpenClaw 机器人回复 没权限

unkempt knollBOT
#

“OpenClaw 机器人直接回复:没权限” 这个基本不是飞书应用权限没开全(那种通常会在网关日志里看到 403),而是 OpenClaw 的渠道访问控制把你拦住了——所以日志里也可能“看起来没错误”,因为这是正常的拒绝分支。

按下面顺序检查(对应文档: https://docs.openclaw.ai/channels/feishu ):

1) 你是在 私聊(DM) 机器人吗?

OpenClaw 的 Feishu DM 默认是 dmPolicy: "pairing":陌生人先配对,没配对不会让你直接用。

在运行网关的机器上执行:

openclaw pairing list feishu
openclaw pairing approve feishu <CODE>

如果你现在的配置被改成了 allowlist 模式(比如 dmPolicyallowFrom),那就会直接“没权限”。解决方式二选一:

  • dmPolicy 改回 "pairing"(推荐先这样验证通路)
  • 或者把你的 open_id 加到 channels.feishu.allowFrom: ["ou_xxx"]
#

你的 open_id(形如 ou_xxx)最简单的获取方式:DM 机器人一次,然后看 openclaw logs --follow 里打印的 open_id,或者在 openclaw pairing list feishu 里也能看到。

改完配置记得:

openclaw gateway restart

2) 如果你是在 群里 聊天

群里默认需要 @机器人 才会回(requireMention: true),另外还要确认没开群限制:

  • channels.feishu.groupPolicy 不是 "disabled"
  • 如果你设了 groupPolicy: "allowlist",必须把群的 chat_id(形如 oc_xxx)加入 groupAllowFrom
  • 如果你配了 channels.feishu.groups.<chat_id>.allowFrom,那是“群内发言人白名单”,不在名单里的人会被拒(也会出现你说的“没权限”这种体验)

把下面两样贴一下(打码 secret 就行),我就能一眼定位到底是哪种拦截:

#
  1. openclaw --version
  2. ~/.openclaw/openclaw.jsonchannels.feishu 这段配置(尤其是 dmPolicy / allowFrom / groupPolicy / groupAllowFrom / groups 相关)
flint belfry
#

如何切换模型

unkempt knollBOT
#

在 OpenClaw 里切换模型有两种方式:聊天里临时切换(只影响当前会话),或者 CLI 改默认模型(影响之后的新会话/全局默认)

1) 在飞书里切换(推荐,最快)

飞书不支持那种交互式菜单,所以直接发文本命令:

  • 查看可选模型列表(编号选择器):
    • /model
    • /model list
  • 选择某一个(用编号):
    • /model 3
  • 或者直接输入完整引用:
    • /model <provider/model>
  • 看当前会话用的模型:
    • /model status

如果你不知道有哪些能用:先 /model list,然后用编号选。

#

文档: https://docs.openclaw.ai/concepts/models#switching-models-in-chat-model

2) 在服务器上用 CLI 切换默认模型(全局/默认)

在运行网关的机器上:

openclaw models list
openclaw models set <provider/model>
openclaw models status

文档: https://docs.openclaw.ai/concepts/models#cli-commands

常见坑:提示 “Model is not allowed”

如果你/你的配置设置了 agents.defaults.models(模型白名单),那 /model 只能选白名单里的;选其他就会被拒绝,表现得像“不回复”。

这种情况:

#
  • /model list 选允许的;或
  • 把你要用的模型加进 agents.defaults.models;或
  • 移除/清空这个 allowlist。

如果你把你在飞书里输入的 /model ... 返回内容贴出来(尤其是有没有 “not allowed”),我可以告诉你是哪一种情况。

flint belfry
#

可以在配置文件中切换吗

unkempt knollBOT
#

可以的,**在配置文件里切换“默认模型”**就是改 ~/.openclaw/openclaw.json 里的 agents.defaults.model.primary(可选再配 fallbacks / allowlist)。

示例(用你自己的 provider/model 替换):

// ~/.openclaw/openclaw.json
{
  agents: {
    defaults: {
      model: {
        primary: "provider/model",
        // 可选:备用模型(按顺序兜底)
        // fallbacks: ["provider/model2"],
      },

      // 可选:模型目录/白名单(开了这个,/model 只能选这里面的)
#
      // models: {
      //   "provider/model": { alias: "Main" },
      //   "provider/model2": { alias: "Backup" },
      // },
    },
  },
}

几点注意:

  • 配置是 JSON5,而且 不能有未知字段,否则网关会拒绝启动(会表现得像“突然不工作”)。
  • 一般不需要手动重启:网关会热加载配置;不放心也可以 openclaw gateway restart
  • 配完可以用 openclaw models status 看当前解析出来的默认模型。

文档在这(含完整字段说明):https://docs.openclaw.ai/gateway/configuration (搜 “Choose and configure models”)

flint belfry
#

前端UI在compacting context的时候我关闭了页签,现在前端UI加载不出来了

unkempt knollBOT
#

这类情况一般是两种:网关没起来/端口不通,或者 UI 在浏览器端缓存(localStorage)里卡住了(比如保存了错误的 gatewayUrl/token,或某次请求出错后一直白屏)。

按这个顺序排查最快:

1) 先确认网关还活着

在网关机器上跑:

openclaw gateway status
openclaw logs --follow
  • gateway status 里要看到 Runtime: runningRPC probe: ok
  • 然后你再打开 UI,一旦有报错(401/unauthorized、1008、device identity required、JSON parse 等),日志里通常会刷出来

2) 用“干净浏览器环境”验证是不是浏览器缓存问题

  • 无痕窗口/换个浏览器 打开同一个 URL(不带任何 ?gatewayUrl=... 这种参数)
#
  • 如果无痕能正常打开:那就是你原浏览器的站点数据坏了
    → 直接对该站点 清理站点数据(localStorage / 缓存 / Service Worker),然后重开即可

UI 的 token 会存在 localStorage 里(文档也提到这一点),清掉站点数据后只需要重新粘贴 token 再 connect。

3) 你是本机开,还是远程开 Control UI?

  • 本机:建议直接开 http://127.0.0.1:18789/
  • 远程用 http://<ip>:18789/:有时会因为“非安全上下文”导致设备身份(WebCrypto)握手失败,表现为连不上/一直转
    → 最稳的是用 Tailscale Serve HTTPS 或者 SSH tunnel(见文档 /web/control-ui 的 “Insecure HTTP” 部分)

4) 你现在看到的具体症状是哪个?

麻烦回一下这 3 个点,我就能给你对症的下一步:

  1. 打开后是 白屏、还是有提示 unauthorized/1008、还是一直 loading?
  2. 你打开的 URL 是什么形式(127.0.0.1 / 局域网IP / tailscale / https)?
  3. 浏览器控制台 Console 里第一条报错(复制一行就够)
flint belfry
#

打开后是 白屏,也没有抱错一直 loading

unkempt knollBOT
#

白屏 + 一直 loading、还“不报错”,最常见就是 浏览器端缓存/站点数据把 Control UI 卡死了(尤其是 localStorage 里存了一个坏掉的 gatewayUrl / token / 旧版本资源),其次才是 网关没在正常提供 UI 静态资源

按这个顺序来,基本能秒定位:

A. 先用无痕窗口验证(最快)

  1. 无痕窗口/换个浏览器 打开同一个地址
  2. 如果无痕能正常出 UI:
    → 直接把该站点的 站点数据清掉(缓存 + localStorage + Service Worker),再重开

Chrome:地址栏左边小锁 → 站点设置 → 清除数据
或 DevTools → Application → Clear storage → Clear site data

B. 确认你打开的是“正确的 UI 地址”

在网关机器上跑一下(它会输出/打开正确的链接):

#
openclaw dashboard

如果你之前改过 gateway.controlUi.basePath,手动敲错路径也会导致看起来像“白屏一直转”。

C. 看网关是否真的在服务 UI(排除网关挂了/卡了)

在网关机器上:

openclaw gateway status
openclaw logs --follow

然后你刷新 UI 页面:

  • 如果日志里完全没有任何请求/连接出现:说明浏览器根本没打到这个网关(URL/网络/反代问题)
  • 如果有请求但 UI 还是白屏:通常是前端资源没加载/被缓存住了(回到 A 清站点数据)
#

D. 如果无痕也一样白屏(更像“UI 资源没了”)

你是 npm 安装 还是 从源码跑 的?

  • 如果是从源码跑:有可能 dist/control-ui 没 build/被清掉了,需要重新 build(文档里是 pnpm ui:build)。
  • 如果是 npm 安装:一般不会缺 dist,那就更偏向网络/反代/basePath。

你先回答两个问题我就能直接给你下一步精确操作:

  1. 你打开 UI 的 URL 是什么(127.0.0.1 还是远程 IP/域名)?
  2. 用无痕窗口打开,能不能正常出来
flint belfry
#

无痕可以打开,但是提示unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)

unkempt knollBOT
#

那就很清楚了:UI 本身没坏,无痕能打开说明静态资源 OK;现在的问题是 鉴权 + 你原浏览器的站点缓存状态有点“卡死”。

1) 先把 token 拿出来

在网关那台机器上执行:

openclaw config get gateway.auth.token

如果这里为空/没有 token,再生成一次:

openclaw doctor --generate-gateway-token

注意:--generate-gateway-token 只会在“缺失”时生成,不会帮你旋转已有 token。

#

2) 在无痕窗口里把 token 粘进去连接

在 Control UI 里打开 Settings / Gateway Access(一般是右上角设置/齿轮那里),你会看到两个输入框:Gateway TokenPassword(并排的,很容易点错)。

  • 把上面拿到的 token 粘到 Gateway Token
  • Connect

成功后无痕就能正常用了。

3) 修复你“正常窗口白屏一直 loading”

因为无痕能跑,说明正常窗口大概率是 localStorage/缓存里存了坏状态(比如旧 token 或 gatewayUrl),导致它启动就卡住。

最省事的方式:

  • 对这个站点 清除站点数据(缓存 + localStorage)
  • 重新打开 UI
  • 再按第 2 步把 token 粘进去

如果你告诉我你打开 UI 的地址是 http://127.0.0.1:18789/ 还是远程 IP/域名,我也可以顺手确认一下是不是还有 “非 localhost 需要设备配对/安全上下文” 之类的坑。

flint belfry
#

清除站点数据(缓存 + localStorage),缓存我已经清了,localStorage如何清除

unkempt knollBOT
#

在浏览器里清 localStorage 最简单有两种方法(都会把这个站点的 token/网关地址等“记忆”清掉):

方法 1:DevTools 一键清(推荐)

Chrome / Edge:

  1. 打开 Control UI 页面(白屏那个也行)
  2. F12(或 右键→检查)
  3. Application(应用)标签
  4. 左侧点 Storage(存储)→ 选择你的站点
  5. 点右侧的 Clear site data(清除站点数据)
    • 确保勾选了 Local storage(本地存储)
    • 然后刷新页面

或者:

  • 左侧 Local Storage → 选中对应域名 → 右键 Clear(清除)

Firefox:

  • F12Storage(存储)→ Local Storage → 选域名 → 右键删除/清空
#

方法 2:浏览器设置里删除该站点数据(不用 DevTools)

Chrome / Edge:

  1. 设置 → 隐私和安全 → 第三方 Cookie/站点数据
  2. 查看所有站点数据和权限
  3. 搜索你的网关域名/IP(比如 127.0.0.1 或你的域名)
  4. 删除该站点数据

清完之后重新打开 UI,再把 gateway.auth.token 粘进去连接就行。你现在用的是哪个浏览器(Chrome/Edge/Firefox)?我可以按你的界面名字对一下具体入口。

flint belfry
#

无法打开F12,使用方法2,没有查询到127的站点

unkempt knollBOT
#

如果你 打不开 F12,那大概率你是在 手机 或者 某个内置 WebView(比如飞书/微信内置浏览器) 里打开的——这种环境确实不方便清 localStorage,而且“站点数据”里也不一定按你想的方式显示 127.0.0.1

最稳的清法:在“当前页面”直接清站点数据(不需要搜索)

不管白屏不白屏,都先把这个页面打开到地址栏能看到 URL,然后:

  1. 地址栏左边点 小锁/站点信息(有时是“ⓘ”)
  2. 进入 站点设置 / Site settings
  3. 清除数据 / Clear data(或“删除/重置”)

这个操作会把该站点的 Local Storage + 缓存 一起清掉,不用你在列表里找 127.0.0.1

如果你是在 Chrome/Edge 的设置里找不到 127…

Chrome/Edge 的“所有站点数据”有时会把本地地址记成:

  • localhost
  • 或者你实际打开的 域名/内网 IP / tailscale 域名(而不是 127)
  • 甚至需要用 端口 才好搜(试试搜 18789
#

我需要你确认一个关键点

你现在打开 Control UI 的完整地址是什么?(把 token 打码即可)

  • 例如:http://127.0.0.1:18789/ 还是 http://<内网IP>:18789/ 还是 https://xxxx.ts.net/

只要你把这个 URL 发出来,我就能告诉你应该在站点数据里搜哪个关键词(以及你是不是其实在内置浏览器里,建议直接用系统浏览器打开)。

flint belfry
#

我已经清除了,但是使用openclaw dashboard打开依然白屏

unkempt knollBOT
#

如果 无痕能打开(只是缺 token 提示 unauthorized),但 正常窗口始终白屏,那几乎可以确定是:

  • 正常窗口里有东西在“干扰/劫持”Control UI(最常见:扩展/广告拦截/隐私插件/脚本注入),或
  • 你清理的不是“同一个站点源”(比如你一个用 http://127.0.0.1:18789/,另一个用 https://xxxx.ts.net/,这俩的 localStorage 是完全独立的)。

先用最省时间的验证法:

1) 先确认:无痕里把 token 粘上后能不能正常连接?

无痕里提示 gateway token missing 是正常的——把 token 粘进去 能连上 就说明网关和 UI 都没问题,只是正常窗口环境有问题。

token 获取:

openclaw config get gateway.auth.token

2) 正常窗口白屏的 3 个高概率原因 + 对应处理

A) 扩展导致白屏(最常见)

#
  • 先把所有扩展临时关掉(尤其 AdBlock / uBlock / 反跟踪 / 脚本管理器)
  • 或者直接新建一个 全新的浏览器 Profile(比“清缓存”更干净)

B) 清理的不是同一个地址

请你把你“白屏”的那个 URL 发出来(打码 token 即可),我需要确认你到底是在打开:

  • http://127.0.0.1:18789/
  • 还是 http://<内网IP>:18789/
  • 还是 https://<tailscale域名>/
    因为这三种要清的“站点数据”完全不同。

C) 浏览器卡住了(偶发)

把浏览器完全退出重启(不是只关标签页),再试一次。


另外你之前说“无法打开 F12”,你用的是桌面浏览器还是手机/内置浏览器?

  • 桌面 Chrome/Edge:打开开发者工具一般是 Ctrl+Shift+I(Mac 是 Cmd+Option+I
#
  • 如果你是在飞书/微信内置浏览器里开 Control UI,强烈建议复制链接到系统 Chrome/Edge 打开(内置 WebView 很容易各种怪问题)

你把 白屏那个 URL + 你用的浏览器/系统 回我一下,我就能精准告诉你应该清哪个站点数据/以及是不是被扩展拦了。

flint belfry
unkempt knollBOT
#

这个 URL 很关键:它不是首页,而是 直接深链到某个会话

/chat?session=agent:main:main

所以现在有两种可能:

  1. Control UI 本身没问题,只是这个 session(agent:main:main)的 chat.history 加载卡住了 → 看起来就像“白屏一直 loading”
  2. 网关/鉴权问题(但你无痕能打开并提示 token missing,说明网关和 UI 静态资源基本是好的)

先做一个最简单的分离测试:

1) 不要打开 /chat 深链,直接打开首页

在同一个正常窗口里手动输入打开:

  • http://127.0.0.1:18789/ (注意最后的 /,不要带 /chat?...

看这里能不能正常出 UI(即使提示 unauthorized 也算“出 UI 了”)。

#
  • 如果首页能打开:那就是 agent:main:main 这个会话历史卡住了。
    解决办法是在 UI 里发一个独立消息:/reset(或 /new)让它换一个新的 sessionId;或者先切换到别的 session 再回来。
  • 如果首页也白屏一直 loading:那就不是 session 卡住,而是浏览器环境/扩展之类的问题(但你说无痕可以打开,基本不太像)。

2) 用日志确认是不是 chat.history 卡住/报错

在网关机器跑:

openclaw logs --follow

然后你再打开那个白屏链接 /chat?session=agent:main:main,看看日志里有没有类似 chat.history、session 读取、JSONL 解析失败之类的报错/卡住提示。把那几行贴出来我就能判断是不是“compaction 中断导致 transcript 尾行损坏”。

你先告诉我:打开 http://127.0.0.1:18789/(不带 /chat)能不能正常显示 UI? 这一步能把问题一刀切开。

flint belfry
#

我使用的是谷歌浏览器,直接使用http://127.0.0.1:18789/会自动拼写刚才的url后缀,以下是日志14:01:09 warn gateway/ws {"subsystem":"gateway/ws"} {"cause":"unauthorized","handshake":"failed","durationMs":7,"lastFrameType":"req","lastFrameMethod":"connect","lastFrameId":"1638e2f6-0196-4806-8f99-aee5149c8581","host":"127.0.0.1:18789","origin":"http://127.0.0.1:18789","userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36","authMode":"token","authProvided":"none","authReason":"token_missing","allowTailscale":false,"client":"openclaw-control-ui","mode":"webchat","version":"dev"} closed before connect conn=77fdd642-7628-4845-a1a8-9c1ba2141f52 remote=127.0.0.1 fwd=n/a origin=http://127.0.0.1:18789 host=127.0.0.1:18789 ua=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 code=1008 reason=unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)
14:01:19 info gateway/ws {"subsystem":"gateway/ws"} webchat connected conn=0e802c20-f15c-4b5f-ada7-197140b59c5d remote=127.0.0.1 client=openclaw-control-ui webchat vdev

unkempt knollBOT
#

从你贴的日志里,其实已经把原因写死了:

authMode:"token" … authProvided:"none" … authReason:"token_missing"
reason=unauthorized: gateway token missing

也就是说:你现在这个 白屏一直 loading 的浏览器窗口,在 WebSocket 握手时根本没有带 token,所以网关直接 1008 掐掉连接——UI 就会一直转圈/白屏。

另外你后面又有一条:

webchat connected …

这说明你在另一个窗口/环境(很可能是无痕)里已经成功粘贴过 token 并连上了


解决办法(最省事、还能“长期记住 token”)

方案 A:新建一个 Chrome Profile(推荐)

#

无痕每次都会丢 token,所以你现在最好:

  1. Chrome 右上角头像 → 添加 / Add(新建一个全新的 Profile)
  2. 在这个新 Profile 里打开:http://127.0.0.1:18789/
  3. UI 会提示 missing token,然后在 Control UI settings / Gateway Access 里把 token 粘进去(那个并排的 “Gateway Token / Password” 输入框)
  4. Connect 后,这个 Profile 会把 token 存在 localStorage,以后就不会再白屏转圈了

方案 B:在当前 Profile 里重新粘贴 token

你清掉站点数据后,localStorage 里的 token 也被清掉了,所以必须重新粘贴一次。

  • 你现在这个 URL http://127.0.0.1:18789/chat?session=agent%3Amain%3Amain 会自动跳回上次会话是正常的,不影响;关键是要先把 token 存回去

Mac 上你说 “F12 打不开” 也正常

Chrome on macOS 打开开发者工具是:⌘ + ⌥ + I(Command + Option + I),不是 F12。


#

你现在方便把下面这个命令的输出也贴一下吗(不用贴 token 值本身):

openclaw config get gateway.auth.token

我想确认你确实拿到了 token,并且网关 auth 模式就是 token(从日志看是)。如果你愿意,我也可以教你用“新 Profile”方式 2 分钟搞定、以后就不用无痕了。

flint belfry
#

执行openclaw config get gateway.auth.token后控制台返回
Config warnings:\n- plugins.entries.feishu: plugin feishu: duplicate plugin id detected; later plugin may be overridden (/Users/zhangyu/.openclaw/extensions/feishu/index.ts)

🦞 OpenClaw 2026.3.2 (85377a2)
Self-hosted, self-updating, self-aware (just kidding... unless?).

OPENCLAW_REDACTED

unkempt knollBOT
#

OK,这个输出说明两件事:

  1. token 是存在的(所以 UI 那个 “gateway token missing” 就能解决——把 token 粘到 UI 里就行)
  2. 你还有一个额外的警告feishu 插件被加载了两份(~/.openclaw/extensions/feishu/index.ts 这份 + 你可能还装了 @openclaw/feishu),这不一定会导致白屏,但后面 Feishu 行为“怪异/不生效”时要优先把这个重复清掉。

先把 Control UI 连上(解决白屏 loading 的根因)

你的网关日志之前已经明确是 token_missing。清掉站点数据后,Chrome 正常窗口就不再带 token 了,所以会一直转圈。

推荐你用“新 Chrome Profile”(不是无痕)来做一次干净连接并持久保存 token:

  1. Chrome 右上角头像 → 添加(Add)/新建个人资料(Profile)
  2. 在新 Profile 打开:http://127.0.0.1:18789/
  3. 进入 Control UI 的 Settings / Gateway Access
  4. openclaw config get gateway.auth.token 输出的那个 token 粘到 Gateway Token,点 Connect

无痕能连上但不保存;新 Profile 能保存,下次就不会再 token_missing 了。

#

如果你连上后仍然“白屏一直 loading”,麻烦再贴一下 webchat connected 后面紧跟着的几行日志(看看是不是 chat.history/session 读取卡住)。


关于这个警告(建议顺手处理)

duplicate plugin id detected … ~/.openclaw/extensions/feishu/index.ts

先运行看看当前到底加载了哪一份:

openclaw plugins list

feishu 那行贴出来即可。一般建议 只保留一种来源(要么用 npm 安装的 @openclaw/feishu,要么用本地 extensions 的 feishu),避免后续“我明明改了配置但不生效”。


#

你先确认一下:用 新 Profile 粘贴 token 后,Control UI 能正常出来吗?如果还不行,把 webchat connected 之后的日志再贴一段我继续跟。

flint belfry
#

Control UI 的 Settings / Gateway Access在哪里

unkempt knollBOT
#

在 Control UI 里它不叫“弹窗设置”,而是在左侧导航里的一个卡片里(而且没连上网关时也能看到):

  1. 打开 http://127.0.0.1:18789/
  2. 左侧导航点 Control
  3. 再点 Overview
  4. 页面里找到 Gateway Access
    • 你会看到两个输入框并排:Gateway TokenPassword
  5. openclaw config get gateway.auth.token 的值粘到 Gateway Token
  6. Connect

如果你现在看到的页面没有左侧导航(只有一个一直 loading 的画面),先用你刚才说的 新 Chrome Profile / 无痕窗口 打开,这个页面通常会直接显示 “unauthorized / token missing” 以及上面的 Gateway Access 输入框。

flint belfry
#

unauthorized / token missing”在哪里,没有找到

unkempt knollBOT
#

你现在多半是**一直被带到 /chat?session=... 这个“WebChat 页面”**了,而这个页面在 token 缺失时 有时只会一直 loading,不一定把 “unauthorized / token missing” 文案渲染出来(但网关日志已经明确是 token_missing)。

我们先把你带到“能输入 token 的控制页”:

1) 强制打开根路径(避免 Chrome 自动补全到 /chat)

在新 Profile 里开一个全新标签页,然后直接复制粘贴下面这个(带一个无意义参数,专门用来防止补全):

http://127.0.0.1:18789/?fresh=1

重点:不要输入 .../chat,也不要让地址栏自动补全成之前那个 /chat?session=...

打开后你应该能看到带左侧导航的 Control UI(Control / Overview / Config 等)。

2) Gateway Access 在哪里

进去后按这个路径找:

Control → Overview → Gateway Access

#

那里有 Gateway Token 输入框,把
openclaw config get gateway.auth.token
拿到的 token 粘进去,再点 Connect

注意:不要把 token 发到 Discord 里。


如果你无论如何都会跳到 /chat(像是被配置了 basePath)

麻烦你跑一下这两个命令,把输出贴出来(不用贴 token):

openclaw config get gateway.controlUi.basePath
openclaw config get gateway.controlUi

我想确认你是不是把 Control UI 的 basePath 改成了 /chat 或者类似的路径,导致你根本进不了带 “Gateway Access” 的那个页面。