:Docker Compose 一键起 LLM + Webhook 的 TaoToken 接入配置)
1. OpenClaw 落地为什么总卡在 LLM 和 Webhook 这两步OpenClaw 是一个把大模型能力和自动化工作流串起来的开源工具你可以把它理解成一个「能听懂人话的定时任务调度器」既能按时间或关键词触发流程也能在流程里调用 LLM 做总结、分类、生成最后通过 Webhook 把结果推到飞书、企业微信、Slack 这类地方。它适合谁适合手上有重复性文本处理需求、又不想从零写调度代码的开发者比如每天要出日报、盯行情、批量生成文案的人。但真正动手部署时大部分人卡的不是 OpenClaw 本身而是两件事第一LLM 接口怎么配才能既稳定又不用为每个模型单独申请 Key第二Webhook 回调怎么验证怎么确认消息真的发出去了而不是石沉大海。我见过太多人 compose 文件跑起来了容器日志也正常结果工作流一触发就报401或者local proxy failed排查半天发现是 Base URL 写错或者 Key 没生效。这篇就按「可直接复制即用」的思路把 OpenClaw 在 Docker Compose 下的完整落地路径走一遍。核心思路是用 TaoToken 作为统一的 LLM API 通道一个 Key 打通多个模型省去在 OpenClaw 里反复切换 provider 的麻烦Webhook 部分给出可验证的配置和检查命令确保你能看到回调成功的证据而不是靠猜。先说清楚 TaoToken 在这里的角色。它是一个聚合式的模型 API 服务提供 OpenAI 兼容的接口格式也就是说 OpenClaw 里凡是填LLM_BASE_URL和LLM_API_KEY的地方都可以指向它。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 。你不需要改 OpenClaw 的源码只要把环境变量填对模型调用就走通了。下面从 compose 文件开始一步步来。每一步都给完整命令和预期结果你照着敲就行。2. TaoToken 前置准备拿到统一 Key 和 API 通道在写 compose 之前先把 TaoToken 这边的准备工作做完否则后面环境变量没东西可填。这一步不复杂但顺序别搞反。首先打开 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 这是 API Keys 管理页。登录后创建一个新的 Key复制出来存好。这个 Key 就是后面LLM_API_KEY的值格式通常是一串以特定前缀开头的字符串。注意Key 只在创建时完整显示一次关掉页面就看不到了所以先粘到临时文本里。接着确认 API 根地址。TaoToken 的接口是 OpenAI 兼容的所以 OpenClaw 里填的LLM_BASE_URL应该是https://taotoken.net/api/v1这种形式具体以文档为准。这里有个容易踩的坑很多人直接把https://taotoken.net/api填进去结果请求路径拼出来是/api/chat/completions少了一层/v1就会报 404 或者reading choices之类的解析错误。正确做法是看接入文档里的示例文档地址在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例Base URL 和路径拼接方式写得很清楚。模型 ID 也要提前定好。TaoToken 支持多种模型你在 OpenClaw 里填的模型名要和平台上的一致。比如你想用某个通用对话模型就去模型列表里确认它的准确 ID别自己猜。这一步定错了后面调用会返回模型不存在的错误。如果你打算长期跑编码类或 Agent 类工作流可以顺便看一下 Coding Plan 的说明https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它针对高频调用场景做了额度优化比按量计费更适合每天定时跑任务的用法。不过这是可选项先把基础通道跑通再说。准备工作小结一个 Key、一个正确的 Base URL带/v1、一个确认过的模型 ID。这三样齐了就可以进 compose 环节。如果你还想先在网页上试试模型通不通可以用模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 发一条消息能正常回复说明 Key 和通道没问题再去配 OpenClaw 会省很多事。3. 可复制配置docker-compose.yml 与环境变量这一节是全文的核心给的是可以直接复制粘贴的配置。先建目录再写文件最后启动。新建一个文件夹叫openclaw进去之后创建docker-compose.yml。下面这份配置在原始版本基础上做了增强把 LLM 相关变量集中管理加上了 Webhook 回调地址的占位并且补了健康检查方便你判断容器是不是真的起来了。version: 3.8 services: openclaw: image: openclaw/openclaw:latest container_name: openclaw ports: - 8000:8000 volumes: - ./data:/app/data - ./workflows:/app/workflows environment: - TZAsia/Shanghai # LLM 通道配置统一走 TaoToken - LLM_PROVIDERopenai - LLM_BASE_URLhttps://taotoken.net/api/v1 - LLM_API_KEYsk-你的TaoToken密钥 - LLM_MODEL你的模型ID # Webhook 回调配置 - WEBHOOK_URLhttps://你的回调地址/webhook - WEBHOOK_SECRET自定义一个校验串 restart: always healthcheck: test: [CMD, curl, -f, http://localhost:8000/health] interval: 30s timeout: 10s retries: 3几个关键点解释一下。LLM_PROVIDER填openai是因为 TaoToken 走的是 OpenAI 兼容协议OpenClaw 会按这个协议去拼请求。LLM_BASE_URL一定要带/v1这是最常见的错误来源。LLM_API_KEY换成你在上一节拿到的 Key。LLM_MODEL填你确认过的模型 ID。Webhook 部分WEBHOOK_URL是你接收通知的地址比如飞书机器人的 Webhook 或者你自己搭的接收端。WEBHOOK_SECRET用于签名校验防止别人伪造回调具体校验方式看你的接收端实现。如果你更习惯用.env文件管理敏感信息可以把 Key 抽出来。在openclaw目录下建一个.envLLM_API_KEYsk-你的TaoToken密钥 WEBHOOK_SECRET你的校验串然后 compose 里改成- LLM_API_KEY${LLM_API_KEY}这种引用形式。这样 compose 文件可以提交到仓库Key 不会泄露。注意.env要加进.gitignore。启动命令docker-compose up -d预期输出是拉取镜像、创建容器、启动成功。用docker-compose ps看状态应该是Up并且健康检查通过。如果状态是Restarting多半是环境变量有问题用docker-compose logs -f openclaw看日志。访问http://localhost:8000应该能看到 OpenClaw 的 Web 界面。到这里容器层面就通了但 LLM 和 Webhook 还没验证下一节专门做这件事。4. 验证请求确认 LLM 调用与 Webhook 回调都成功容器起来不等于能用必须验证两条链路LLM 调用通不通Webhook 回调收不收得到。这一节给具体命令和检查点。先验证 LLM。最直接的办法是在 OpenClaw 界面里新建一个最简单的工作流只做一步「调用模型生成一句话」然后手动触发。如果返回了模型输出说明LLM_BASE_URL、LLM_API_KEY、LLM_MODEL三个都对了。如果报错看日志里的具体信息对照下一节的排查表。更底层的验证方式是绕过 OpenClaw直接用 curl 打 TaoToken 的接口确认通道本身没问题curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: 回复两个字通了}] }预期返回一个 JSONchoices[0].message.content里是模型回复。如果这一步就失败那问题在 Key 或 Base URL跟 OpenClaw 无关先修这里。这一步通了再回去看 OpenClaw 的日志就能定位是配置没生效还是别的问题。再验证 Webhook。你需要一个能接收 POST 请求的地址。测试阶段可以用 webhook.site 这类临时接收端把生成的 URL 填到WEBHOOK_URL重启容器。然后在 OpenClaw 里触发一个带 Webhook 推送步骤的工作流。去接收端页面看有没有收到请求请求体里应该包含工作流名称、执行结果等字段。如果接收端没收到先在容器内部测一下网络能不能出去docker exec -it openclaw curl -X POST https://你的回调地址/webhook \ -H Content-Type: application/json \ -d {test: ping}这条命令如果成功说明容器网络没问题那问题在 OpenClaw 的 Webhook 配置或触发条件上。如果失败看是 DNS 解析问题还是目标地址不可达。检查点清单LLM 侧看 curl 是否返回 choicesOpenClaw 侧看工作流执行日志有没有报错Webhook 侧看接收端有没有收到 POST。三个都过了整套落地就算完成。这时候你可以把之前那三套工作流 JSON 导入进去改改定时时间和关键词就能跑真实任务了。5. 本篇常见错排查401、local proxy failed、reading choices这一节按真实报错来每个都给原因和修法。这些是我在实际部署里反复见到的你大概率会撞上其中一两个。报错一401 Unauthorized。日志里出现401或者invalid api key。原因通常是LLM_API_KEY没填对或者填了但容器没读到。先确认 Key 没有多余空格再确认 compose 里环境变量名拼写正确。如果你用了.env文件检查docker-compose config输出的最终配置里 Key 是不是空值。还有一种情况是 Key 被禁用或额度耗尽去 API Keys 页面确认状态。报错二local proxy failed。这个报错一般出现在容器内请求外部地址时。原因可能是LLM_BASE_URL写成了localhost或127.0.0.1容器里的 localhost 指向容器自己不是宿主机。改成完整的https://taotoken.net/api/v1就好。另外检查容器所在网络能不能出外网有些内网环境需要配 DNS。报错三reading choices 相关解析错误。典型信息是cannot read property choices of undefined或者reading choices。这说明请求发出去了但返回的不是预期的 OpenAI 格式。最常见原因是 Base URL 少了/v1导致请求打到了错误路径返回的是 HTML 或错误 JSON。把LLM_BASE_URL改成带/v1的完整地址即可。另一个可能是模型 ID 填错平台返回了错误结构。报错四OAuth 或鉴权跳转。如果你看到重定向到登录页或者 OAuth 相关错误说明请求被当成了未授权访问。检查Authorization头是不是Bearer开头Key 有没有拼错。TaoToken 用的是 Bearer Token 方式不需要额外的 OAuth 流程。报错五Webhook 收到但内容为空。接收端收到了 POST但 body 是空的。检查 OpenClaw 工作流里推送步骤的模板配置确认字段映射正确。有些版本需要显式指定Content-Type: application/json。排查通用方法先看docker-compose logs -f openclaw的实时日志报错信息通常很具体。再用上一节的 curl 命令单独测 LLM 通道把 OpenClaw 和通道问题隔离开。最后用docker exec进容器测网络。三步下来基本能定位。如果你在配置过程中需要对照更多接入示例接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有不同场景的完整参数说明。Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。6. 把工作流真正跑起来导入 JSON 与长期运行建议配置通了之后最后一步是把实际工作流导入并让它自动跑。OpenClaw 后台的工作流管理支持直接粘贴 JSON你可以把日常办公、行情监控、内容创作这三类模板导进去改掉定时时间和关键词就能用。导入步骤登录http://localhost:8000进工作流管理新建工作流把 JSON 粘进去保存后启用。定时触发的工作流会按 cron 表达式执行手动触发的可以随时点运行测试。建议先手动跑一次确认 LLM 调用和 Webhook 推送都正常再开定时。长期运行有几个实用建议。第一把restart: always保留容器崩溃会自动拉起。第二定期看日志尤其是 Webhook 失败的情况可以加个失败重试逻辑。第三如果任务量大考虑用 Coding Plan 的额度方案比按量计费更划算入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。第四Key 定期轮换旧 Key 及时在控制台禁用。如果你还没决定用哪个模型可以先去模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 试几条对比一下输出质量再定。整套流程走下来从 compose 启动到工作流自动跑顺利的话半小时内能完成。真正花时间的是排查环境变量和 Webhook 回调这两块按上面的检查点走能省不少来回。