1. 为什么要在 OpenClaw 里接上 Claude Code
如果你正在用 OpenClaw 跑多 Agent 协作,大概率会遇到一个很具体的瓶颈:日常开发任务都堆在 OpenClaw 里,token 消耗飞快,但遇到真正棘手的技术问题,效果又不够稳,最后还是得手动切到 Claude Code 去处理。我组织过一组模拟软件公司的 Agent,最多的时候有 47 个,平时只跟 CEO 角色沟通,让它去调度其他 Agent 干活。跑下来发现,OpenClaw 里的 coding agent 基本没怎么被用起来,Claude 的调用量几乎为零,可偏偏那些难啃的问题,还是得靠 CC。
问题就出在链路上:OpenClaw 和 Claude Code 是两个独立的执行体,前者不知道后者的存在,后者也不会主动接管任务。ACP(Agent Client Protocol)就是为解决这类通信而生的标准,它定义了代码编辑器与编码代理之间的交互方式。而 ACPX 是 ACP 的一个无头 CLI 实现,专门用来让 OpenClaw 这类客户端通过结构化协议去调用 Claude Code,实现双向任务委派、会话共享和并行工作流。
说白了,配好之后,你在飞书聊天窗口里发消息,对面不再是 OpenClaw 的某个 Agent,而是直接连上了 Claude Code,让它操作你所在机器的开发环境。这篇就聚焦这条链路怎么搭:TaoToken 统一 Key 的 config.toml 与 settings.json 骨架、ACPX 插件安装、飞书会话建立,以及一次端到端验证。适合已经在用 OpenClaw、想把手动切 CC 的动作自动化掉的开发者。
2. TaoToken 前置:统一 Key 与 API 通道
在动 ACPX 之前,先把 Key 和 API 通道理顺。OpenClaw 和 Claude Code 如果各自配一套 Key,后面排查问题会非常痛苦,所以建议统一走 TaoToken 的 API 通道,一个 Key 覆盖两个执行体。
TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api ,注意这个地址后面不加任何 UTM 参数。你需要先去控制台创建一个 API Key,然后把它同时写进 OpenClaw 的配置和 Claude Code 的 settings.json。
这里有个容易踩的坑:Claude Code 读取的是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个环境变量,或者 settings.json 里的对应字段。如果你只改了 OpenClaw 的 config.toml,CC 那边还是走默认通道,就会出现「OpenClaw 能调通、CC 报 401」的割裂现象。所以统一 Key 的意义不只是省事,更是让 ACPX 转发请求时不会因为两套凭证打架。
创建 Key 的入口在控制台的 API Keys 页面,建议单独建一个给 ACPX 链路用的 Key,方便后续按调用来源做区分。拿到 Key 之后先别急着配 ACPX,把下面两段配置分别落到对应文件里,再往下走。
3. 可复制配置:config.toml 与 settings.json 骨架
3.1 OpenClaw 的 config.toml
OpenClaw 的配置核心是两件事:让 acpx 插件被允许加载,以及把 ACP 后端指向 acpx。下面这段可以直接抄,注意permissionMode必须设成approve-all,否则 Claude Code 拿不到权限,什么也干不了。
[plugins] allow = ["acpx"] [plugins.entries.acpx] enabled = true [plugins.entries.acpx.config] command = "acpx" permissionMode = "approve-all" [acp] enabled = true backend = "acpx" defaultAgent = "claude" allowedAgents = ["claude", "codex", "cursor", "gemini", "pi"]allowedAgents按你自己的实际情况裁剪,用不到的先删掉,减少会话建立时的探测开销。defaultAgent设成 claude,这样飞书里/acp spawn不指定 agent 时默认就连 Claude Code。
3.2 Claude Code 的 settings.json
CC 这边要保证它走的是 TaoToken 的通道,并且允许被 ACPX 以无头方式拉起。settings.json 放在~/.claude/settings.json,骨架如下:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的_TaoToken_Key" }, "permissions": { "allow": ["Bash", "Read", "Write", "Edit"] } }permissions.allow里至少要放开 Bash、Read、Write、Edit,不然 CC 被 ACPX 调起来之后,连读文件都会被拦。如果你在 config.toml 里已经设了approve-all,这里的权限列表是双保险,建议保留。
3.3 安装 acpx 插件与 npm 包
acpx 分两层:OpenClaw 的集成插件,和实际干活的 npm 包。两个都装齐,OpenClaw 才能无缝用上 ACP 能力。
# 安装 OpenClaw 的 acpx 插件 openclaw plugins install @openclaw/acpx # 确认插件已注册 openclaw plugins list # 安装 acpx npm 包(实际功能实现层) npm install -g acpx@latest # 安装 acpx 的 skill 到 ~/.claude 下 npx acpx@latest --skill install acpx插件默认会落到~/.npm-global/lib/node_modules/openclaw/dist/extensions/acpx/,用openclaw plugins list能看到 acpx 条目就说明装好了。npm 包则装在~/.npm-global/lib/node_modules/acpx。两条命令都跑完,再重启一次 OpenClaw,让插件和配置生效。
4. 验证请求:飞书里跑通一次端到端调用
ACPX 有个明确限制:它不能在 OpenClaw 的网页版聊天窗口里用,必须在飞书里操作。所以验证动作全部在飞书机器人聊天窗口完成。
第一步,建立持久会话。在飞书窗口输入:
/acp spawn claude --mode persistent --thread auto--mode persistent保证会话不会因为一次空闲就断掉,--thread auto让消息自动归到对应线程。执行后,你这个飞书机器人就直连上 OpenClaw 所在机器的 Claude Code 了。注意,之前你和 OpenClaw Agent 的对话历史,CC 是不知道的,除非你明确把上下文传给它。
第二步,查会话状态。输入:
/acp status正常会返回类似这样的结构:
session: agent:claude:acp:cee86339-9f98-4269-9fec-477a3a5bca6d backend: acpx agent: claude acpx session id: f8d9115f-3e61-4ea1-a552-a54898378698 sessionMode: persistent state: idle runtimeOptions: cwd=/home/band/.openclaw/workspace capabilities: session/set_config_option, session/set_mode, session/status看到backend: acpx、agent: claude、sessionMode: persistent这三项,说明链路已经通了。cwd是 CC 的工作目录,后面它执行命令、读写文件都在这个目录下,建议提前确认这个路径是你想要的工程目录。
第三步,发一条真实任务验证。直接在飞书里发一句让它干活的话,比如「在当前目录建一个 hello.py,打印当前时间,然后运行它」。如果 CC 正常执行并返回结果,说明从飞书到 ACPX 到 Claude Code 的整条链路已经跑通。这一步比看 status 更有说服力,因为 status 只证明会话建立了,真正发任务才能验证权限、工作目录、API 通道三者都对。
第四步,关闭会话。验证完记得收尾:
/acp close会收到Closed ACP session ... Removed 1 binding.的回复。关闭之后,你在飞书里聊天,又回到跟原来的 OpenClaw Agent 对话的状态。
5. 本篇常见错排查
5.1 status 显示 runtime: status=dead
这是最常见的一种。/acp status返回里出现runtime: status=dead、summary: queue owner unavailable,说明 ACPX 的运行时进程没起来或者已经退出。先确认acpx命令在 PATH 里能直接执行,再检查 config.toml 里command = "acpx"是否和实际安装路径一致。如果 npm 全局目录不在 PATH,把command改成绝对路径,比如/home/你的用户名/.npm-global/bin/acpx。
5.2 Claude Code 拿不到权限,任务卡住
表现是会话建立了,但发任务后 CC 一直不动,或者报权限相关错误。根因通常是permissionMode没设成approve-all,或者 settings.json 的permissions.allow里缺了 Bash/Write。两个地方都检查一遍,改完重启 OpenClaw。
5.3 飞书和网页窗口消息不互通
这是 ACPX 的预期行为,不是 bug。飞书渠道和网页渠道各自持有会话,只有 Claude Code 能同时收到两边的消息,两边互相看不到对方的内容。如果你需要跨渠道共享上下文,得手动把关键信息在消息里带上,别指望它自动同步。
5.4 401 或鉴权失败
如果 OpenClaw 侧正常、CC 侧报鉴权错误,优先查 settings.json 里的ANTHROPIC_BASE_URL是不是https://taotoken.net/api,以及 Key 有没有写错或过期。注意 API 地址不要带 UTM 参数,带了可能导致路由异常。另外确认环境变量没有被 shell 里的旧值覆盖,echo $ANTHROPIC_BASE_URL看一眼实际生效的值。
5.5 会话建立后 cwd 不对
CC 默认在~/.openclaw/workspace下干活,如果你的工程在别的目录,发任务时要么在指令里写绝对路径,要么先让 CCcd过去。持久会话下 cwd 不会自动跟着你飞书里说的目录变,这点要留意。
6. 把链路固定下来:长期编码与 Agent 场景
一次验证跑通只是开始,真正省事的是把这条链路固定成日常流程。如果你打算长期让 OpenClaw 通过 ACPX 调度 Claude Code 做编码任务,建议把 Key 和通道统一管理,避免每次换环境都重新配一遍。TaoToken 的 Coding Plan 适合这种长期编码和 Agent 协作场景,一个 Key 覆盖多个执行体,省掉来回切换凭证的麻烦。
接入文档里有 config.toml 和 settings.json 的完整字段说明,遇到本篇没覆盖的配置项可以去对照。如果你只是想先验证模型通道是否正常,不涉及 ACPX,可以直接在模型对话里发一条测试请求,确认 Key 和 API 基址没问题,再回来搭 ACPX 链路,这样能把问题范围缩小。
我自己的做法是:先用模型对话确认 TaoToken 通道通,再配 ACPX,最后在飞书里发一个真实的小任务收尾。三步下来,哪一环出问题一目了然,比一上来就全套配置再排查要快得多。链路稳定之后,飞书里发一句话就能让 Claude Code 在你机器上干活,原来手动切 CC 的动作就彻底省掉了。