#我对接了fei shu,并且开放了所有权限,但是我在fei shu与机器人聊天,它不回复我,在日志中没有发现错误信息,很苦恼,求大神
1 messages · Page 1 of 1 (latest)
先按这几个“最常见坑”排查一下(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 里对应的几行。
在飞书开通权限列表,我没有找到 im.message.receive_v1 这个权限信息
im.message.receive_v1 不是“权限(scope)”,所以你在「权限列表」里找不到它——它是 事件订阅的事件名。
你要去飞书开放平台的这个位置加它:
- 飞书开放平台 → 你的应用 → 事件订阅(Event Subscription)
- 订阅方式选:使用长连接接收事件(WebSocket)(有的界面叫“长连接”)
- 在「订阅事件 / 添加事件」里搜索 “接收消息”(通常会显示为“接收消息 v1”),选中后对应的 key 就是:
im.message.receive_v1 - 保存后(很关键)确保你的 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 拦了”。
我重新安装了,但是一直卡在[2/3] Installing OpenClaw
✓ Git already installed
· Installing OpenClaw v2026.2.26
这一步卡住通常不是“飞书问题”,而是安装脚本在下载/解包/npm 安装阶段没输出(国内网络到 npm/GitHub 也很容易卡住)。
先确认两件事:
- 你这行
Installing OpenClaw v2026.2.26卡了多久?(>10 分钟基本就是卡死/网络问题) - 你用的是什么环境: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 拉取问题。)
操作系统是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
你贴出来的这段还只是“安装器 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 上尤其多)
在你没贴日志前,先给你一个“对号入座”的速查:
-
Node 版本不对
OpenClaw 需要 Node >= 22。如果你是 18/20,npm install -g openclaw会直接失败(通常是EBADENGINE)。 -
全局安装权限问题(EACCES)
如果npm config get prefix指向/usr/local之类,可能会权限不足。一般建议用 nvm / fnm / brew 的 node@22,避免 sudo 全局装。 -
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 没有任何输出,基本只有两种情况:
- 这个 tmp 日志文件是空的(0 字节)
- 你 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 编译失败,然后给你对应的最短修复步骤。
我要卸载掉,进行重新安装
在 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 失败,重装前最好顺便把那个根因一起解决,否则会再卡一次)。
已经卸载完毕了
好,那现在从“干净状态”重装会顺很多。
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)导致的。
MacBook-Pro Desktop % node -v
npm -v
v24.12.0
11.6.2
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,跟我说一下我给你对应的一行命令)。
安装过程中卡住了,我怕可以强行停止安装,使用其他参数安装吗
可以的,卡住时直接 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 行输出贴一下,我可以判断你该用上面哪条命令最合适。
我们的对话会被其他用户看到吗
会的——你现在是在 Discord 服务器的公开频道/帖子里发消息(#fei-shu-fei-shu 这个 thread),所以所有有权限看到这个频道/帖子的用户都能看到我们这段对话。
几点建议:
- 不要贴:App Secret、Bot Token、Gateway Token、任何 API Key、登录 Cookie、完整的配置文件(除非你先打码)。
- 贴日志时:把类似
token=...、appSecret、Authorization:这些字段都替换成***。 - 如果你想只让少数人看到:可以改成发到私聊,或者用你们内部的私密频道/私密 thread。
安装完成后,查看版本信息command not found: openclaw,返回command not found: openclaw
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
09:43:25 [feishu] feishu[default]: received message from ou_4611125c5a1709a8727073ff864595a9 in oc_c48cfe0f3731387018e416d8c13e0a18 (p2p) 日志正常,飞书权限全部配置,发送信息依然不回复我
这行日志很关键:
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 还是发送/模型阶段。
list有,但是我已经给openclaw pairing approve feishu <CODE>了。这时候重启服务,发送信息,机器人回复访问未配置,并给了一个新的配对吗
这种现象(你 approve 过,但 重启后又发新的配对码,还提示“访问未配置”)基本只说明一件事:
你 approve 的那份配对/allowFrom 状态,没有被当前这个正在跑的 Gateway 读到。
最常见原因是:CLI 用的 state/profile 和后台服务用的不是同一个(等价于“你在 A 目录 approve,但服务从 B 目录读”)。
下面按顺序核对(都不会泄露密钥):
1) 先确认:你重启的 Gateway 用的是哪个配置/状态目录
在网关机器上跑:
openclaw gateway status
把输出里这两行相关信息贴出来即可(不要贴 token):
Config (cli)vsConfig (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),一旦写错文件,就会一直让你配对。
你先把这两份输出贴一下我就能直接告诉你卡在哪:
openclaw gateway status(重点看 Config(cli/service) 是否一致)ls -la ~/.openclaw/credentials | grep -i feishu
如果最后发现 allowFrom 文件里已经有 ou_... 但仍然反复配对,那就更像是账号作用域/读取文件名的问题,我再带你对齐 accountId(必要时我会让你跑一下 openclaw pairing approve --help 看是否有 --account 参数,避免我瞎猜参数名)。
Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json
Config (cli) 和 Config (service) 一致 👍
那还会反复出新配对码,通常只剩两种原因:
- 配对“批准”没有写进 allowFrom 存储文件(或写进了,但不是当前账号/实例读的那份)
- 账号作用域没对上(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 之类的隔离配置)。
安装完成后,如何配置deepseek模型
如果你说的 “DeepSeek 模型” 是 DeepSeek 官方 API(deepseek-chat / deepseek-reasoner),在 OpenClaw 里通常用 自定义 OpenAI-compatible provider 来配(models.providers)。
参考:
- OpenClaw 自定义 provider 文档: https://docs.openclaw.ai/gateway/configuration-reference#custom-providers-and-base-urls
- DeepSeek 官方 API: https://api-docs.deepseek.com/ (base_url=
https://api.deepseek.com,也可用/v1)
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,告诉我你是哪一种,我给你对应的最短配置方式。
引导Model/auth provider选择模型时选择哪个
如果你目标是用 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,我给你对应“引导里每一步该怎么填”的最短路径。
Endpoint compatibility
│ ● OpenAI-compatible (Uses /chat/completions)
│ ○ Anthropic-compatible
│ ○ Unknown (detect automatically)
我已经填写key了,这个选哪个
选 OpenAI-compatible (Uses /chat/completions)。
原因:DeepSeek 官方 API 是 OpenAI 格式兼容的(就是走 /chat/completions 这套接口),所以在 OpenClaw 的 “Endpoint compatibility” 这里要选 OpenAI-compatible。
后面一般还会让你填:
- Base URL:
https://api.deepseek.com/v1 - Model id:
deepseek-chat(常规)或deepseek-reasoner(推理)
配完后建议跑一下验证:
openclaw models status
openclaw gateway restart
Model ID
│ deepseek-reasoner
│
◇ Verification successful.
│
◆ Endpoint ID
│ custom-api-deepseek-com█
Endpoint ID输入什么
Endpoint ID 就是你这个自定义供应商在 OpenClaw 配置里的 provider 名称/标识符(会变成 models.providers.<EndpointID> 的那个 key),用来组成最终的模型引用。
你可以:
- 直接用一个简单的:
deepseek(最推荐) - 或者区分用途:
deepseek-official/deepseek-cn之类 - 你现在看到的默认值
custom-api-deepseek-com也可以直接保留,只是名字比较长。
选了 deepseek 的话,后面模型一般会以这种形式出现/引用:
deepseek/deepseek-reasonerdeepseek/deepseek-chat
只要记住:Endpoint ID 要唯一、好记、全小写 + -/_ 最稳。
Model alias (optional) 是否选择
Model alias (optional) 可以不选/留空,不影响使用。
什么时候建议填一个:
- 你想在聊天里用更短的名字切模型,比如
/model deepseek、/model r1这种。
例子(选一个就行):
- 对
deepseek-reasoner:填r1或deepseek-r1 - 对
deepseek-chat:填deepseek或v3
如果你只配一个模型、也不打算频繁切换:直接跳过最省事。
Select channel (QuickStart)
│ Feishu/Lark (飞书)
│
◆ Install Feishu plugin?
│ ● Download from npm (@openclaw/feishu)
│ ○ Skip for now
该如何选
选 Download from npm (@openclaw/feishu)。
原因:Feishu/Lark 是 插件渠道,不装插件网关就没法连接飞书收发消息。
只有在你已经手动安装过插件(比如你从源码路径 ./extensions/feishu 装过)或者想稍后再配渠道时,才选 “Skip for now”。
选完后如果 npm 下载慢/卡住(国内常见),可以先完成引导再用命令装:
openclaw plugins install @openclaw/feishu
openclaw gateway restart
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
-
Which Feishu domain?
你如果用的是国内版「飞书」(域名feishu.cn),就选 Feishu (China)。
如果是国际版 Lark(larksuite.com),才选 Lark。 -
Group chat policy 选哪个?(看你想不想让它在群里回复)
- Disabled:只用私聊(DM),最省事也最安全。
- Allowlist:只在你指定的群里回复(推荐默认选这个,后面再把需要的群加进去)。
- Open:所有群都可用,但通常仍需要 @mention 才会回(适合你明确要“到处都能用”)。
你之前日志是 (p2p) 私聊场景,其实跟 group policy 无关;如果你目前只想先把私聊跑通,直接选 Disabled 或 Allowlist 都可以。
我选的open,是否在任何群聊都可以添加使用
你选了 Open 的意思是:只要机器人在群里,它就“允许”在所有群聊里处理消息/回复(不用你逐个把群加到 allowlist)。
但注意两点(非常关键):
-
默认仍然需要 @ 提及才会回复
Feishu 插件默认requireMention: true。所以在群里一般要 @机器人 它才回;不 @ 的消息可能只会被记录到历史,不触发回复。
(如果你想某个群“不用 @ 也回”,需要对那个群单独设置requireMention: false。) -
安全风险更高
Open = 群里任何人都能触发机器人(只要 @ 到它)。如果你只是自己用,通常更建议 Allowlist 或只开特定群。
文档在这里: https://docs.openclaw.ai/channels/feishu (里面有 groupPolicy/requireMention 的配置示例)
如果你想我给你一个“只在某几个群可用,其他群不响应”的配置,我也可以按你的需求写一段最小 config。
Set GOOGLE_PLACES_API_KEY for goplaces?
│ ○ Yes / ● No
└
选 No 就行。
GOOGLE_PLACES_API_KEY 是给一个叫 goplaces 的工具/技能用的(查地点、地址、POI 之类),跟飞书接入、DeepSeek 模型都没关系。
只有当你之后想让机器人做“查餐厅/地点/地址/附近信息”这类事情,才需要选 Yes 并提供 Google Places API Key。
我选择Open the Web UI后,在窗口输入内容,回复我gent failed before reply: Model context window too small (4096 tokens). Minimum is 16000.
Logs: openclaw logs --follow
这个报错的意思很直白:你当前选的模型在 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。
EndpointID 这个在哪里
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-com 或 deepseek)就是 Endpoint ID。
另外你也可以用:
openclaw models status
里面会显示当前默认模型类似 custom-api-deepseek-com/deepseek-reasoner,斜杠前面那段也是 Endpoint ID。
"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
}
]
}
}
},
你找到问题根因了:你这个 deepseek provider 里把模型元数据写成了
contextWindow: 4096maxTokens: 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,但真实环境别这么放)。推荐做法:
- 把 key 放到
~/.openclaw/.env:
echo 'DEEPSEEK_API_KEY=sk-...' >> ~/.openclaw/.env
- config 里用引用:
"apiKey": "${DEEPSEEK_API_KEY}"
如果你之前真的在 Discord 里粘贴过真实 key,建议立刻去 DeepSeek 平台把 key rotate 掉。
你改完 contextWindow/maxTokens 后,如果 Web UI 还是不回,把 openclaw models status 里关于 deepseek 的那几行贴出来(打码 key),我再帮你对齐。
Restarted LaunchAgent: gui/501/ai.openclaw.gateway
很好,这表示网关服务(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 旋转/作废。
如何启动
启动 OpenClaw Gateway 有两种方式(推荐用“服务模式”):
方式 A(推荐):启动后台服务(LaunchAgent)
openclaw gateway start
openclaw gateway status
看 openclaw gateway status 里 RPC probe: ok 就表示启动成功。
想看实时日志:
openclaw logs --follow
打开 Web UI(控制台):
openclaw dashboard
方式 B:前台运行(调试用,关掉终端就停)
openclaw gateway
你刚才已经看到 Restarted LaunchAgent: gui/501/ai.openclaw.gateway,一般说明服务已经重启了。现在直接跑:
openclaw gateway status
把输出贴出来(尤其是 RPC probe 那行),我就能确认它是否已经在跑。
RPC probe: ok
很好,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),基本就能定位最后卡在哪一步。
飞书给我发了一个配对码,如何使用,目前给飞书发送信息是不回复我的
飞书发给你的这个 配对码(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),我可以直接告诉你是被哪条策略拦住了。
配置完了配对码,发信息不回复我
你现在的现象一般是两种情况之一:
- 其实还在被“未授权”拦截(allowFrom 没真正写进去 / 账号作用域不对)
- 已经进到 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” 还是 “模型调用/发送失败”。
我配置了新的配对码,然后飞书发送信息,它又发给我一个新的配对信息
这说明 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 文件内容(打码无所谓)贴一下,我就能继续帮你把“为什么写不进去/为什么读不到”定位到根。
Service env: OPENCLAW_GATEWAY_PORT=18789
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 文件名/写入没生效”。
openclaw config set channels.feishu.dmPolicy '"allowlist"'
openclaw config set channels.feishu.allowFrom '["ou_你的open_id"]'
openclaw gateway restart 执行后终端卡住了
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_...。
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
很好,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 或模型报错)贴出来,我就能继续定位下一层原因。
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)
发送信息后的日支
日志已经把原因写出来了:
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 当前值贴出来(打码无所谓,不含密钥),我也可以帮你确认格式有没有写错。
关闭终端后就不能运行了吗
看你是用哪种方式启动的:
1) 如果你是用“服务/LaunchAgent”在跑(推荐)
你现在看到过 Restarted LaunchAgent: gui/501/ai.openclaw.gateway、RPC probe: ok —— 这就是 后台服务模式。
这种情况下:
- 关掉终端也会继续运行
- 你随时都能用新的终端检查:
openclaw gateway status openclaw logs --follow
2) 如果你是用前台命令启动的(调试模式)
比如你直接跑了:
openclaw gateway
这种是前台进程,终端一关就停。
你可以用这条确认当前是不是服务在跑:
openclaw gateway status
只要 RPC probe: ok,就是还在运行。
好的,现在可以运行了,请问如何停止呢
停止有两种情况,对应两种命令:
如果你是后台服务(LaunchAgent)在跑(你这种大概率是)
openclaw gateway stop
openclaw gateway status
status 里会显示不再 running / RPC probe 不 ok。
如果你是前台运行(终端里直接跑 openclaw gateway 那种)
在那个终端里按:
Ctrl + C
如果你以后想“停掉并且不让它开机自启”,那是卸载服务:
openclaw gateway uninstall
如何启动
启动 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
提示没权限
“提示没权限”这个信息是 飞书里提示的,还是 OpenClaw 机器人回复/日志里的?两种原因完全不一样。
先按最常见的几个点排查(基本都在这里了):
- 如果你是私聊机器人(DM)
- OpenClaw 的 Feishu 默认是
dmPolicy: "pairing",没配对前会不回正常内容,而是给配对码。 - 你需要在网关机器上执行:
openclaw pairing list feishuopenclaw pairing approve feishu <CODE>
- 文档这里: https://docs.openclaw.ai/zh-CN/channels/feishu (看“批准配对/Access control”)
- 如果你是在群里 @ 机器人
- 默认 必须 @mention 才会回复(
requireMention: true)。 - 同时确认:
- 机器人已经被拉进群
channels.feishu.groupPolicy不是"disabled"(默认是"open")
- 文档这里也有排查: https://docs.openclaw.ai/channels/feishu#troubleshooting
- “没权限”如果是飞书 API 权限没生效(最常见)
- 只在权限页勾选/导入还不够:需要“发布应用版本 + 审批通过”,否则调用接口会 403/no permission。
- 特别注意必须有
im:message:send_as_bot(否则发不出去)以及接收事件im.message.receive_v1(否则收不到)。
- 你说日志没错误:请你这样抓一次关键日志
- 开两个终端/窗口:
- A:
openclaw logs --follow - B:在飞书里再发一条消息(DM 或群里 @)
- A:
- 然后把日志里和这一条消息对应的几行贴出来(特别是有没有看到
im.message.receive_v1、chat_id、以及任何 403/permission 字样)。
另外也麻烦发一下版本号,避免踩到旧版问题:openclaw --version
OpenClaw 机器人回复 没权限
“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 模式(比如 dmPolicy 或 allowFrom),那就会直接“没权限”。解决方式二选一:
- 把
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 就行),我就能一眼定位到底是哪种拦截:
openclaw --version- 你
~/.openclaw/openclaw.json里channels.feishu这段配置(尤其是dmPolicy / allowFrom / groupPolicy / groupAllowFrom / groups相关)
如何切换模型
在 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”),我可以告诉你是哪一种情况。
可以在配置文件中切换吗
可以的,**在配置文件里切换“默认模型”**就是改 ~/.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”)
前端UI在compacting context的时候我关闭了页签,现在前端UI加载不出来了
这类情况一般是两种:网关没起来/端口不通,或者 UI 在浏览器端缓存(localStorage)里卡住了(比如保存了错误的 gatewayUrl/token,或某次请求出错后一直白屏)。
按这个顺序排查最快:
1) 先确认网关还活着
在网关机器上跑:
openclaw gateway status
openclaw logs --follow
gateway status里要看到Runtime: running且RPC 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 个点,我就能给你对症的下一步:
- 打开后是 白屏、还是有提示 unauthorized/1008、还是一直 loading?
- 你打开的 URL 是什么形式(127.0.0.1 / 局域网IP / tailscale / https)?
- 浏览器控制台 Console 里第一条报错(复制一行就够)
打开后是 白屏,也没有抱错一直 loading
白屏 + 一直 loading、还“不报错”,最常见就是 浏览器端缓存/站点数据把 Control UI 卡死了(尤其是 localStorage 里存了一个坏掉的 gatewayUrl / token / 旧版本资源),其次才是 网关没在正常提供 UI 静态资源。
按这个顺序来,基本能秒定位:
A. 先用无痕窗口验证(最快)
- 用 无痕窗口/换个浏览器 打开同一个地址
- 如果无痕能正常出 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。
你先回答两个问题我就能直接给你下一步精确操作:
- 你打开 UI 的 URL 是什么(127.0.0.1 还是远程 IP/域名)?
- 用无痕窗口打开,能不能正常出来?
无痕可以打开,但是提示unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)
那就很清楚了: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 Token 和 Password(并排的,很容易点错)。
- 把上面拿到的 token 粘到 Gateway Token
- 点 Connect
成功后无痕就能正常用了。
3) 修复你“正常窗口白屏一直 loading”
因为无痕能跑,说明正常窗口大概率是 localStorage/缓存里存了坏状态(比如旧 token 或 gatewayUrl),导致它启动就卡住。
最省事的方式:
- 对这个站点 清除站点数据(缓存 + localStorage)
- 重新打开 UI
- 再按第 2 步把 token 粘进去
如果你告诉我你打开 UI 的地址是 http://127.0.0.1:18789/ 还是远程 IP/域名,我也可以顺手确认一下是不是还有 “非 localhost 需要设备配对/安全上下文” 之类的坑。
清除站点数据(缓存 + localStorage),缓存我已经清了,localStorage如何清除
在浏览器里清 localStorage 最简单有两种方法(都会把这个站点的 token/网关地址等“记忆”清掉):
方法 1:DevTools 一键清(推荐)
Chrome / Edge:
- 打开 Control UI 页面(白屏那个也行)
- 按
F12(或 右键→检查) - 进 Application(应用)标签
- 左侧点 Storage(存储)→ 选择你的站点
- 点右侧的 Clear site data(清除站点数据)
- 确保勾选了 Local storage(本地存储)
- 然后刷新页面
或者:
- 左侧 Local Storage → 选中对应域名 → 右键 Clear(清除)
Firefox:
F12→ Storage(存储)→ Local Storage → 选域名 → 右键删除/清空
方法 2:浏览器设置里删除该站点数据(不用 DevTools)
Chrome / Edge:
- 设置 → 隐私和安全 → 第三方 Cookie/站点数据
- 查看所有站点数据和权限
- 搜索你的网关域名/IP(比如
127.0.0.1或你的域名) - 删除该站点数据
清完之后重新打开 UI,再把 gateway.auth.token 粘进去连接就行。你现在用的是哪个浏览器(Chrome/Edge/Firefox)?我可以按你的界面名字对一下具体入口。
无法打开F12,使用方法2,没有查询到127的站点
如果你 打不开 F12,那大概率你是在 手机 或者 某个内置 WebView(比如飞书/微信内置浏览器) 里打开的——这种环境确实不方便清 localStorage,而且“站点数据”里也不一定按你想的方式显示 127.0.0.1。
最稳的清法:在“当前页面”直接清站点数据(不需要搜索)
不管白屏不白屏,都先把这个页面打开到地址栏能看到 URL,然后:
- 地址栏左边点 小锁/站点信息(有时是“ⓘ”)
- 进入 站点设置 / Site settings
- 点 清除数据 / 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 发出来,我就能告诉你应该在站点数据里搜哪个关键词(以及你是不是其实在内置浏览器里,建议直接用系统浏览器打开)。
我已经清除了,但是使用openclaw dashboard打开依然白屏
如果 无痕能打开(只是缺 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 + 你用的浏览器/系统 回我一下,我就能精准告诉你应该清哪个站点数据/以及是不是被扩展拦了。
这个 URL 很关键:它不是首页,而是 直接深链到某个会话:
/chat?session=agent:main:main
所以现在有两种可能:
- Control UI 本身没问题,只是这个 session(
agent:main:main)的chat.history加载卡住了 → 看起来就像“白屏一直 loading” - 网关/鉴权问题(但你无痕能打开并提示 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? 这一步能把问题一刀切开。
我使用的是谷歌浏览器,直接使用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
从你贴的日志里,其实已经把原因写死了:
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,所以你现在最好:
- Chrome 右上角头像 → 添加 / Add(新建一个全新的 Profile)
- 在这个新 Profile 里打开:
http://127.0.0.1:18789/ - UI 会提示 missing token,然后在 Control UI settings / Gateway Access 里把 token 粘进去(那个并排的 “Gateway Token / Password” 输入框)
- 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 分钟搞定、以后就不用无痕了。
执行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
OK,这个输出说明两件事:
- token 是存在的(所以 UI 那个 “gateway token missing” 就能解决——把 token 粘到 UI 里就行)
- 你还有一个额外的警告:
feishu插件被加载了两份(~/.openclaw/extensions/feishu/index.ts这份 + 你可能还装了 @openclaw/feishu),这不一定会导致白屏,但后面 Feishu 行为“怪异/不生效”时要优先把这个重复清掉。
先把 Control UI 连上(解决白屏 loading 的根因)
你的网关日志之前已经明确是 token_missing。清掉站点数据后,Chrome 正常窗口就不再带 token 了,所以会一直转圈。
推荐你用“新 Chrome Profile”(不是无痕)来做一次干净连接并持久保存 token:
- Chrome 右上角头像 → 添加(Add)/新建个人资料(Profile)
- 在新 Profile 打开:
http://127.0.0.1:18789/ - 进入 Control UI 的 Settings / Gateway Access
- 把
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 之后的日志再贴一段我继续跟。
Control UI 的 Settings / Gateway Access在哪里
在 Control UI 里它不叫“弹窗设置”,而是在左侧导航里的一个卡片里(而且没连上网关时也能看到):
- 打开
http://127.0.0.1:18789/ - 左侧导航点 Control
- 再点 Overview
- 页面里找到 Gateway Access
- 你会看到两个输入框并排:Gateway Token 和 Password
- 把
openclaw config get gateway.auth.token的值粘到 Gateway Token - 点 Connect
如果你现在看到的页面没有左侧导航(只有一个一直 loading 的画面),先用你刚才说的 新 Chrome Profile / 无痕窗口 打开,这个页面通常会直接显示 “unauthorized / token missing” 以及上面的 Gateway Access 输入框。
unauthorized / token missing”在哪里,没有找到
你现在多半是**一直被带到 /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” 的那个页面。