1. openclaw 接入 qq 时pnpm workspace 到底卡在哪openclaw 是一个把多渠道消息接入统一处理的开源框架qq 是它支持的通道之一适合在本地多包仓库里做机器人调试。你如果正在用 pnpm workspace 管理 openclaw 的多个子包大概率会遇到这样一幕装openclaw/channel-qqbot的时候终端直接甩出ERR_PNPM_ADDING_TO_ROOT或者装完了通道却起不来日志里全是模块找不到。这两个现象看着像一回事其实是两类问题——一个是 pnpm 的工作区保护机制在拦你另一个是接入配置没对齐。我试过在根目录直接pnpm add结果被 pnpm 挡回来当时以为是网络问题折腾半天才发现是 workspace 结构在起作用。pnpm 不允许你随手往根目录塞依赖因为根package.json是工作区的锚点乱加依赖会破坏子包之间的链接关系。所以排查的第一步是先分清你面对的是「依赖装不进去」还是「装进去了但通道连不上」。前者是 workspace 链接问题后者多半是 config.toml 或 settings.json 里的接入参数没写对。这篇就按这个思路走先给你一份可复制的 workspace 级配置骨架再给 TaoToken 统一 Key 的接入片段然后一步步验证依赖安装、通道连通、报错日志定位。目标很明确——让你能自己判断到底是 pnpm 的锅还是配置的锅。2. 前置准备TaoToken 统一 Key 与 openclaw 环境在动配置之前先把 Key 和环境理顺。openclaw 接入 qq 通道时模型调用这一层可以走 TaoToken 的统一入口这样你多个子包共用一套 Key不用在每个包里重复填。TaoToken 的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置里填这个就行。你需要先拿到 Key。登录后进控制台在 API Keys 页面创建一个复制出来备用。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你后面要长期跑编码类或 Agent 类任务可以看下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用场景。环境这边确认三件事Node 版本建议 18 以上pnpm 版本 8 以上pnpm -v看一眼openclaw 仓库已经 clone 到本地并且是 workspace 结构。所谓 workspace 结构就是根目录有个pnpm-workspace.yaml里面用packages:列出了所有子包路径。你可以先cat pnpm-workspace.yaml确认一下如果这个文件不存在那你的仓库根本不是 workspace后面的-w报错也就不会出现问题方向要换。注意TaoToken 是模型调用的统一接入层不是用来替代编辑器或本地运行时的。openclaw 本身的依赖安装、通道逻辑还是走 pnpm 和 Node两者别混。3. 可复制的 workspace 级配置骨架这一节给你两份骨架一份是 pnpm workspace 层面的依赖处理方式一份是 openclaw 接入 qq 通道的 config.toml 和 settings.json。先解决依赖装不进去的问题。3.1 依赖安装-w 与 --filter 怎么选ERR_PNPM_ADDING_TO_ROOT的根因是你在 workspace 根目录执行了pnpm add而 pnpm 默认不允许往根加依赖。两种正规解法如果你确实要把 qq 通道依赖加到根比如根包负责统一启动显式加-wpnpm add openclaw/channel-qqbot -w完整写法等价pnpm add openclaw/channel-qqbot --workspace-root更规范的做法是加到具体子包用--filter指定包名。假设你的核心包叫openclaw-corepnpm add openclaw/channel-qqbot --filter openclaw-core子包名从各子包package.json的name字段拿。你可以先pnpm ls -r --depth -1列出所有包名确认要装到哪个。至于pnpm config set ignore-workspace-root-check true这个只建议临时调试用它会永久关掉根目录检查之后你误操作往根塞依赖也不报错工作区结构容易乱。排查完记得改回来pnpm config set ignore-workspace-root-check false。3.2 config.toml 骨架openclaw 的通道配置一般放在根目录或子包的config.toml。下面这份是 qq 通道加 TaoToken 接入的最小骨架字段名按你实际版本微调[channel.qq] enabled true # qq 机器人相关凭证按官方申请结果填 app_id 你的_app_id token 你的_qq_token # 消息接收模式本地调试常用 websocket mode websocket [model] # 统一走 TaoToken 入口 provider taotoken base_url https://taotoken.net/api api_key 你的_TaoToken_Key model claude-3-5-sonnet [log] level debugbase_url填https://taotoken.net/api不要带 UTM 后缀。api_key就是前面在 API Keys 页面拿到的那个。3.3 settings.json 骨架有些 openclaw 版本用settings.json管理运行时参数和 config.toml 分工不同。下面这份对应 workspace 根级{ workspace: { rootCheck: true, linkMode: isolated }, channel: { qq: { enabled: true, reconnect: true, reconnectInterval: 5000 } }, model: { provider: taotoken, baseUrl: https://taotoken.net/api, apiKey: 你的_TaoToken_Key } }linkMode设isolated是 pnpm 的默认链接策略子包依赖各自隔离避免版本串味。如果你之前手动改过hoist相关配置先还原成默认再排查。4. 逐步验证依赖、通道、日志三步走配置写完别急着启动按顺序验证每步都有明确的成功信号。4.1 依赖安装验证先装依赖观察输出pnpm install成功的话最后会显示Done in Xs没有ERR_PNPM_开头的报错。如果还有ERR_PNPM_ADDING_TO_ROOT说明你某条 add 命令没带-w或--filter回去补上。装完确认 qq 通道包在不在pnpm ls openclaw/channel-qqbot -r能列出包名和版本就说明依赖链接正常。这一步过了workspace 链接问题基本排除。4.2 通道连通验证启动 openclaw把日志级别开到 debugpnpm --filter openclaw-core start看日志里有没有channel qq connected或类似的连接成功字样。如果卡在连接阶段重点看两处qq 的app_id/token是否正确以及mode是否和你的机器人配置匹配。本地调试用 websocket 模式时确认没有别的进程占用同一连接。4.3 模型调用验证通道连上后发一条测试消息触发模型调用。如果日志里出现 401 或 403多半是 TaoToken Key 没填对或过期回 API Keys 页面重新生成一个。如果出现连接超时检查base_url是不是写成了带 UTM 的地址正确写法是https://taotoken.net/api。想单独验证模型通不通可以用模型对话页面发一条测试https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 那边能直接看到返回省得在 openclaw 里绕。三步都过了说明依赖、通道、模型调用全链路正常。哪一步卡住问题就锁定在哪一层。5. 本篇常见报错排查把几个高频报错和对应动作列一下方便你对号入座。ERR_PNPM_ADDING_TO_ROOT根目录执行 add 没带-w。加-w或改用--filter装到子包。Cannot find module openclaw/channel-qqbot依赖没装成功或者装到了错误的子包。用pnpm ls -r确认包在哪个位置再检查启动命令的--filter是否指向了正确的包。401 Unauthorized/403 ForbiddenTaoToken Key 错误或过期。去 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新生成更新 config.toml 和 settings.json 里的api_key。ECONNREFUSED或连接超时base_url写错或者本地网络到 API 入口不通。确认填的是https://taotoken.net/api不带多余参数。qq 通道反复重连app_id/token不匹配或mode选错。对照 qq 机器人后台的配置逐项核对。workspace 内子包版本冲突linkMode被改过或者某个子包手动装了不同版本的同一依赖。还原linkMode为isolated然后pnpm install重装。提示排查时把日志级别设成 debug报错定位会快很多。生产环境记得调回 info不然日志量太大。6. 后续接入与长期使用建议依赖和配置跑通之后如果你打算长期在 openclaw 里跑编码类或 Agent 类任务可以了解下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它针对高频调用场景做了优化。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例遇到参数不确定的时候翻一下比猜快。如果你用的是 Claude Code 这类工具链Anthropic 兼容接入的说明在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 配置方式和 openclaw 里的base_url思路一致。最后说个实际经验workspace 里改配置后别只重启单个子包最好在根目录pnpm install一次再启动让链接关系重新建立。很多「改了没生效」的情况其实是 pnpm 的软链接还指向旧路径。