1. OpenClaw 微信部署报错到底卡在哪:先看清问题全貌
OpenClaw 微信安装与排错这件事,说白了就是把一个开源智能体工具接到微信通道上,让它能收发消息、跑自动化任务。它适合谁?做私域运营的、想搭自动客服的、准备把 AI 助理塞进微信工作流的团队。但真正动手时,十个人里有八个会先撞上部署报错:扫码没反应、容器起不来、日志里刷local proxy failed、请求回来reading choices解析失败、OAuth 授权转圈。这些报错看着五花八门,根子上其实就三类——环境没对齐、通道配置写错、模型 Key 通道没打通。
我先把这三类拆开讲清楚,你后面排查才不会东一榔头西一棒子。
第一类是环境类报错。OpenClaw 对 Node.js、Docker、微信客户端版本都有硬要求。Node.js 低于 16.14.0,openclaw init直接抛语法错误;Docker 低于 20.10.0,docker-compose up -d会卡在镜像拉取阶段;微信客户端版本太旧,插件市场里根本找不到 ClawBot 入口,扫码自然没弹窗。这类报错的特征是:命令还没跑到业务逻辑就挂了,错误信息里带版本号或者not found。
第二类是通道配置类报错。OpenClaw 的微信通道靠config.yml里的weixin.channel.enabled开关控制,这个值写成false或者拼错成wechat,服务能启动但通道是哑的,日志里只会安静地什么都不做。云端部署时如果安全组没放行 80/443,二维码生成命令会超时,报generate-qrcode timeout。这类报错的特征是:服务进程活着,但功能不工作。
第三类是模型 Key 通道类报错,也是最多人卡住的地方。OpenClaw 本身是个壳,它要调大模型才能干活。很多人装完 OpenClaw 发现消息能收但回复是空的,或者日志里出现401 Unauthorized、invalid api key、reading choices这种字样。reading choices这个报错特别典型——它说明请求发出去了,但返回的 JSON 结构里没有choices字段,通常是因为 Base URL 指向了一个不兼容 OpenAI 格式的端点,或者 Key 根本没通过鉴权,返回的是错误页而不是模型响应。
这里就要引出本文的核心解法:用 TaoToken 统一 Key 通道来接管 OpenClaw 的模型调用。TaoToken 提供的是 OpenAI 兼容的 API 通道,Base URL 固定、Key 统一管理、模型 ID 明确,正好把上面第三类报错从源头掐掉。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是不带参数的 https://taotoken.net/api 。你只要把 OpenClaw 的模型配置指向这个通道,401和reading choices基本不会再出现。
我实测下来的经验是:部署报错里真正难缠的不是环境问题,环境问题查版本号就能定位;难的是模型通道这种"服务活着但功能哑了"的隐性故障。所以这篇的排错路径是——先过环境检查,再配 TaoToken 通道,最后用验证请求确认整条链路通了。下面按这个顺序走。
2. TaoToken 统一 Key 通道前置准备:把模型调用这层先铺好
在动 OpenClaw 之前,我建议你先把 TaoToken 这层准备好。原因很简单:OpenClaw 的部署流程里,模型配置是嵌在config.yml里的,如果你等 OpenClaw 装完再去调 Key,一旦报错你分不清是 OpenClaw 的问题还是 Key 的问题。先把通道单独验证通,后面 OpenClaw 接进来就是水到渠成。
TaoToken 是什么?它是一个统一的大模型 API 通道,把多家模型的调用收敛到一个 Base URL 和一套 Key 体系下。对 OpenClaw 这种需要调模型的工具来说,好处是配置项固定——你不需要为每个模型改端点,只要换 Model ID 就行。适合谁?适合不想在多个平台之间来回切 Key、又想让 OpenClaw 稳定跑起来的开发者。
前置准备分三步:拿 Key、确认 Base URL、选 Model ID。
第一步,拿 Key。访问 https://taotoken.net/api-keys ,登录后创建一个新的 API Key。这里有个坑要注意:Key 只在创建时完整显示一次,复制后存到安全的地方,页面刷新就看不到了。我试过创建完没存,结果只能删了重建。Key 的格式通常是一串以特定前缀开头的字符串,复制时别带空格。
第二步,确认 Base URL。TaoToken 的 API 端点是 https://taotoken.net/api ,注意这里不加任何 UTM 参数,就是干净的 API 地址。OpenClaw 配置里填的 Base URL 就是这个,后面拼/v1/chat/completions之类的路径由 OpenClaw 自己处理。如果你填成了带?utm_source=...的地址,请求会带上多余参数,某些情况下会导致鉴权失败。
第三步,选 Model ID。TaoToken 支持的模型 ID 是明确的字符串,比如claude-sonnet-4-5这类。你可以在模型对话页面 https://taotoken.net/models 先试一下哪个模型响应符合预期,再去 OpenClaw 里配。这一步别跳过——OpenClaw 里 Model ID 写错,报错就是model not found或者reading choices,因为端点返回的是错误结构。
把这三样准备好,你可以先用一个最简单的 curl 验证通道通不通:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'如果返回的 JSON 里有choices数组,说明通道是通的。如果返回401,检查 Key 有没有复制错;如果返回结构里没有choices,检查 Base URL 是不是写成了https://taotoken.net/api而不是别的。这一步验证通过,再去装 OpenClaw,你就能排除掉模型通道这一整类问题。
顺便说一句,如果你后面要长期跑编码类或 Agent 类任务,可以了解下 Coding Plan https://taotoken.net/coding-plan ,它在调用额度和模型选择上有针对性的安排。但本文聚焦的是 OpenClaw 微信接入,先把基础通道跑通最重要。
3. OpenClaw 微信安装可复制配置:config.yml 与 docker-compose 片段
这一节是全文的核心,我直接把可复制的配置片段给你,路径和字段名都按 OpenClaw 的实际结构来。你照着填,能避开大部分安装报错。
先说目录结构。云端部署我建议用这个布局:
/opt/openclaw/weixin/ ├── docker-compose.yml ├── config.yml ├── data/ │ ├── logs/ │ └── qrcode/data目录挂载出来,是为了防止容器重启后日志和二维码丢失——这个坑我踩过,容器一重启,之前扫的码全没了,得重新生成。
先看docker-compose.yml:
version: "3.8" services: openclaw-weixin: image: openclaw/weixin:latest container_name: openclaw-weixin restart: unless-stopped ports: - "8080:8080" volumes: - ./config.yml:/app/config.yml - ./data/logs:/app/logs - ./data/qrcode:/app/qrcode environment: - TZ=Asia/Shanghai - NODE_ENV=production deploy: resources: limits: cpus: "2.0" memory: 2G这里几个点要注意。restart: unless-stopped保证容器异常退出后自动拉起,生产环境必加。volumes里config.yml是只读挂载进去的,你在宿主机改完配置,docker-compose restart就生效,不用进容器。资源限制按 2 核 2G 给,OpenClaw 本身不重,但模型请求并发高的时候内存会涨,给足余量。
再看config.yml,这是模型通道配置的关键:
server: port: 8080 host: 0.0.0.0 weixin: channel: enabled: true type: weixin heartbeat: interval: 30000 timeout: 10000 reconnect: true model: provider: openai-compatible base_url: "https://taotoken.net/api" api_key: "你的TaoToken Key" model_id: "claude-sonnet-4-5" max_tokens: 2048 temperature: 0.7 logging: level: info path: /app/logs/weixin.log逐字段说。weixin.channel.enabled必须是true,写成false通道就是哑的。type是weixin,别拼成wechat,OpenClaw 认的是前者。heartbeat三个参数控制心跳和重连,interval30 秒、timeout10 秒是实测比较稳的值,调太短会频繁重连,调太长断线感知慢。
model这一段是重点。provider填openai-compatible,因为 TaoToken 是 OpenAI 兼容格式。base_url填https://taotoken.net/api,注意结尾不要带斜杠,OpenClaw 内部会自己拼路径,你多写一个斜杠会变成//v1/...,某些网关会拒绝。api_key填你第二步拿到的 Key。model_id填你在模型对话页面验证过的那个 ID。
如果你用的是 Claude Code 类的接入方式,配置结构会略有不同,但三件套不变:Base URL、Key、Model ID。这三个值在任何 OpenAI 兼容客户端里都是核心,缺一个就连不上。
配置写完,启动命令:
cd /opt/openclaw/weixin docker-compose up -d docker-compose logs -f openclaw-weixin日志里看到weixin channel connected和model provider ready两行,说明通道和模型都就绪了。如果只看到前者没看到后者,回去检查model段。
生成绑定二维码:
docker exec -it openclaw-weixin openclaw channels generate-qrcode --channel weixin二维码会输出到data/qrcode/目录,用微信扫码授权。扫码后日志出现connected就成功了。
4. 验证请求与成功结果:怎么确认整条链路真的通了
配置写完不代表通了,得验证。我见过太多人配置填完就以为完事,结果消息发出去没回复,回头查半天。这一节给你一套从内到外的验证动作。
第一层验证:容器状态。执行docker-compose ps,看openclaw-weixin的状态是不是Up。如果是Restarting或者Exited,先看日志docker-compose logs --tail=50 openclaw-weixin,通常是配置语法错误或者端口占用。
第二层验证:模型通道。在容器内直接发一个测试请求:
docker exec -it openclaw-weixin sh -c ' curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的Key" \ -H "Content-Type: application/json" \ -d "{\"model\":\"claude-sonnet-4-5\",\"messages\":[{\"role\":\"user\",\"content\":\"test\"}],\"max_tokens\":16}" '返回 JSON 里有choices[0].message.content,说明容器到 TaoToken 的链路是通的。这一步能过,401和reading choices就不会再出现。
第三层验证:微信通道。用另一个微信号给绑定的号发一条消息,比如"你好"。观察日志:
tail -f /opt/openclaw/weixin/data/logs/weixin.log正常流程会依次打印message received、model request sent、model response received、message sent。如果卡在model request sent没有下一步,说明模型通道有问题,回第二层查。如果卡在message received没有model request sent,说明通道配置没生效,检查weixin.channel.enabled。
第四层验证:端到端。微信里收到 AI 的回复,内容合理、延迟在可接受范围(通常 2-5 秒),就算整条链路通了。
成功的结果长这样:日志四行齐全,微信收到回复,docker-compose ps状态稳定Up。到这一步,OpenClaw 微信接入就算完成了。
如果你在验证模型那层想更直观地对比不同模型的表现,可以去模型对话页面 https://taotoken.net/models 手动试几条,确认 Model ID 和响应质量符合预期,再回 OpenClaw 里固定下来。
5. 本篇常见报错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错逐条对照,你遇到哪个查哪个。
报错一:401 Unauthorized
日志里出现401或者invalid api key。原因就三个:Key 复制错了、Key 被删了、请求头格式不对。排查动作:先确认config.yml里api_key没有多余空格和换行;再用第 4 节的 curl 命令单独测 Key,如果 curl 也 401,说明 Key 本身无效,去 https://taotoken.net/api-keys 重新创建一个。注意 Key 只在创建时显示一次,别指望在列表页能再看到完整值。
报错二:local proxy failed
这个报错通常出现在容器网络层。日志里写local proxy failed: connection refused或者dial tcp timeout。原因是容器内 DNS 解析不了taotoken.net,或者宿主机防火墙拦了出站 443。排查动作:进容器docker exec -it openclaw-weixin sh,执行nslookup taotoken.net,如果解析失败,给容器配 DNS:
services: openclaw-weixin: dns: - 8.8.8.8 - 1.1.1.1如果 DNS 正常但连接超时,检查宿主机出站规则,确保 443 端口放行。这个报错和"代理"无关,纯粹是网络可达性问题,别往别的方向想。
报错三:reading choices
日志里出现failed to parse response: reading choices或者choices field missing。这个报错的意思是:请求发出去了,返回了,但返回的 JSON 里没有choices字段。原因通常是 Base URL 指向了错误的端点,或者 Model ID 不存在导致返回了错误结构。排查动作:确认base_url是https://taotoken.net/api,结尾无斜杠;确认model_id是有效值,去模型对话页面核对。如果两个都对还报这个错,用 curl 直接打端点看返回结构,对比正常响应差在哪。
报错四:OAuth 授权失败 / 扫码无响应
扫码后弹窗秒消失,或者授权转圈后失败。原因分几种:二维码过期(默认有效期几分钟)、服务没启动、微信客户端版本太低、账号风控。排查动作:先确认容器是Up状态;重新生成二维码docker exec -it openclaw-weixin openclaw channels generate-qrcode --channel weixin;确认微信版本在 8.0.70(iOS)或 8.0.69(安卓)以上;如果账号是新注册或异常状态,换一个已实名、状态正常的号试。
报错五:Codex auth.json 相关
如果你在 OpenClaw 里集成了 Codex 类工具,可能会遇到auth.json读取失败。这个文件里存的是鉴权信息,格式必须是合法 JSON。排查动作:检查auth.json路径是否正确、JSON 有没有语法错误(多余逗号、缺引号)。如果你用的是 TaoToken 通道,其实不需要单独的auth.json,Base URL + Key + Model ID 三件套配在config.yml里就够了,auth.json是另一套体系的产物,别混用。
报错六:CC Switch / Cline MCP 配置冲突
如果你同时装了 CC Switch 或 Cline 的 MCP 配置,可能出现端口冲突或配置覆盖。排查动作:确认 OpenClaw 用的 8080 端口没被占用,netstat -tlnp | grep 8080;检查 MCP 配置有没有改写全局的模型端点。这两类工具和 OpenClaw 可以共存,但配置要隔离,别让一个的 Base URL 覆盖了另一个。
排查的核心思路是:先分层(环境层、通道层、模型层),再定位(看日志卡在哪一步),最后对照(用 curl 单独验证那一层)。别一上来就重装,重装解决不了配置错误。
6. 把通道固定下来:后续扩展与长期使用建议
整条链路跑通之后,我建议你做两件事,让这套东西长期稳定。
第一件,把配置纳入版本管理。config.yml和docker-compose.yml用 git 管起来,但api_key别直接提交,用环境变量注入:
environment: - TAOTOKEN_API_KEY=${TAOTOKEN_API_KEY}然后config.yml里写api_key: "${TAOTOKEN_API_KEY}"。这样换 Key 不用改配置文件,改环境变量重启就行。
第二件,给日志加轮转。OpenClaw 跑久了日志会撑满磁盘,docker-compose.yml里加:
logging: driver: "json-file" options: max-size: "10m" max-file: "3"这样单文件最大 10M,保留 3 个,磁盘不会爆。
后续扩展方向,如果你要把 OpenClaw 接到更多渠道,TaoToken 的统一 Key 通道优势就体现出来了——换渠道不用换 Key,Base URL 和 Model ID 复用,配置成本低。长期跑编码或 Agent 任务的话,Coding Plan https://taotoken.net/coding-plan 在额度上更合适,可以去了解下。
最后说个实用技巧:每次改完config.yml,别急着重启整个容器,先docker exec -it openclaw-weixin openclaw config validate校验配置语法,通过了再docker-compose restart。这个习惯能帮你省掉很多"改错一个字符排查半小时"的时间。配置校验通过、日志四行齐全、微信收到回复,这三步都过了,你的 OpenClaw 微信接入就是稳的。