跳转至

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 账号 fork openclaw/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 theirsgit add -Agit commitgit 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 = trueacp.backend = acpxacp.defaultAgent = claude - 遇到 Config validation failed(command/expectedVersion 不被 schema 接受)

排查三:安装 claude-code-acp adapter

npm install -g acpx@latest claude-code-acp
- 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.enabledacp.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"
...

验证命令:

claude -p "Reply with exactly CLAUDE-EXEC-OK" --dangerously-skip-permissions --output-format json

成功结果: {"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 正常执行