通过OpenClaw实现副业收入《OpenClaw赚钱实录从“养龙虾“到可持续变现的实践指南》Agent Client Protocol (ACP) 会话允许 OpenClaw 通过 ACP 后端插件运行外部编码工具例如 Pi、Claude Code、Codex、OpenCode 和 Gemini CLI。如果你用通俗语言告诉 OpenClaw “在 Codex 中运行这个”或“在一个线程中启动 Claude Code”OpenClaw 应该将该请求路由到 ACP 运行时而不是原生子代理运行时。快速操作流程当你需要实用的/acp操作手册时请使用此流程生成一个会话/acp spawn codex --mode persistent --thread auto在绑定的线程中工作或显式地针对该会话键。检查运行时状态/acp status根据需要调整运行时选项/acp model/acp permissions/acp timeout在不替换上下文的情况下提示活跃会话/acp steer tighten logging and continue停止工作/acp cancel停止当前轮次或/acp close关闭会话并移除绑定给人类用户的快速入门自然语言请求示例“在此处启动一个持久的 Codex 会话并保持其专注。”“将此作为一次性的 Claude Code ACP 会话运行并总结结果。”“在此线程中使用 Gemini CLI 执行此任务然后继续在同一线程中进行后续操作。”OpenClaw 应该执行的操作选择runtime: acp。解析请求的工具目标agentId例如codex。如果请求了线程绑定且当前频道支持则将 ACP 会话绑定到该线程。将后续的线程消息路由到同一个 ACP 会话直到取消聚焦/关闭/过期。ACP 与子代理的对比当你想要一个外部工具运行时使用 ACP。当你想要 OpenClaw 原生的委托运行时使用子代理。领域ACP 会话子代理运行运行时ACP 后端插件例如 acpxOpenClaw 原生子代理运行时会话键agent::acp:agent::subagent:主要命令/acp .../subagents ...生成工具使用runtime:acp的sessions_spawn使用默认运行时的sessions_spawn另请参阅 子代理。线程绑定会话与频道无关当为频道适配器启用线程绑定时ACP 会话可以绑定到线程OpenClaw 将一个线程绑定到一个目标 ACP 会话。该线程中的后续消息将路由到绑定的 ACP 会话。ACP 输出被发送回同一个线程。取消聚焦/关闭/归档/空闲超时或最大存留期过期会移除绑定。线程绑定支持是适配器特定的。如果当前频道适配器不支持线程绑定OpenClaw 会返回一条明确的“不支持/不可用”消息。线程绑定 ACP 所需的功能标志acp.enabledtrueacp.dispatch.enabled默认开启设置为false以暂停 ACP 调度频道适配器的 ACP 线程生成标志已启用适配器特定Discordchannels.discord.threadBindings.spawnAcpSessionstrueTelegramchannels.telegram.threadBindings.spawnAcpSessionstrue支持线程的频道任何暴露会话/线程绑定能力的频道适配器。当前内置支持Discord 线程/频道Telegram 主题群组/超级群组中的论坛主题和私聊主题插件频道可以通过相同的绑定接口添加支持。频道特定设置对于非临时工作流在顶级bindings[]条目中配置持久的 ACP 绑定。绑定模型bindings[].typeacp标记一个持久的 ACP 对话绑定。bindings[].match标识目标对话Discord 频道或线程match.channeldiscordmatch.peer.idTelegram 论坛主题match.channeltelegrammatch.peer.id:topic:bindings[].agentId是所属的 OpenClaw 代理 ID。可选的 ACP 覆盖配置位于bindings[].acp下modepersistent或oneshotlabelcwdbackend每个代理的运行时默认值使用agents.list[].runtime为每个代理定义一次 ACP 默认值agents.list[].runtime.typeacpagents.list[].runtime.acp.agent工具 ID例如codex或claudeagents.list[].runtime.acp.backendagents.list[].runtime.acp.modeagents.list[].runtime.acp.cwdACP 绑定会话的覆盖优先级bindings[].acp.*agents.list[].runtime.acp.*全局 ACP 默认值例如acp.backend示例{ agents: { list: [ { id: codex, runtime: { type: acp, acp: { agent: codex, backend: acpx, mode: persistent, cwd: /workspace/openclaw, }, }, }, { id: claude, runtime: { type: acp, acp: { agent: claude, backend: acpx, mode: persistent }, }, }, ], }, bindings: [ { type: acp, agentId: codex, match: { channel: discord, accountId: default, peer: { kind: channel, id: 222222222222222222 }, }, acp: { label: codex-main }, }, { type: acp, agentId: claude, match: { channel: telegram, accountId: default, peer: { kind: group, id: -1001234567890:topic:42 }, }, acp: { cwd: /workspace/repo-b }, }, { type: route, agentId: main, match: { channel: discord, accountId: default }, }, { type: route, agentId: main, match: { channel: telegram, accountId: default }, }, ], channels: { discord: { guilds: { 111111111111111111: { channels: { 222222222222222222: { requireMention: false }, }, }, }, }, telegram: { groups: { -1001234567890: { topics: { 42: { requireMention: false } }, }, }, }, }, }行为OpenClaw 确保在使用的 ACP 会话存在。该频道或主题中的消息将路由到配置的 ACP 会话。在绑定的对话中/new和/reset会在原地重置同一个 ACP 会话键。临时运行时绑定例如由线程聚焦流程创建的仍然适用。启动 ACP 会话接口通过sessions_spawn使用runtime: acp从代理轮次或工具调用启动 ACP 会话。{task:Open the repo and summarize failing tests,runtime:acp,agentId:codex,thread:true,mode:session}注意runtime默认为subagent因此请显式设置runtime: acp用于 ACP 会话。如果省略agentId当配置了acp.defaultAgent时OpenClaw 会使用它。mode: session需要thread: true来维持持久的绑定对话。接口详情task必需发送给 ACP 会话的初始提示。runtimeACP 必需必须为acp。agentId可选ACP 目标工具 ID。如果设置了acp.defaultAgent则回退使用。thread可选默认为false在支持的情况下请求线程绑定流程。mode可选run一次性或session持久。默认为run如果thread: true且省略 modeOpenClaw 可能会根据运行时路径默认持久行为mode: session需要thread: truecwd可选请求的运行时工作目录由后端/运行时策略验证。label可选在会话/横幅文本中使用的面向操作员的标签。resumeSessionId可选恢复现有的 ACP 会话而不是创建新会话。代理通过session/load重放其对话历史。需要runtime: acp。streamTo可选parent将初始 ACP 运行进度摘要作为系统事件流式传输回请求者会话。可用时接受的响应包括streamLogPath它指向一个会话范围内的 JSONL 日志.acp-stream.jsonl你可以 tail 它以获取完整的转发历史记录。恢复现有会话使用resumeSessionId继续之前的 ACP 会话而不是从头开始。代理通过session/load重放其对话历史因此它会带着之前的所有上下文继续。{task:Continue where we left off — fix the remaining test failures,runtime:acp,agentId:codex,resumeSessionId:}常见用例将会话从你的笔记本电脑转移到你的手机上 —— 告诉你的代理从你离开的地方继续继续你在 CLI 中以交互方式开始的编码会话现在通过你的代理无头运行恢复因网关重启或空闲超时而中断的工作注意resumeSessionId需要runtime: acp—— 如果与子代理运行时一起使用则返回错误。resumeSessionId会恢复上游的 ACP 对话历史thread和mode仍然正常应用于你正在创建的新 OpenClaw 会话因此mode: session仍然需要thread: true。目标代理必须支持session/loadCodex 和 Claude Code 支持。如果找不到会话 ID生成操作会失败并返回明确的错误 —— 不会静默回退到新会话。操作员冒烟测试在网关部署后使用此测试当你想要快速实时检查 ACP 生成是否真正端到端工作而不仅仅是传递单元测试时。推荐的门控验证目标主机上部署的网关版本/提交。确认部署的源代码包括src/gateway/sessions-patch.ts中的 ACP 谱系接受subagent:* 或 acp:* 会话。打开一个临时的 ACPX 桥接会话连接到实时代理例如jpclawhq上的razor(main)。要求该代理调用sessions_spawn参数如下runtime: acpagentId: codexmode: run任务Reply with exactly LIVE-ACP-SPAWN-OK验证代理报告acceptedyes一个真实的childSessionKey无验证器错误清理临时的 ACPX 桥接会话。给实时代理的提示示例Use the sessions_spawn tool now with runtime: acp, agentId: codex, and mode: run. Set the task to: Reply with exactly LIVE-ACP-SPAWN-OK. Then report only: accepted; childSessionKey; error.注意保持此冒烟测试使用mode: run除非你故意测试线程绑定的持久 ACP 会话。对于基本门控不需要streamTo: parent。该路径取决于请求者/会话能力是一个单独的集成检查。将线程绑定的mode: session测试视为来自真实 Discord 线程或 Telegram 主题的第二个、更丰富的集成测试通道。沙箱兼容性ACP 会话当前在主机运行时上运行不在 OpenClaw 沙箱内。当前限制如果请求者会话被沙箱化则对于sessions_spawn({ runtime: acp })和/acp spawnACP 生成都会被阻止。错误Sandboxed sessions cannot spawn ACP sessions because runtimeacp runs on the host. Use runtimesubagent from sandboxed sessions.带有runtime: acp的sessions_spawn不支持sandbox: require。错误sessions_spawn sandboxrequire is unsupported for runtimeacp because ACP sessions run outside the sandbox. Use runtimesubagent or sandboxinherit.当你需要沙箱强制执行时请使用runtime: subagent。通过/acp命令在需要时使用/acp spawn从聊天中获得明确的操作员控制。/acp spawn codex --mode persistent --thread auto /acp spawn codex --mode oneshot --thread off /acp spawn codex --thread here关键标志--mode persistent|oneshot--thread auto|here|off--cwd--label请参阅 斜杠命令。会话目标解析大多数/acp操作接受一个可选的会话目标session-key、session-id或session-label。解析顺序显式目标参数或/acp steer的--session尝试键然后是 UUID 格式的会话 ID然后是标签当前线程绑定如果此对话/线程绑定到 ACP 会话当前请求者会话回退如果没有解析到任何目标OpenClaw 会返回一个明确的错误Unable to resolve session target: ...。生成线程模式/acp spawn支持--thread auto|here|off。模式行为auto在活跃线程中绑定该线程。在线程外在支持的情况下创建/绑定一个子线程。here要求当前活跃线程如果不在其中则失败。off无绑定。会话以未绑定状态启动。注意在不支持线程绑定的表面上默认行为实际上是off。线程绑定的生成需要频道策略支持Discordchannels.discord.threadBindings.spawnAcpSessionstrueTelegramchannels.telegram.threadBindings.spawnAcpSessionstrueACP 控制可用的命令系列/acp spawn/acp cancel/acp steer/acp close/acp status/acp set-mode/acp set/acp cwd/acp permissions/acp timeout/acp model/acp reset-options/acp sessions/acp doctor/acp install/acp status显示有效的运行时选项并且在可用时显示运行时级别和后端级别的会话标识符。某些控制依赖于后端能力。如果后端不支持某个控制OpenClaw 会返回一个明确的不支持控制错误。ACP 命令手册命令功能示例/acp spawn创建 ACP 会话可选的线程绑定。/acp spawn codex --mode persistent --thread auto --cwd /repo/acp cancel取消目标会话的进行中轮次。/acp cancel agent:codex:acp:/acp steer向运行中的会话发送指导指令。/acp steer --session support inbox prioritize failing tests/acp close关闭会话并解除线程目标的绑定。/acp close/acp status显示后端、模式、状态、运行时选项、能力。/acp status/acp set-mode设置目标会话的运行时模式。/acp set-mode plan/acp set写入通用运行时配置选项。/acp set model openai/gpt-5.2/acp cwd设置运行时工作目录覆盖。/acp cwd /Users/user/Projects/repo/acp permissions设置批准策略配置文件。/acp permissions strict/acp timeout设置运行时超时时间秒。/acp timeout 120/acp model设置运行时模型覆盖。/acp model anthropic/claude-opus-4-5/acp reset-options移除会话运行时选项覆盖。/acp reset-options/acp sessions列出存储中最近的 ACP 会话。/acp sessions/acp doctor后端健康状态、能力、可操作的修复方案。/acp doctor/acp install打印确定性的安装和启用步骤。/acp install/acp sessions读取当前绑定或请求者会话的存储。接受session-key、session-id或session-label令牌的命令会通过网关会话发现来解析目标包括每个代理自定义的session.store根目录。运行时选项映射/acp有便捷命令和一个通用设置器。等效操作/acp model映射到运行时配置键model。/acp permissions映射到运行时配置键approval_policy。/acp timeout映射到运行时配置键timeout。/acp cwd直接更新运行时 cwd 覆盖。/acp set是通用路径。特殊情况keycwd使用 cwd 覆盖路径。/acp reset-options清除目标会话的所有运行时覆盖。acpx 工具支持当前当前的 acpx 内置工具别名piclaudecodexopencodegeminikimi当 OpenClaw 使用 acpx 后端时除非你的 acpx 配置定义了自定义代理别名否则优先使用这些值作为agentId。直接的 acpx CLI 使用也可以通过--agent定位任意适配器但那个原始逃生窗口是 acpx CLI 的一个特性不是正常的 OpenClawagentId路径。所需配置核心 ACP 基线{ acp: { enabled: true, // 可选。默认为 true设置为 false 以在保留 /acp 控件的同时暂停 ACP 调度。 dispatch: { enabled: true }, backend: acpx, defaultAgent: codex, allowedAgents: [pi, claude, codex, opencode, gemini, kimi], maxConcurrentSessions: 8, stream: { coalesceIdleMs: 300, maxChunkChars: 1200, }, runtime: { ttlMinutes: 120, }, }, }线程绑定配置是频道适配器特定的。Discord 示例{ session: { threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, }, }, channels: { discord: { threadBindings: { enabled: true, spawnAcpSessions: true, }, }, }, }如果线程绑定的 ACP 生成不起作用请首先验证适配器功能标志Discordchannels.discord.threadBindings.spawnAcpSessionstrue请参阅 配置参考。acpx 后端的插件设置安装并启用插件openclaw pluginsinstallacpx openclaw configsetplugins.entries.acpx.enabledtrue开发期间的本地工作区安装openclaw pluginsinstall./extensions/acpx然后验证后端健康状态/acp doctoracpx 命令和版本配置默认情况下acpx 插件发布为openclaw/acpx使用插件本地固定的二进制文件命令默认为extensions/acpx/node_modules/.bin/acpx。预期版本默认为扩展固定版本。启动时立即将 ACP 后端注册为未就绪状态。后台确保任务验证acpx --version。如果插件本地二进制文件缺失或版本不匹配它会运行npm install --omitdev --no-save acpx并重新验证。你可以在插件配置中覆盖命令/版本{plugins:{entries:{acpx:{enabled:true,config:{command:../acpx/dist/cli.js,expectedVersion:any}}}}}注意command接受绝对路径、相对路径或命令名称acpx。相对路径从 OpenClaw 工作区目录解析。expectedVersion: any禁用严格的版本匹配。当command指向自定义二进制文件/路径时插件本地自动安装被禁用。在后端健康检查运行时OpenClaw 启动保持非阻塞。请参阅 插件。权限配置ACP 会话以非交互方式运行 —— 没有 TTY 来批准或拒绝文件写入和 shell 执行权限提示。acpx 插件提供了两个配置键来控制权限的处理方式permissionMode控制工具代理可以在不提示的情况下执行哪些操作。值行为approve-all自动批准所有文件写入和 shell 命令。approve-reads仅自动批准读取操作写入和执行需要提示。deny-all拒绝所有权限提示。nonInteractivePermissions控制在没有交互式 TTY 可用时这对于 ACP 会话来说总是如此发生的情况。值行为fail以AcpRuntimeError中止会话。(默认)deny静默拒绝权限并继续优雅降级。配置通过插件配置进行设置openclaw configsetplugins.entries.acpx.config.permissionMode approve-all openclaw configsetplugins.entries.acpx.config.nonInteractivePermissions fail更改这些值后重新启动网关。重要OpenClaw 当前默认permissionModeapprove-reads和nonInteractivePermissionsfail。在非交互式 ACP 会话中任何触发权限提示的写入或执行都可能因AcpRuntimeError: Permission prompt unavailable in non-interactive mode而失败。如果你需要限制权限请将nonInteractivePermissions设置为deny以便会话优雅降级而不是崩溃。故障排除症状可能的原因修复ACP runtime backend is not configured后端插件缺失或禁用。安装并启用后端插件然后运行/acp doctor。ACP is disabled by policy (acp.enabledfalse)ACP 全局禁用。设置acp.enabledtrue。ACP dispatch is disabled by policy (acp.dispatch.enabledfalse)正常线程消息的调度被禁用。设置acp.dispatch.enabledtrue。ACP agent is not allowed by policy代理不在允许列表中。使用允许的agentId或更新acp.allowedAgents。Unable to resolve session target: ...错误的键/ID/标签令牌。运行/acp sessions复制确切的键/标签重试。--thread here requires running /acp spawn inside an active ... thread在线程上下文之外使用了--thread here。移动到目标线程或使用--thread auto/off。Only can rebind this thread.另一个用户拥有线程绑定。以所有者身份重新绑定或使用不同的线程。Thread bindings are unavailable for .适配器缺少线程绑定能力。使用--thread off或移动到支持的适配器/频道。Sandboxed sessions cannot spawn ACP sessions ...ACP 运行时是主机端的请求者会话被沙箱化。从沙箱化会话中使用runtimesubagent或从非沙箱化会话运行 ACP 生成。sessions_spawn sandboxrequire is unsupported for runtimeacp ...为 ACP 运行时请求了sandboxrequire。对于所需的沙箱化使用runtimesubagent或从非沙箱化会话中使用sandboxinherit的 ACP。绑定会话的 ACP 元数据缺失过时/已删除的 ACP 会话元数据。使用/acp spawn重新创建然后重新绑定/聚焦线程。AcpRuntimeError: Permission prompt unavailable in non-interactive modepermissionMode在非交互式 ACP 会话中阻止写入/执行。将plugins.entries.acpx.config.permissionMode设置为approve-all并重启网关。请参阅 权限配置。ACP 会话提前失败输出很少权限提示被permissionMode/nonInteractivePermissions阻止。检查网关日志中的AcpRuntimeError。对于完全权限设置permissionModeapprove-all对于优雅降级设置nonInteractivePermissionsdeny。ACP 会话在完成工作后无限期停滞工具进程已结束但 ACP 会话未报告完成。使用ps aux | grep acpx监控手动终止停滞进程。