OpenClaw ACP 连通 & exec 调用 Claude Code CLI¶
日期: 2026-05-01 目标: 让 OpenClaw agent(Setsuna)能够调用本机 Claude Code CLI 执行任务
背景¶
Vanilla 希望 Setsuna 在分析 OpenClaw 源码(消息队列实现)时能调用本机的 Claude Code CLI,因为 Claude Code 在代码分析和工程理解方面更强。涉及的技术栈包括 OpenClaw ACP(Agent Control Protocol)、acpx、claude-code-acp、systemd user service 环境变量注入等。
操作步骤¶
1. 准备:fork OpenClaw 源码¶
- 在 GitHub 上用
Setsuna-Yukirin账号 forkopenclaw/openclaw - clone 到
~/GitHub/openclaw/ - 设置
upstream→ 官方源,方便日后同步
规则确立: 以后 clone 别人的仓库,默认先 fork 再 clone 到 ~/GitHub/;直接 clone 则以作者名建子目录区分。
2. 设置自动备份:memory 仓库推送到 GitHub¶
- 创建 GitHub 仓库
Setsuna-Yukirin/setsuna-memory(private) - 添加 Vanilla-Yukirin 为 collaborator(write 权限)
- 编写备份脚本
~/scripts/backup-memory.sh - 流程:
git pull --rebase -X theirs→git add -A→git commit→git push - 冲突策略:远端优先(
-X theirs) - 设置 crontab 定时任务:
- 每天 05:00(凌晨5点)
- 每天 14:00(下午2点)
⚠️ 首次备份失败: 因工作区有未暂存修改,git pull --rebase 卡住。后修复脚本:先 git stash 再 pull 再 stash pop。
3. 尝试 ACP 调用 Claude Code(失败路径)¶
第一次尝试: sessions_spawn(runtime="acp", agentId="claude") → AcpRuntimeError: Authentication required
排查一:配置 acpx 权限
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
排查二:启用 acpx 插件 + ACP 总开关
- plugins.entries.acpx.enabled = true
- acp.enabled = true、acp.backend = acpx、acp.defaultAgent = claude
- 遇到 Config validation failed(command/expectedVersion 不被 schema 接受)
排查三:安装 claude-code-acp adapter
-acpx claude "say hello" 直连成功 ✅
- OpenClaw 内部仍报 Authentication required
- 发现问题:默认 adapter 是 @zed-industries/claude-agent-acp,走 API key 认证而非 OAuth
排查四:ACP 配置补齐
- 运行 /acp doctor → backend ok,healthy: yes
- 但 agent=codex(defaultAgent 未生效)
- acp.dispatch.enabled、acp.allowedAgents 补上
排查五:systemd user service 环境变量注入
- OpenClaw gateway 是 user systemd service(非 system service)
- 注入 ANTHROPIC_* 环境变量
- 验证:systemctl --user cat openclaw-gateway.service 看到 Environment= 行
- 但 exec 环境仍未拿到 token(值被引号包裹导致截断)
最终诊断: claude CLI 非交互模式需要完整 ANTHROPIC_* 环境变量才能认证。ACP 路径走的 adapter 认证方式与本机 claude CLI 不一致,ACP 调用路径此 session 未成功。
4. 成功:通过 exec 直接调用 claude CLI¶
修复方式: 将 ANTHROPIC_AUTH_TOKEN 正确注入 systemd user service override 文件
[Service]
Environment="ANTHROPIC_BASE_URL=https://router.shengsuanyun.com/api/cp"
Environment="ANTHROPIC_AUTH_TOKEN=cpk-ce…085e"
Environment="ANTHROPIC_MODEL=anthropic/claude-sonnet-4.6"
...
验证命令:
成功结果: {"result": "CLAUDE-EXEC-OK", "is_error": false} ✅
遇到的问题与解决¶
问题1:ACP 调用报 Authentication required¶
现象: 每次 sessions_spawn(runtime="acp", agentId="claude") 都返回 AcpRuntimeError: Authentication required
原因: OpenClaw 内置 acpx 插件用的默认 adapter(@zed-industries/claude-agent-acp)与本机 claude CLI 的认证方式不一致。claude CLI 通过 OAuth session 登录,而 ACP adapter 需要标准 ANTHROPIC_API_KEY。
解决: 放弃 ACP 路径,改用 exec 直接调 claude CLI。本质上是两层不同的认证体系。
问题2:systemd override 被 shell 截断¶
现象: 环境变量写入后,ANTHROPIC_AUTH_TOKEN 实际为 "cpk-ce...xxxx"(带引号),而非 cpk-ce...xxxx
原因: systemd override 文件里的 Environment="ANTHROPIC_AUTH_TOKEN="xxx"" 语法错误——值自己包了引号
解决: 改为 Environment="ANTHROPIC_AUTH_TOKEN=xxx"(去掉 token 值周围的额外引号)
问题3:定时备份因工作区不干净失败¶
现象: 备份脚本卡在 git pull --rebase,报 "You have unstaged changes"
原因: 脚本没有先处理本地未提交修改就直接 rebase
解决: 脚本增加 git stash → rebase → git stash pop 流程
知识清单¶
- OpenClaw 调用 Claude Code 有两种方式:ACP 协议(复杂,需配认证)和 exec 直接调本机 claude CLI(简单直接)
- systemd user service vs system service:OpenClaw gateway 运行在 user service(
~/.config/systemd/user/),用systemctl --user管理,不能用sudo systemctl - 环境变量注入:user service 用
systemctl --user edit xxx.service写 override.conf;注意值语法不要多包引号 - claude CLI 关键参数:
-p(非交互执行)、--dangerously-skip-permissions(跳过权限确认)、--output-format json(JSON 输出,便于程序解析) - crontab 脚本注意:
git pull --rebase要求工作区干净,应先 stash 再操作 - Setsuna-Yukirin GitHub 账号:已配置 gh CLI,可执行 fork、repo 创建、collaborator 添加等操作
待办 / 遗留¶
- [ ] 以后再用 ACP 路径时需要进一步排查认证配置(如需用时再深入研究)
- [ ] 确认定时备份脚本已更新,下次 05:00/14:00 正常执行