1. 为什么 OpenClaw 部署总在“最后一步”翻车
OpenClaw 是一个把大模型能力接到聊天工具里的 AI Agent 框架,能做什么?简单说,你给它一个模型 Key,它就能在飞书、钉钉这类 IM 里变成一个会干活、会调工具的机器人。适合谁?适合想把 AI Agent 落到团队日常沟通里的开发者、运维和产品同学。
但真正上手你会发现,卡人的从来不是“装不上”,而是装完之后连不通。我见过太多人本地跑通了,一进 Docker 就报local proxy failed;飞书那边事件订阅配好了,机器人却一直不回消息;Key 填了三遍,日志里还是401 Unauthorized。这些问题单独看都不难,难的是它们分散在六条不同的部署路径上,每条路径的坑还不一样。
这篇就按六种路径来拆:手动源码、AI Agent 代部署、云端托管、Docker 容器化、桌面端、第三方集成平台。重点放在 Docker 和飞书接入这两块,因为这两块报错最集中。同时把 endpoint 和 Key 统一改到 TaoToken 的 settings 示例给全,让你不用在多个厂商后台之间来回切换。
先说一个核心判断:OpenClaw 的部署难度,八成不在框架本身,而在“模型接入”和“IM 回调”这两个外部依赖上。模型接入这块,如果你用官方直连,网络和计费都容易出问题;用统一网关就能省掉很多事。IM 回调这块,飞书的权限和回调地址是最容易配错的。把这两块吃透,六种路径你都能走通。
下面每个路径我都会给适用场景、关键命令和典型报错。你可以先看对比表,再挑一条跟着做。
| 路径 | 难度 | 耗时 | 灵活性 | 推荐场景 |
|---|---|---|---|---|
| 手动源码 | 高 | 2-3h | 高 | 深度定制、读源码 |
| AI Agent 代部署 | 中 | 20min | 中 | 非技术背景、快速验证 |
| 云端托管 | 低 | 10min | 中 | 零运维、临时演示 |
| Docker 容器化 | 中高 | 30min | 高 | 企业多实例、环境隔离 |
| 桌面端 | 低 | 5min | 低 | 个人体验 |
| 第三方平台 | 低 | 15min | 低 | 业务人员、可视化 |
这张表不是让你按难度排序走,而是按你的真实需求选。比如你只是想验证飞书机器人能不能跑,桌面端加一个统一 Key 就够了;如果你要给团队部署多实例,那 Docker 是唯一合理的选择。
2. TaoToken 前置:把 endpoint 和 Key 统一到一处
在讲六种路径之前,先把模型接入这块统一掉。OpenClaw 支持多种模型后端,但如果你每个路径都去配一遍官方 Key,会非常痛苦:Claude 一个后台、OpenAI 一个后台、国产模型又一个后台,Key 散落各处,换环境就要重配。
TaoToken 在这里的作用是提供一个统一的 API 入口。官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。你只需要一个 Key,就能在 OpenClaw 里切换不同模型,不用改代码,只改配置。
具体怎么拿 Key:进控制台,在 API Keys 页面创建一个新 Key,复制出来。这个 Key 就是后面所有路径里要填的OPENAI_API_KEY或ANTHROPIC_API_KEY。注意,OpenClaw 很多配置项沿用了 OpenAI 的字段名,但实际请求会打到 TaoToken 的 endpoint,所以 Base URL 一定要改成https://taotoken.net/api。
这里有个关键点:OpenClaw 的模型配置通常分两块,一块是 provider 的 base_url,一块是 model 的 id。TaoToken 兼容 OpenAI 的接口格式,所以 base_url 填https://taotoken.net/api,model 填你实际要用的模型 ID,比如claude-sonnet-4-5或gpt-4o。如果你用的是 Claude Code 这类走 Anthropic 协议的工具,endpoint 要写成https://taotoken.net/api加上对应的路径,具体看接入文档。
为什么建议统一到 TaoToken?三个原因。第一,Key 只存一份,Docker、本地、云端都用同一个,换环境不用重新申请。第二,计费和用量在一个后台看,不用对多个账单。第三,模型切换成本低,今天用 Claude 写代码,明天用国产模型跑中文任务,只改一个 model 字段。
如果你还没创建 Key,现在可以去控制台建一个。建完之后,先别急着配 OpenClaw,用一条 curl 命令验证连通性:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "ping"}] }'返回里有choices字段就说明 Key 和 endpoint 都没问题。这一步很重要,因为后面 OpenClaw 报的很多错,根源其实在 Key 或 endpoint 上,先单独验证能帮你排除一大半干扰。
3. 六种路径的可复制配置:Docker Compose 与飞书接入
这一节是全文的核心,把六种路径里最常用的配置片段给全。重点放在 Docker 和飞书,因为这两块最容易出问题。
先说 Docker。OpenClaw 的 Docker 部署,核心是一个docker-compose.yml。下面这份可以直接复制,改掉 Key 和飞书参数就能跑:
version: "3.8" services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "3000:3000" environment: - OPENAI_API_KEY=sk-your-taotoken-key - OPENAI_BASE_URL=https://taotoken.net/api - DEFAULT_MODEL=claude-sonnet-4-5 - FEISHU_APP_ID=cli_xxxxxxxx - FEISHU_APP_SECRET=xxxxxxxxxxxxxxxx - FEISHU_VERIFICATION_TOKEN=xxxxxxxx - FEISHU_ENCRYPT_KEY=xxxxxxxx volumes: - ./data:/app/data - ./logs:/app/logs几个参数说明。OPENAI_BASE_URL必须改成https://taotoken.net/api,否则容器里会去请求默认的 OpenAI 地址,直接超时。DEFAULT_MODEL填你在 TaoToken 后台能用的模型 ID。飞书那四个参数来自飞书开放平台,后面单独讲。
如果你不用 Docker Compose,用docker run也行:
docker run -d \ --name openclaw \ -p 3000:3000 \ -e OPENAI_API_KEY=sk-your-taotoken-key \ -e OPENAI_BASE_URL=https://taotoken.net/api \ -e DEFAULT_MODEL=claude-sonnet-4-5 \ -e FEISHU_APP_ID=cli_xxxxxxxx \ -e FEISHU_APP_SECRET=xxxxxxxxxxxxxxxx \ -v $(pwd)/data:/app/data \ openclaw/openclaw:latest再说飞书接入。飞书这边要配的东西比模型多,因为涉及权限和回调。步骤是:进飞书开放平台,创建企业自建应用,拿到 App ID 和 App Secret。然后在“权限管理”里开启im:chat:readonly和im:message:send_as_bot,这两个是机器人收发消息的最小权限。接着在“事件订阅”里配置请求地址,填你的 OpenClaw 服务地址加回调路径,比如https://your-domain.com/api/feishu/event。最后把 Verification Token 和 Encrypt Key 填到 OpenClaw 的环境变量里。
飞书回调最容易错的地方是地址。如果你在本地跑,飞书是访问不到localhost的,必须用一个公网可达的地址。Docker 部署时,如果 OpenClaw 在容器里,回调地址要指向宿主机的公网 IP 或域名,不是容器内部地址。
对于手动源码部署,配置主要在.env文件里:
OPENAI_API_KEY=sk-your-taotoken-key OPENAI_BASE_URL=https://taotoken.net/api DEFAULT_MODEL=claude-sonnet-4-5 FEISHU_APP_ID=cli_xxxxxxxx FEISHU_APP_SECRET=xxxxxxxxxxxxxxxx对于桌面端和第三方平台,通常是在图形界面里填 Base URL 和 Key。Base URL 填https://taotoken.net/api,Key 填 TaoToken 的 Key,模型选你需要的。这类工具的好处是不用碰命令行,坏处是灵活性低,适合快速验证。
如果你用的是 Claude Code 或 Cline 这类工具配合 OpenClaw,配置会走settings.json或auth.json。以 Claude Code 为例,~/.claude/settings.json里要写:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-your-taotoken-key", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }这三件套——Base URL、Key、Model ID——在 Claude Code、Cline MCP、Codex 的auth.json里都是必须的,缺一个就连不上。Cline 的 MCP 配置类似,在 MCP 设置里填 endpoint 和 Key。Codex 的auth.json则是:
{ "openai_api_key": "sk-your-taotoken-key", "openai_base_url": "https://taotoken.net/api" }把这些配置统一到 TaoToken,好处是你不用为每个工具单独申请 Key。一个 Key 走遍所有路径,这是最省心的做法。
4. 验证请求与成功结果:从 curl 到飞书对话
配置写完,下一步是验证。验证分两层:先验证模型连通,再验证飞书回调。
模型连通性用 curl 最快。前面给过一条,这里再给一条针对 OpenClaw 内部调用的:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "用一句话介绍 OpenClaw"} ], "max_tokens": 100 }'成功的话,返回 JSON 里会有choices[0].message.content,内容是模型生成的回答。如果返回401,说明 Key 不对;如果返回404,说明 endpoint 路径不对;如果一直卡住不返回,多半是网络问题,检查OPENAI_BASE_URL是不是写成了https://taotoken.net/api而不是别的。
Docker 环境下验证,先进容器:
docker exec -it openclaw sh curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $OPENAI_API_KEY"能列出模型列表,说明容器内网络和 Key 都正常。这一步能帮你区分是容器网络问题还是配置问题。
飞书验证稍微麻烦一点。先在飞书开放平台点“事件订阅”,飞书会发一个 challenge 请求到你的回调地址。OpenClaw 收到后要正确返回 challenge 值,否则飞书会提示“回调地址校验失败”。如果你看到这个提示,先检查 OpenClaw 服务是不是在跑,再检查回调地址是不是公网可达,最后检查 Verification Token 有没有填对。
回调校验通过后,在飞书里给机器人发一条消息,比如“你好”。正常的话,机器人会回复。如果没回复,去 OpenClaw 的日志里看:
docker logs -f openclaw日志里会显示收到的消息和模型调用过程。如果看到401,是 Key 问题;如果看到local proxy failed,是网络或 endpoint 问题;如果看到reading choices相关报错,是模型返回格式不对,多半是 model ID 填错了。
成功的结果长这样:飞书里发“帮我写个 Python 快排”,机器人几秒后返回一段代码。日志里能看到完整的请求和响应链路。到这一步,说明你的 OpenClaw 已经真正跑起来了。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节把最常见的四类报错拆开讲,每条都给原因和修法。
第一类,401 Unauthorized。这是 Key 问题。可能原因有三个:Key 复制时多了空格;Key 已经失效或被删;环境变量没生效。修法是先单独用 curl 验证 Key,再检查 OpenClaw 读到的环境变量。Docker 里可以用docker exec openclaw env | grep API_KEY看实际值。如果 Key 没问题但还是 401,检查OPENAI_BASE_URL是不是漏了/api或者写成了别的地址。
第二类,local proxy failed。这个报错通常出现在 Docker 或云端环境,意思是 OpenClaw 尝试走本地代理但失败了。原因多半是环境变量里配了HTTP_PROXY或HTTPS_PROXY,但代理地址在容器里不可达。修法是去掉这两个环境变量,或者把代理地址改成容器能访问的地址。如果你用的是 TaoToken 的 endpoint,本身不需要额外代理,直接删掉代理配置即可。
第三类,reading choices相关报错。完整报错可能是error reading choices: unexpected end of JSON input或choices field missing。这是模型返回的 JSON 格式和 OpenClaw 预期的不一致。最常见原因是 model ID 填错了,比如填了一个 TaoToken 后台不存在的模型,返回的是错误信息而不是正常的 choices 结构。修法是去 TaoToken 后台确认模型 ID,填一个确定可用的。另一个原因是max_tokens设得太小,返回被截断,也会导致 JSON 解析失败。
第四类,OAuth 相关报错。如果你在飞书接入时看到OAuth failed或invalid app credentials,说明 App ID 或 App Secret 不对。去飞书开放平台重新复制一遍,注意不要带空格。如果报redirect_uri mismatch,说明飞书应用里配的回调地址和实际请求的不一致,改成一致即可。
除了这四类,还有一个高频问题是飞书机器人不回复但日志没报错。这通常是权限问题,检查im:message:send_as_bot有没有开。另一个可能是机器人没被拉进群,或者没被授权在群里发言。
排查的顺序建议是:先 curl 验证 Key 和 endpoint,再 docker logs 看 OpenClaw 日志,最后去飞书开放平台看事件订阅状态。按这个顺序走,大部分问题都能定位到。
6. 把 Key 和 endpoint 固定下来,再谈长期使用
六种路径走下来,你会发现真正需要长期维护的只有两样东西:模型接入和 IM 回调。IM 回调配好之后基本不动,模型接入则会随着你换模型、换工具而频繁调整。所以把 endpoint 和 Key 统一到 TaoToken,是降低长期维护成本的关键一步。
如果你只是临时验证,桌面端加一个 Key 就够了。如果你要给团队部署,Docker 加统一 Key 是最稳的组合。如果你要长期跑 Agent 任务,建议用 Coding Plan,把模型调用和额度管理放在一起,省得每次换环境都重新配。
接入文档里有各工具的详细配置示例,遇到不确定的字段可以去对照。模型对话页面可以直接测试模型连通性,不用写代码。API Keys 页面管理你的 Key,控制台看用量。
最后给一个实用建议:把OPENAI_BASE_URL和OPENAI_API_KEY写成环境变量,不要硬编码在代码或 Compose 文件里。这样换环境时只改环境变量,不用动配置文件。Docker 里可以用.env文件配合docker-compose,本地可以用export,云端用平台的环境变量管理。这一步做了,后面换模型、换 Key 都会轻松很多。