chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-24 02:41:26 +00:00
parent 089dc0be42
commit ef90ad76a4
5 changed files with 1103 additions and 1020 deletions

View File

@ -1,29 +1,33 @@
---
read_when:
- 设置基于 ACP 的 IDE 集成
- 调试到 Gateway 网关的 ACP 会话路由
summary: 运行用于 IDE 集成的 ACP bridge
- 调试 ACP 会话路由到 Gateway 网关
summary: 为 IDE 集成运行 ACP 桥接器
title: ACP
x-i18n:
generated_at: "2026-04-23T20:42:42Z"
generated_at: "2026-04-24T02:39:42Z"
model: gpt-5.4
provider: openai
source_hash: b535e84f8ba5f143340af5b6a1e651b0711ba8d5fa58bfb76863612718ed07bb
source_hash: 04a1413c23464489a192f5d99cd97f128c0ddc080f3ae637073147a2b07ce305
source_path: cli/acp.md
workflow: 15
---
运行与 OpenClaw Gateway 网关通信的 [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) bridge
运行与 OpenClaw Gateway 网关通信的 [Agent Client Protocol (ACP)](https://agentclientprotocol.com/) 桥接器
此命令通过 stdio 为 IDE 提供 ACP并通过 WebSocket 将提示转发到 Gateway 网关。它会将 ACP 会话持续映射到 Gateway 网关会话键。
此命令通过 `stdio` 为 IDE 提供 ACP并通过 WebSocket 将提示转发到 Gateway 网关。
它会让 ACP 会话持续映射到 Gateway 网关会话键。
`openclaw acp` 是一个由 Gateway 网关支持的 ACP bridge而不是完整的原生 ACP 编辑器运行时。它专注于会话路由、提示传递和基础流式更新。
`openclaw acp` 是一个由 Gateway 网关支持的 ACP 桥接器,不是完整的 ACP 原生编辑器
运行时。它专注于会话路由、提示传递和基础的流式更新。
如果你希望外部 MCP 客户端直接与 OpenClaw 渠道会话通信,而不是托管 ACP harness 会话,请改用 [`openclaw mcp serve`](/zh-CN/cli/mcp)。
如果你希望外部 MCP 客户端直接与 OpenClaw 渠道
会话通信,而不是托管 ACP harness 会话,请改用
[`openclaw mcp serve`](/zh-CN/cli/mcp)。
## 这不是什么
本页经常与 ACP harness 会话混淆。
此页面经常与 ACP harness 会话混淆。
`openclaw acp` 的含义是:
@ -31,47 +35,61 @@ x-i18n:
- IDE 或 ACP 客户端连接到 OpenClaw
- OpenClaw 将这些工作转发到 Gateway 网关会话中
这与 [ACP Agents](/zh-CN/tools/acp-agents) 不同,后者是 OpenClaw 通过 `acpx` 运行外部 harness例如 Codex 或 Claude Code。
这不同于 [ACP Agents](/zh-CN/tools/acp-agents),后者中 OpenClaw 会通过 `acpx` 运行
外部 harness例如 Codex 或 Claude Code。
快速判断规则:
快速规则:
- 编辑器/客户端想通过 ACP 与 OpenClaw 通信:使用 `openclaw acp`
- OpenClaw 应启动 Codex/Claude/Gemini 作为 ACP harness使用 `/acp spawn` 和 [ACP Agents](/zh-CN/tools/acp-agents)
## 兼容性矩阵
| ACP 区域 | 状态 | 说明 |
| --------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `initialize`、`newSession`、`prompt`、`cancel` | 已实现 | 通过 stdio 到 Gateway 网关 `chat/send` + 中止的核心 bridge 流程。 |
| `listSessions`、斜杠命令 | 已实现 | 会话列表基于 Gateway 网关会话状态工作;命令通过 `available_commands_update` 对外公布。 |
| `loadSession` | 部分支持 | 将 ACP 会话重新绑定到 Gateway 网关会话键,并重放存储的用户/助手文本历史。工具/系统历史目前尚未重建。 |
| 提示内容(`text`、嵌入式 `resource`、图像) | 部分支持 | 文本/资源会被展平成聊天输入;图像会变为 Gateway 网关附件。 |
| 会话模式 | 部分支持 | 支持 `session/set_mode`,且 bridge 会暴露初始的 Gateway 网关支持的会话控制,包括 thought level、tool verbosity、reasoning、usage detail 和 elevated actions。更广泛的 ACP 原生模式/配置界面仍不在范围内。 |
| 会话信息和使用量更新 | 部分支持 | bridge 会根据缓存的 Gateway 网关会话快照发出 `session_info_update` 和尽力而为的 `usage_update` 通知。使用量是近似值,且仅当 Gateway 网关将 token 总量标记为新时才会发送。 |
| 工具流式传输 | 部分支持 | `tool_call` / `tool_call_update` 事件包含原始 I/O、文本内容以及在 Gateway 网关工具参数/结果暴露这些内容时尽力而为提取的文件位置。嵌入式终端和更丰富的原生 Diffs 输出目前仍未暴露。 |
| 每会话 MCP 服务器(`mcpServers` | 不支持 | bridge 模式会拒绝每会话 MCP 服务器请求。请改为在 OpenClaw gateway 或智能体上配置 MCP。 |
| 客户端文件系统方法(`fs/read_text_file`、`fs/write_text_file` | 不支持 | bridge 不会调用 ACP 客户端文件系统方法。 |
| 客户端终端方法(`terminal/*` | 不支持 | bridge 不会创建 ACP 客户端终端,也不会通过工具调用流式传输终端 ID。 |
| 会话计划 / thought 流式传输 | 不支持 | bridge 当前发出的是输出文本和工具状态,而不是 ACP 计划或 thought 更新。 |
| ACP 区域 | 状态 | 说明 |
| --------------------------------------------------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `initialize`, `newSession`, `prompt`, `cancel` | 已实现 | 通过 `stdio` 到 Gateway 网关 chat/send + abort 的核心桥接流程。 |
| `listSessions`, 斜杠命令 | 已实现 | 会话列表基于 Gateway 网关会话状态工作;命令通过 `available_commands_update` 进行通告。 |
| `loadSession` | 部分支持 | 将 ACP 会话重新绑定到 Gateway 网关会话键,并重放存储的用户/助手文本历史。工具/系统历史尚未重建。 |
| 提示内容(`text`、嵌入式 `resource`、图片) | 部分支持 | 文本/资源会被展平为 chat 输入;图片会成为 Gateway 网关附件。 |
| 会话模式 | 部分支持 | 支持 `session/set_mode`,并且桥接器公开了初始的 Gateway 网关支持会话控制,用于 thought level、tool verbosity、reasoning、usage detail 和 elevated actions。更广泛的 ACP 原生模式/配置表面仍不在当前范围内。 |
| 会话信息和用量更新 | 部分支持 | 桥接器会根据缓存的 Gateway 网关会话快照发出 `session_info_update` 和尽力而为的 `usage_update` 通知。用量是近似值,且仅当 Gateway 网关将 token 总量标记为新时才会发送。 |
| 工具流式传输 | 部分支持 | `tool_call` / `tool_call_update` 事件会包含原始 I/O、文本内容以及当 Gateway 网关工具参数/结果暴露这些信息时尽力而为提供的文件位置。嵌入式终端和更丰富的原生 Diffs 输出仍未暴露。 |
| 每会话 MCP 服务器(`mcpServers` | 不支持 | 桥接模式会拒绝每会话 MCP 服务器请求。请改为在 OpenClaw gateway 或智能体上配置 MCP。 |
| 客户端文件系统方法(`fs/read_text_file`, `fs/write_text_file` | 不支持 | 该桥接器不会调用 ACP 客户端文件系统方法。 |
| 客户端终端方法(`terminal/*` | 不支持 | 该桥接器不会创建 ACP 客户端终端,也不会通过工具调用流式传输终端 ID。 |
| 会话计划 / thought 流式传输 | 不支持 | 该桥接器当前会发出输出文本和工具状态,而不是 ACP 计划或 thought 更新。 |
## 已知限制
- `loadSession` 会重放已存储的用户和助手文本历史,但不会重建历史工具调用、系统通知或更丰富的 ACP 原生事件类型。
- 如果多个 ACP 客户端共享同一个 Gateway 网关会话键,事件和取消路由仅为尽力而为,而不是严格按客户端隔离。若你需要清晰的编辑器本地轮次,优先使用默认隔离的 `acp:<uuid>` 会话。
- Gateway 网关停止状态会被转换为 ACP 停止原因,但这种映射的表达能力弱于完整的 ACP 原生运行时。
- 初始会话控制目前只暴露一组聚焦的 Gateway 网关选项thought level、tool verbosity、reasoning、usage detail 和 elevated actions。模型选择和 exec-host 控制尚未作为 ACP 配置选项暴露。
- `session_info_update``usage_update` 来源于 Gateway 网关会话快照,而不是实时 ACP 原生运行时统计。使用量是近似值,不包含成本数据,并且只有当 Gateway 网关将总 token 数据标记为新鲜时才会发出。
- 工具跟随数据是尽力而为的。bridge 可以展示已知工具参数/结果中出现的文件路径,但目前尚不会发出 ACP 终端或结构化文件 Diffs。
- `loadSession` 会重放存储的用户和助手文本历史,但不会
重建历史工具调用、系统通知或更丰富的 ACP 原生事件
类型。
- 如果多个 ACP 客户端共享同一个 Gateway 网关会话键,事件和取消
路由将是尽力而为,而不是严格按客户端完全隔离。若你需要
干净的编辑器本地轮次,优先使用默认隔离的 `acp:<uuid>` 会话。
- Gateway 网关停止状态会被转换为 ACP 停止原因,但这种映射
不如完整 ACP 原生运行时那样具有表现力。
- 初始会话控制当前只公开一组聚焦的 Gateway 网关旋钮:
thought level、tool verbosity、reasoning、usage detail 和 elevated
actions。模型选择和 exec-host 控制尚未作为 ACP
配置选项公开。
- `session_info_update``usage_update` 来源于 Gateway 网关会话
快照,而不是实时 ACP 原生运行时统计。用量是近似值,
不包含成本数据,并且仅在 Gateway 网关将总 token
数据标记为最新时发出。
- 工具跟随数据是尽力而为的。桥接器可以公开已知工具参数/结果中
出现的文件路径,但它尚不会发出 ACP 终端或
结构化文件 Diffs。
## 用法
```bash
openclaw acp
# 远程 Gateway 网关
# 远程 Gateway
openclaw acp --url wss://gateway-host:18789 --token <token>
# 远程 Gateway 网关(从文件读取 token
# 远程 Gateway从文件读取 token
openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
# 附加到现有会话键
@ -80,19 +98,19 @@ openclaw acp --session agent:main:main
# 按标签附加(必须已存在)
openclaw acp --session-label "support inbox"
# 在第一条提示前重置会话键
# 在第一个提示之前重置会话键
openclaw acp --session agent:main:main --reset-session
```
## ACP 客户端(调试)
使用内置 ACP 客户端可在无需 IDE 的情况下对 bridge 做完整性检查。
它会启动 ACP bridge,并允许你以交互方式输入提示。
使用内置 ACP 客户端在没有 IDE 的情况下对桥接器进行安装完整性检查。
它会启动 ACP 桥接器,并允许你以交互方式输入提示。
```bash
openclaw acp client
# 让启动的 bridge 指向远程 Gateway 网关
# 让启动的桥接器指向远程 Gateway 网关
openclaw acp client --server-args --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
# 覆盖服务器命令默认openclaw
@ -101,19 +119,20 @@ openclaw acp client --server "node" --server-args openclaw.mjs acp --url ws://12
权限模型(客户端调试模式):
- 自动批准基于允许列表,并且只适用于受信任的核心工具 ID。
- `read` 自动批准范围限制在当前工作目录(设置了 `--cwd` 时)。
- ACP 只会自动批准狭窄的只读类别:活动 cwd 下受限范围内`read` 调用,以及只读搜索工具(`search`、`web_search`、`memory_search`)。未知/非核心工具、超出范围的读取、具备执行能力的工具、控制平面工具、会修改状态的工具和交互式流程始终需要显式提示批准。
- 自动批准基于 allowlist,并且只适用于受信任的核心工具 ID。
- `read` 自动批准仅限当前工作目录(设置了 `--cwd` 时)。
- ACP 仅会自动批准范围很窄的只读类别:活动 cwd 下受限`read` 调用,以及只读搜索工具(`search`、`web_search`、`memory_search`)。未知/非核心工具、超范围读取、可执行工具、控制平面工具、变更型工具和交互式流程始终需要显式提示批准。
- 服务器提供的 `toolCall.kind` 被视为不受信任的元数据(不是授权来源)。
- 此 ACP bridge 策略与 ACPX harness 权限无关。如果你通过 `acpx` 后端运行 OpenClaw`plugins.entries.acpx.config.permissionMode=approve-all` 是该 harness 会话的紧急放 “yolo” 开关。
- 此 ACP 桥接器策略独立于 ACPX harness 权限。如果你通过 `acpx` 后端运行 OpenClaw`plugins.entries.acpx.config.permissionMode=approve-all` 是该 harness 会话的紧急放开式 “yolo” 开关。
## 如何使用
当 IDE或其他客户端支持 Agent Client Protocol并且你希望它驱动 OpenClaw Gateway 网关会话时,请使用 ACP。
当 IDE或其他客户端支持 Agent Client Protocol并且你希望
它驱动一个 OpenClaw Gateway 网关会话时,请使用 ACP。
1. 确保 Gateway 网关正在运行(本地或远程)。
2. 配置 Gateway 网关目标(通过配置或命令行标志)。
3. 将你的 IDE 指向通过 stdio 运行 `openclaw acp`
2. 配置 Gateway 网关目标(配置或标志)。
3. 让你的 IDE 通过 `stdio` 运行 `openclaw acp`
示例配置(持久化):
@ -126,15 +145,15 @@ openclaw config set gateway.remote.token <token>
```bash
openclaw acp --url wss://gateway-host:18789 --token <token>
# 本地进程安全的推荐方式
# 本地进程安全时优先推荐
openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
```
## 选择智能体
ACP 不会直接选择智能体。它通过 Gateway 网关会话键进行路由。
ACP 不会直接选择智能体。它 Gateway 网关会话键进行路由。
使用带智能体作用域的会话键来定位特定智能体:
使用带智能体作用域的会话键来定位特定智能体:
```bash
openclaw acp --session agent:main:main
@ -142,35 +161,44 @@ openclaw acp --session agent:design:main
openclaw acp --session agent:qa:bug-123
```
每个 ACP 会话都映射到单个 Gateway 网关会话键。一个智能体可以拥有多个会话ACP 默认使用隔离的 `acp:<uuid>` 会话,除非你覆盖该键或标签。
每个 ACP 会话都映射到单个 Gateway 网关会话键。一个智能体可以拥有多个
会话;除非你覆盖该键或标签,否则 ACP 默认使用隔离的 `acp:<uuid>` 会话。
bridge 模式不支持每会话 `mcpServers`。如果 ACP 客户端在 `newSession``loadSession` 期间发送它们bridge 会返回清晰的错误,而不是悄悄忽略。
桥接模式不支持每会话 `mcpServers`。如果 ACP 客户端
`newSession``loadSession` 期间发送它们,桥接器会返回清晰的
错误,而不是静默忽略。
如果你希望由 ACPX 支持的会话能够看到 OpenClaw 渠道插件工具或选定的内置工具(例如 `cron`),请启用 Gateway 网关侧的 ACPX MCP bridges而不是尝试传递每会话 `mcpServers`。请参阅 [ACP Agents](/zh-CN/tools/acp-agents#plugin-tools-mcp-bridge) 和 [OpenClaw 工具 MCP bridge](/zh-CN/tools/acp-agents#openclaw-tools-mcp-bridge)。
如果你希望由 ACPX 支持的会话看到 OpenClaw 插件工具或选定的
内置工具,例如 `cron`,请启用 Gateway 网关侧的 ACPX MCP 桥接,
而不是尝试传递每会话 `mcpServers`。请参见
[ACP Agents](/zh-CN/tools/acp-agents-setup#plugin-tools-mcp-bridge) 和
[OpenClaw tools MCP bridge](/zh-CN/tools/acp-agents-setup#openclaw-tools-mcp-bridge)。
## 从 `acpx` 使用Codex、Claude、其他 ACP 客户端)
如果你希望 Codex 或 Claude Code 这样的编码智能体通过 ACP 与你的 OpenClaw 机器人通信,请使用 `acpx` 及其内置的 `openclaw` 目标。
如果你希望 Codex 或 Claude Code 这类编码智能体
通过 ACP 与你的 OpenClaw bot 通信,请使用带有其内置 `openclaw` 目标的 `acpx`
典型流程:
1. 运行 Gateway 网关,并确保 ACP bridge 可以连接到它。
2. `acpx openclaw` 指向 `openclaw acp`
3. 定你希望编码智能体使用的 OpenClaw 会话键。
1. 运行 Gateway 网关,并确保 ACP 桥接器可以访问它。
2. `acpx openclaw` 指向 `openclaw acp`
3. 定你希望编码智能体使用的 OpenClaw 会话键。
示例:
```bash
# 向默认 OpenClaw ACP 会话发起一次性请求
# 向你的默认 OpenClaw ACP 会话发送一次性请求
acpx openclaw exec "Summarize the active OpenClaw session state."
# 用于后续轮次的持久命名会话
# 用于后续轮次的持久命名会话
acpx openclaw sessions ensure --name codex-bridge
acpx openclaw -s codex-bridge --cwd /path/to/repo \
"Ask my OpenClaw work agent for recent context relevant to this repo."
```
如果你希望 `acpx openclaw` 每次都指向特定的 Gateway 网关和会话键,可在 `~/.acpx/config.json` 中覆盖 `openclaw` 智能体命令:
如果你希望 `acpx openclaw` 每次都定位特定的 Gateway 网关和会话键,
请在 `~/.acpx/config.json` 中覆盖 `openclaw` 智能体命令:
```json
{
@ -182,17 +210,19 @@ acpx openclaw -s codex-bridge --cwd /path/to/repo \
}
```
对于仓库本地的 OpenClaw 检出,请使用直接 CLI 入口点,而不是开发运行器,以保持 ACP 流干净。例如:
对于仓库本地的 OpenClaw 检出,请使用直接 CLI 入口点,而不是
dev runner这样 ACP 流才能保持干净。例如:
```bash
env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
```
这是让 Codex、Claude Code 或其他支持 ACP 的客户端从 OpenClaw 智能体中提取上下文信息、而无需抓取终端内容的最简单方式。
这是让 Codex、Claude Code 或其他支持 ACP 的客户端
从 OpenClaw 智能体提取上下文信息、而无需抓取终端内容的最简单方式。
## Zed 编辑器设置
`~/.config/zed/settings.json` 中添加自定义 ACP 智能体(或使用 Zed 的设置 UI
`~/.config/zed/settings.json` 中添加一个自定义 ACP 智能体(或使用 Zed 的设置 UI
```json
{
@ -207,7 +237,7 @@ env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
}
```
若要定特定 Gateway 网关或智能体:
若要定特定 Gateway 网关或智能体:
```json
{
@ -230,18 +260,18 @@ env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
}
```
在 Zed 中,打开智能体面板并选择“OpenClaw ACP”以开始一个线程。
在 Zed 中,打开 Agent 面板并选择“OpenClaw ACP”以启动一个线程。
## 会话映射
默认情况下ACP 会话会获得一个带有 `acp:` 前缀的隔离 Gateway 网关会话键。
若要复用已知会话,请传入会话键或标签:
- `--session <key>`:使用特定 Gateway 网关会话键。
- `--session <key>`:使用特定 Gateway 网关会话键。
- `--session-label <label>`:按标签解析现有会话。
- `--reset-session`:为该键生成一个全新的会话 ID相同键不同新 transcript
- `--reset-session`:为该键生成一个新的会话 id同一键新 transcript
如果你的 ACP 客户端支持元数据,可以按会话覆盖:
如果你的 ACP 客户端支持元数据,可以按会话覆盖:
```json
{
@ -253,11 +283,11 @@ env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
}
```
有关会话键的更多信息,请参阅 [/concepts/session](/zh-CN/concepts/session)。
[/concepts/session](/zh-CN/concepts/session) 了解有关会话键的更多信息
## 选项
- `--url <url>`Gateway WebSocket URL如果已配置,默认使用 `gateway.remote.url`)。
- `--url <url>`Gateway WebSocket URL若已配置,默认为 `gateway.remote.url`)。
- `--token <token>`Gateway 网关认证 token。
- `--token-file <path>`:从文件读取 Gateway 网关认证 token。
- `--password <password>`Gateway 网关认证密码。
@ -267,19 +297,19 @@ env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
- `--require-existing`:如果会话键/标签不存在则失败。
- `--reset-session`:在首次使用前重置会话键。
- `--no-prefix-cwd`:不要在提示前添加工作目录前缀。
- `--provenance <off|meta|meta+receipt>`:包含 ACP provenance 元数据或回执。
- `--verbose, -v`:向 stderr 输出详细日志。
- `--provenance <off|meta|meta+receipt>`:包含 ACP 来源元数据或回执。
- `--verbose, -v`:向 `stderr` 输出详细日志。
安全说明:
- 在某些系统上,`--token` 和 `--password` 可能会出现在本地进程列表中。
- 建议使用 `--token-file`/`--password-file` 或环境变量(`OPENCLAW_GATEWAY_TOKEN`、`OPENCLAW_GATEWAY_PASSWORD`)。
- Gateway 网关认证解析遵循与其他 Gateway 网关客户端共用的契约:
- 本地模式:环境变量(`OPENCLAW_GATEWAY_*`-> `gateway.auth.*` -> 仅当 `gateway.auth.*` 未设置时才回退到 `gateway.remote.*`(已配置但未解析的本地 SecretRef 会以失败关闭方式处理
- 远程模式:`gateway.remote.*`,并按远程优先级规则回退到环境变量/配置
- `--url` 是安全的覆盖项,不会复用隐式配置/环境凭证;请传入显式的 `--token`/`--password`(或其文件变体)
- ACP 运行时后端子进程会收 `OPENCLAW_SHELL=acp`,可用于特定上下文的 shell/profile 规则。
- `openclaw acp client` 会在启动的 bridge 进程上设置 `OPENCLAW_SHELL=acp-client`
- 优先使用 `--token-file`/`--password-file` 或环境变量(`OPENCLAW_GATEWAY_TOKEN`、`OPENCLAW_GATEWAY_PASSWORD`)。
- Gateway 网关认证解析遵循其他 Gateway 网关客户端使用的共享契约:
- 本地模式:环境变量(`OPENCLAW_GATEWAY_*`-> `gateway.auth.*` -> 仅当 `gateway.auth.*` 未设置时才回退到 `gateway.remote.*`(已配置但未解析的本地 SecretRefs 将以失败关闭
- 远程模式:`gateway.remote.*`,并按远程优先级规则进行环境变量/配置回退
- `--url` 可安全覆盖,不会复用隐式配置/环境变量凭证;请传入显式 `--token`/`--password`(或其文件变体)
- ACP 运行时后端子进程会`OPENCLAW_SHELL=acp`,可用于上下文特定的 shell/profile 规则。
- `openclaw acp client` 会在其启动的桥接器进程上设置 `OPENCLAW_SHELL=acp-client`
### `acp client` 选项
@ -287,4 +317,4 @@ env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
- `--server <command>`ACP 服务器命令(默认:`openclaw`)。
- `--server-args <args...>`:传递给 ACP 服务器的额外参数。
- `--server-verbose`:在 ACP 服务器上启用详细日志。
- `--verbose, -v`启用客户端详细日志。
- `--verbose, -v`详细客户端日志。

View File

@ -0,0 +1,281 @@
---
read_when:
- 为 Claude Code / Codex / Gemini CLI 安装或配置 `acpx` harness
- 启用 `plugin-tools` 或 OpenClaw-tools MCP 桥接器
- 配置 ACP 权限模式
summary: 设置 ACP 智能体:`acpx` harness 配置、插件设置、权限
title: ACP 智能体——设置
x-i18n:
generated_at: "2026-04-24T02:39:43Z"
model: gpt-5.4
provider: openai
source_hash: 7f1b34217b0709c85173ca13d952e996676b73b7ac7b9db91a5069e19ff76013
source_path: tools/acp-agents-setup.md
workflow: 15
---
关于概览、运维手册和核心概念,请参见 [ACP 智能体](/zh-CN/tools/acp-agents)。
本页介绍 `acpx` harness 配置、MCP 桥接器的插件设置,以及权限配置。
## `acpx` harness 支持(当前)
当前 `acpx` 内置 harness 别名:
- `claude`
- `codex`
- `copilot`
- `cursor`Cursor CLI`cursor-agent acp`
- `droid`
- `gemini`
- `iflow`
- `kilocode`
- `kimi`
- `kiro`
- `openclaw`
- `opencode`
- `pi`
- `qwen`
当 OpenClaw 使用 `acpx` 后端时,除非你的 `acpx` 配置定义了自定义智能体别名,否则建议为 `agentId` 优先使用这些值。
如果你本地安装的 Cursor 仍然将 ACP 暴露为 `agent acp`,请在你的 `acpx` 配置中覆盖 `cursor` 智能体命令,而不是修改内置默认值。
直接使用 `acpx` CLI 时,也可以通过 `--agent <command>` 指向任意适配器,但这个原始逃生口是 `acpx` CLI 的功能(不是 OpenClaw 常规的 `agentId` 路径)。
## 必需配置
核心 ACP 基线配置:
```json5
{
acp: {
enabled: true,
// 可选。默认值为 true设为 false 可暂停 ACP 分发,同时保留 /acp 控制。
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: [
"claude",
"codex",
"copilot",
"cursor",
"droid",
"gemini",
"iflow",
"kilocode",
"kimi",
"kiro",
"openclaw",
"opencode",
"pi",
"qwen",
],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: {
ttlMinutes: 120,
},
},
}
```
线程绑定配置与渠道适配器相关。以下是 Discord 的示例:
```json5
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
},
},
},
}
```
如果基于线程绑定的 ACP 派生不起作用,请先检查适配器功能开关:
- Discord`channels.discord.threadBindings.spawnAcpSessions=true`
当前会话绑定不需要创建子线程。它们需要一个活跃的会话上下文,以及一个暴露 ACP 会话绑定能力的渠道适配器。
参见 [Configuration Reference](/zh-CN/gateway/configuration-reference)。
## `acpx` 后端的插件设置
全新安装默认会启用内置的 `acpx` 运行时插件,因此 ACP 通常无需手动安装插件即可工作。
先运行:
```text
/acp doctor
```
如果你禁用了 `acpx`、通过 `plugins.allow` / `plugins.deny` 拒绝了它,或者想切换到本地开发检出版本,请使用显式插件路径:
```bash
openclaw plugins install acpx
openclaw config set plugins.entries.acpx.enabled true
```
开发期间安装本地工作区版本:
```bash
openclaw plugins install ./path/to/local/acpx-plugin
```
然后验证后端健康状态:
```text
/acp doctor
```
### `acpx` 命令与版本配置
默认情况下,内置的 `acpx` 插件使用其插件本地固定版本的二进制文件(插件包内的 `node_modules/.bin/acpx`)。启动时会先将后端注册为未就绪状态,并由后台任务验证 `acpx --version`;如果缺少该二进制文件或版本不匹配,它会运行 `npm install --omit=dev --no-save acpx@<pinned>`然后再次验证。整个过程中Gateway 网关始终保持非阻塞。
你可以在插件配置中覆盖命令或版本:
```json
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}
```
- `command` 接受绝对路径、相对路径(相对于 OpenClaw 工作区解析)或命令名。
- `expectedVersion: "any"` 会禁用严格版本匹配。
- 自定义 `command` 路径会禁用插件本地自动安装。
参见 [Plugins](/zh-CN/tools/plugin)。
### 自动安装依赖
当你通过 `npm install -g openclaw` 全局安装 OpenClaw 时,`acpx`
运行时依赖(平台相关二进制文件)会通过 `postinstall` 钩子自动安装。如果自动安装失败Gateway 网关仍会正常启动,并通过 `openclaw acp doctor` 报告缺失的依赖。
### Plugin tools MCP 桥接器
默认情况下ACPX 会话**不会**将 OpenClaw 插件注册的工具暴露给
ACP harness。
如果你希望 Codex 或 Claude Code 等 ACP 智能体调用已安装的
OpenClaw 插件工具,例如 memory recall/store请启用专用桥接器
```bash
openclaw config set plugins.entries.acpx.config.pluginToolsMcpBridge true
```
这会带来以下效果:
- 在 ACPX 会话引导过程中注入一个名为 `openclaw-plugin-tools` 的内置 MCP 服务器。
- 暴露已安装并启用的 OpenClaw 插件已注册的插件工具。
- 使该功能保持显式启用,且默认关闭。
安全与信任说明:
- 这会扩大 ACP harness 的工具暴露面。
- ACP 智能体只能访问 Gateway 网关中已经激活的插件工具。
- 请将其视为与允许这些插件在 OpenClaw 自身中执行相同的信任边界。
- 启用前请检查已安装的插件。
自定义 `mcpServers` 仍然和以前一样可用。内置的 `plugin-tools` 桥接器只是额外的可选便利功能,不是通用 MCP 服务器配置的替代方案。
### OpenClaw tools MCP 桥接器
默认情况下ACPX 会话也**不会**通过 MCP 暴露 OpenClaw 内置工具。当 ACP 智能体需要使用 `cron` 等选定的内置工具时,请启用单独的核心工具桥接器:
```bash
openclaw config set plugins.entries.acpx.config.openClawToolsMcpBridge true
```
这会带来以下效果:
- 在 ACPX 会话引导过程中注入一个名为 `openclaw-tools` 的内置 MCP 服务器。
- 暴露选定的 OpenClaw 内置工具。初始服务器会暴露 `cron`
- 使核心工具暴露保持显式启用,且默认关闭。
### 运行时超时配置
内置的 `acpx` 插件默认将嵌入式运行时轮次的超时时间设置为 120 秒。这让 Gemini CLI 等较慢的 harness 有足够时间完成 ACP 启动和初始化。如果你的主机需要不同的运行时限制,可以覆盖此值:
```bash
openclaw config set plugins.entries.acpx.config.timeoutSeconds 180
```
修改此值后,请重启 Gateway 网关。
### 健康探测智能体配置
内置的 `acpx` 插件在判断嵌入式运行时后端是否就绪时,会探测一个 harness 智能体。默认值为 `codex`。如果你的部署使用其他默认 ACP 智能体,请将探测智能体设置为相同的 id
```bash
openclaw config set plugins.entries.acpx.config.probeAgent claude
```
修改此值后,请重启 Gateway 网关。
## 权限配置
ACP 会话以非交互方式运行——没有 TTY 可用于批准或拒绝文件写入和 shell 执行权限提示。`acpx` 插件提供了两个配置键,用于控制权限处理方式:
这些 ACPX harness 权限与 OpenClaw 的执行审批是分开的,也与 CLI 后端供应商的绕过标志分开,例如 Claude CLI 的 `--permission-mode bypassPermissions`。对于 ACP 会话ACPX 的 `approve-all` 是 harness 层级的紧急放开开关。
### `permissionMode`
控制 harness 智能体无需提示即可执行哪些操作。
| 值 | 行为 |
| --------------- | ------------------------------------------- |
| `approve-all` | 自动批准所有文件写入和 shell 命令。 |
| `approve-reads` | 仅自动批准读取;写入和执行仍需要提示。 |
| `deny-all` | 拒绝所有权限提示。 |
### `nonInteractivePermissions`
控制当本应显示权限提示但没有可交互 TTY 时会发生什么ACP 会话始终都是这种情况)。
| 值 | 行为 |
| ------ | ----------------------------------------------------------------- |
| `fail` | 使用 `AcpRuntimeError` 中止会话。**(默认)** |
| `deny` | 静默拒绝该权限并继续执行(优雅降级)。 |
### 配置方式
通过插件配置设置:
```bash
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
```
修改这些值后,请重启 Gateway 网关。
> **重要:** OpenClaw 当前默认使用 `permissionMode=approve-reads``nonInteractivePermissions=fail`。在非交互式 ACP 会话中,任何触发权限提示的写入或执行操作都可能因 `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` 而失败。
>
> 如果你需要限制权限,请将 `nonInteractivePermissions` 设为 `deny`,这样会话会优雅降级,而不是直接崩溃。
## 相关内容
- [ACP 智能体](/zh-CN/tools/acp-agents) —— 概览、运维手册、核心概念
- [Sub-agents](/zh-CN/tools/subagents)
- [Multi-agent routing](/zh-CN/concepts/multi-agent)

View File

@ -1,138 +1,140 @@
---
read_when:
- 通过 ACP 运行编码 harness
- 在消息渠道上设置绑定到对话的 ACP 会话
- 将消息渠道中的一个对话绑定到持久化 ACP 会话
- 在消息渠道上设置与对话绑定的 ACP 会话
- 将消息渠道中的对话绑定到持久化 ACP 会话
- 排查 ACP 后端和插件接线问题
- 调试 ACP 完成结果投递或智能体到智能体循环
- 从聊天中使用 /acp 命令进行操作
summary: Codex、Claude Code、Cursor、Gemini CLI、OpenClaw ACP 和其他 harness 智能体使用 ACP 运行时会话
- 调试 ACP 完成结果传递或智能体到智能体循环问题
- 从聊天中操作 `/acp` 命令
summary: Codex、Claude Code、Cursor、Gemini CLI、OpenClaw ACP 和其他 harness 智能体使用 ACP 运行时会话
title: ACP 智能体
x-i18n:
generated_at: "2026-04-23T23:04:20Z"
generated_at: "2026-04-24T02:39:43Z"
model: gpt-5.4
provider: openai
source_hash: cfbce828d3c74b340cedf86c2e771401a618524b4fc1a716a84d85c5d2cd106d
source_hash: d09d4142ad56d9782ed5d7e40f7eab4c89f22131d35f749fcb07700c4d354e30
source_path: tools/acp-agents.md
workflow: 15
---
[Agent Client ProtocolACP](https://agentclientprotocol.com/) 会话允许 OpenClaw 通过 ACP 后端插件运行外部编码 harness例如 Pi、Claude Code、Codex、Cursor、Copilot、OpenClaw ACP、OpenCode、Gemini CLI以及其他受支持的 ACPX harness
[Agent Client ProtocolACP](https://agentclientprotocol.com/) 会话让 OpenClaw 能够通过 ACP 后端插件运行外部编码 harness例如 Pi、Claude Code、Codex、Cursor、Copilot、OpenClaw ACP、OpenCode、Gemini CLI以及其他受支持的 ACPX harness
如果你用自然语言要求 OpenClaw “在 Codex 中运行这个”或“在线程中启动 Claude Code”OpenClaw 应将该请求路由到 ACP 运行时(而不是原生子智能体运行时)。每个 ACP 会话启动都会被跟踪为一个[后台任务](/zh-CN/automation/tasks)。
如果你用自然语言让 OpenClaw “在 Codex 里运行这个”或“在线程里启动 Claude Code”OpenClaw 应该将该请求路由到 ACP 运行时(而不是原生子智能体运行时)。每次 ACP 会话启动都会被跟踪为一个[后台任务](/zh-CN/automation/tasks)。
如果你希望 Codex 或 Claude Code 作为外部 MCP 客户端直接连接到现有的 OpenClaw 渠道对话,请使用 [`openclaw mcp serve`](/zh-CN/cli/mcp),而不是 ACP。
如果你想让 Codex 或 Claude Code 作为外部 MCP 客户端直接连接
到现有的 OpenClaw 渠道对话,请使用 [`openclaw mcp serve`](/zh-CN/cli/mcp)
而不是 ACP。
## 我需要哪个页面?
## 我需要哪个页面?
这里有三个相邻但很容易混淆的功能面:
这里有三个相近且容易混淆的功能面:
| 你想要…… | 使用这个 | 说明 |
| ---------------------------------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 通过 OpenClaw 运行 Codex、Claude Code、Gemini CLI 或其他外部 harness | 本页ACP 智能体 | 绑定聊天的会话、`/acp spawn`、`sessions_spawn({ runtime: "acp" })`、后台任务、运行时控制 |
| 将一个 OpenClaw Gateway 网关会话暴露为一个 ACP 服务器,供编辑器或客户端使用 | [`openclaw acp`](/zh-CN/cli/acp) | 桥接模式。IDE/客户端通过 stdio/WebSocket 以 ACP 方式与 OpenClaw 通信 |
| 将本地 AI CLI 复用为纯文本回退模型 | [CLI Backends](/zh-CN/gateway/cli-backends) | 不是 ACP。没有 OpenClaw 工具、没有 ACP 控制、没有 harness 运行时 |
| 通过 OpenClaw 运行 Codex、Claude Code、Gemini CLI 或其他外部 harness | 本页ACP 智能体 | 与聊天绑定的会话、`/acp spawn`、`sessions_spawn({ runtime: "acp" })`、后台任务、运行时控制 |
| 将 OpenClaw Gateway 网关会话作为 ACP 服务器暴露给编辑器或客户端 | [`openclaw acp`](/zh-CN/cli/acp) | 桥接模式。IDE/客户端 通过 stdio/WebSocket 使用 ACP 与 OpenClaw 通信 |
| 将本地 AI CLI 复用为仅文本的回退模型 | [CLI Backends](/zh-CN/gateway/cli-backends) | 不是 ACP。没有 OpenClaw 工具、没有 ACP 控制、没有 harness 运行时 |
## 开箱即用吗?
通常可以。全新安装默认启用了内置的 `acpx` 运行时插件,并带有插件本地固定版本的 `acpx` 二进制文件OpenClaw 会在启动时探测并自我修复。运行 `/acp doctor` 可进行就绪性检查。
通常可以。全新安装会默认启用内置的 `acpx` 运行时插件,并附带一个插件本地固定版本的 `acpx` 二进制文件OpenClaw 会在启动时探测并自我修复。运行 `/acp doctor` 可进行就绪性检查。
首次运行的常见问题
首次运行的常见注意事项
- 目标 harness 适配器Codex、Claude 等)可能会在你次使用时通过 `npx` 按需拉取。
- 该 harness 的供应商凭证仍然必须已存在于主机上。
- 如果主机没有 npm 或网络访问能力,首次适配器拉取将失败,直到缓存被预热或适配器通过其他方式安装
- 目标 harness 适配器Codex、Claude 等)可能会在你第一次使用时通过 `npx` 按需拉取。
- 该 harness 对应的供应商认证仍然必须已存在于宿主机上。
- 如果宿主机没有 npm 或网络访问能力,首次运行时的适配器拉取会失败,直到缓存被预热或以其他方式安装该适配器
## 操作手册
在聊天中快速使用 `/acp` 的流程:
1. **启动** `/acp spawn codex --bind here``/acp spawn codex --mode persistent --thread auto`
2. 在绑定的对话或线程中**工作**(或者显式指定会话键)。
3. **检查状态** `/acp status`
4. **调优** `/acp model <provider/model>`、`/acp permissions <profile>`、`/acp timeout <seconds>`
5. 在不替换上下文的情况下进行**引导** —`/acp steer tighten logging and continue`
6. **停止** `/acp cancel`(当前轮次)或 `/acp close`(会话 + 绑定)
1. **启动**`/acp spawn codex --bind here``/acp spawn codex --mode persistent --thread auto`
2. 在绑定的对话或线程中**处理工作**(或者显式指定会话键)。
3. **检查状态**`/acp status`
4. **调优**`/acp model <provider/model>`、`/acp permissions <profile>`、`/acp timeout <seconds>`
5. **引导**而不替换上下文 `/acp steer tighten logging and continue`
6. **停止**`/acp cancel`(当前轮次)或 `/acp close`(会话 + 绑定)
应当路由到 ACP 运行时的自然语言触发示例:
- “把这个 Discord 频道绑定到 Codex。”
- “在这里的一个线程中启动一个持久的 Codex 会话。”
- “把这个作为一次性 Claude Code ACP 会话运行,并总结结果。”
- “这个任务使用 Gemini CLI 在线程中运行,然后后续继续在同一个线程中处理。”
- “在这里的线程里启动一个持久的 Codex 会话。”
- “把这个作为一次性 Claude Code ACP 会话运行,并总结结果。”
- “这个任务使用 Gemini CLI 在线程中处理,然后后续继续在同一个线程里进行。”
OpenClaw 会选择 `runtime: "acp"`,解析 harness `agentId`,在支持时绑定到当前对话或线程,并将后续消息路由到该会话,直到关闭或过期。
OpenClaw 会选择 `runtime: "acp"`,解析 harness `agentId`,在支持的情况下绑定到当前对话或线程,并将后续消息路由到该会话,直到关闭或过期。
## ACP 与子智能体
## ACP 与子智能体的区别
当你想使用外部 harness 运行时时,请使用 ACP。当你想使用 OpenClaw 原生委派运行时,请使用子智能体。
如果你想使用外部 harness 运行时,请使用 ACP。如果你想使用 OpenClaw 原生委派运行,请使用子智能体。
| 域 | ACP 会话 | 子智能体运行 |
| 域 | ACP 会话 | 子智能体运行 |
| ------------- | ------------------------------------- | ---------------------------------- |
| 运行时 | ACP 后端插件(例如 acpx | OpenClaw 原生子智能体运行时 |
| 会话键 | `agent:<agentId>:acp:<uuid>` | `agent:<agentId>:subagent:<uuid>` |
| 主命令 | `/acp ...` | `/subagents ...` |
| 启动工具 | `runtime:"acp"``sessions_spawn` | `sessions_spawn`(默认运行时) |
| 主命令 | `/acp ...` | `/subagents ...` |
| 启动工具 | `sessions_spawn` with `runtime:"acp"` | `sessions_spawn`(默认运行时) |
请参见 [Sub-agents](/zh-CN/tools/subagents)。
另见 [Sub-agents](/zh-CN/tools/subagents)。
## ACP 如何运行 Claude Code
对于通过 ACP 运行的 Claude Code其栈结构是
对于通过 ACP 运行的 Claude Code其栈如下
1. OpenClaw ACP 会话控制平面
2. 内置 `acpx` 运行时插件
2. 内置 `acpx` 运行时插件
3. Claude ACP 适配器
4. Claude 侧运行时/会话机制
4. Claude 侧运行时/会话机制
重要区别:
一个重要区别:
- ACP Claude 是一种 harness 会话,具 ACP 控制、会话恢复、后台任务跟踪,以及可选的对话/线程绑定。
- CLI backends 是独立的纯文本本地回退运行时。参见 [CLI Backends](/zh-CN/gateway/cli-backends)。
- ACP Claude 是一种 harness 会话,具 ACP 控制、会话恢复、后台任务跟踪,以及可选的对话/线程绑定能力
- CLI 后端则是独立的、仅文本的本地回退运行时。参见 [CLI Backends](/zh-CN/gateway/cli-backends)。
操作员来说,实用规则是:
对操作员来说,实用规则是:
- 想要 `/acp spawn`、可绑定会话、运行时控制或持久化 harness 工作:使用 ACP
- 想要通过原始 CLI 进行简单的本地文本回退:使用 CLI backends
- 想要 `/acp spawn`、可绑定会话、运行时控制或持久化 harness 工作:使用 ACP
- 想要通过原始 CLI 获得简单的本地文本回退:使用 CLI 后端
## 绑定会话
## 绑定会话
### 绑定到当前对话
`/acp spawn <harness> --bind here` 会将当前对话固定到新启动的 ACP 会话——不会创建子线程仍使用同一聊天界面。OpenClaw 继续负责传输、凭证、安全和投递;该对话中的后续消息会路由到同一个会话;`/new` 和 `/reset` 会在原重置该会话;`/acp close` 会移除该绑定。
`/acp spawn <harness> --bind here` 会将当前对话固定绑定到新启动的 ACP 会话 —— 不创建子线程仍在同一个聊天界面中。OpenClaw 继续负责传输、认证、安全和消息投递;该对话中的后续消息会路由到同一个会话;`/new` 和 `/reset` 会在原重置该会话;`/acp close` 会移除该绑定。
心智模型:
理解模型:
- **聊天界面**— 人们持续交流的地方Discord 频道、Telegram 主题、iMessage 聊天)。
- **ACP 会话** OpenClaw 路由到的持久化 Codex/Claude/Gemini 运行时状态。
- **子线程/主题** —— 仅在使用 `--thread ...` 时才会创建的可选额外消息界面
- **运行时工作区** harness 实际运行的文件系统位置(`cwd`、代码仓库检出目录、后端工作区)。它独立于聊天界面。
- **聊天界面** 人们持续对话的地方Discord 频道、Telegram 话题、iMessage 聊天)。
- **ACP 会话** — OpenClaw 路由到的持久化 Codex/Claude/Gemini 运行时状态。
- **子线程/话题** — 一个可选的额外消息界面,仅在使用 `--thread ...` 时创建
- **运行时工作区** — harness 运行所在的文件系统位置(`cwd`、仓库检出目录、后端工作区)。它独立于聊天界面。
示例:
- `/acp spawn codex --bind here` 保持当前聊天,启动或附加 Codex并将未来消息路由到这里。
- `/acp spawn codex --thread auto`— OpenClaw 可能会创建一个子线程/主题并绑定到那里。
- `/acp spawn codex --bind here --cwd /workspace/repo` 仍绑定当前聊天,但 Codex 在 `/workspace/repo` 中运行。
- `/acp spawn codex --bind here` — 保持当前聊天,启动或附加 Codex并将未来消息路由到这里。
- `/acp spawn codex --thread auto` OpenClaw 可能会创建一个子线程/话题并绑定到那里。
- `/acp spawn codex --bind here --cwd /workspace/repo` — 仍绑定当前聊天,但 Codex 在 `/workspace/repo` 中运行。
说明:
- `--bind here` `--thread ...` 互斥。
- `--bind here` `--thread ...` 互斥。
- `--bind here` 仅适用于声明支持当前对话绑定的渠道;否则 OpenClaw 会返回清晰的不支持提示。绑定会在 Gateway 网关重启后继续保留。
- 在 Discord 上,只有当 OpenClaw 需要为 `--thread auto|here` 创建子线程时,才需要 `spawnAcpSessions` —— 对于 `--bind here` 则不需要。
- 如果你在没有 `--cwd` 的情况下启动到另一个 ACP 智能体OpenClaw 默认会继承**目标智能体的**工作区。缺失的继承路径(`ENOENT`/`ENOTDIR`)会回退到后端默认值;其他访问错误(例如 `EACCES`)会作为启动错误暴露。
- 如果你启动到另一个 ACP 智能体且未指定 `--cwd`OpenClaw 默认会继承**目标智能体的**工作区。缺失的继承路径(`ENOENT`/`ENOTDIR`)会回退到后端默认值;其他访问错误(例如 `EACCES`)会作为启动错误直接暴露。
### 绑定到线程的会话
当某个渠道适配器启用了线程绑定时ACP 会话可以绑定到线程:
- OpenClaw 将一个线程绑定到目标 ACP 会话。
- 该线程中的后续消息会路由到绑定的 ACP 会话。
- ACP 输出会投递回同一个线程。
- 失焦/关闭/归档/空闲超时或最大存活时间到期后,会移除该绑定。
- OpenClaw 将线程绑定到目标 ACP 会话。
- 该线程中的后续消息会路由到绑定的 ACP 会话。
- ACP 输出会回传到同一个线程。
- 失焦/关闭/归档/空闲超时或最大存活时间到期会移除该绑定。
线程绑定支持取决于适配器。如果当前渠道适配器不支持线程绑定OpenClaw 会返回清晰的不支持/不可用提示。
线程绑定 ACP 所需功能标志:
线程绑定 ACP 所需功能标志:
- `acp.enabled=true`
- `acp.dispatch.enabled` 默认开启(设为 `false` 可暂停 ACP 分发)
@ -145,25 +147,25 @@ OpenClaw 会选择 `runtime: "acp"`,解析 harness `agentId`,在支持时绑
- 任何暴露会话/线程绑定能力的渠道适配器。
- 当前内置支持:
- Discord 线程/频道
- Telegram topics群组/超级群组中的 forum topics 和私信 topics
- 插件渠道也可以通过同一绑定接口添加支持。
- Telegram 话题(群组/超级群组中的论坛话题,以及私信话题
- 渠道插件也可以通过同一绑定接口添加支持。
## 渠道特定设置
对于非临时工作流,请在顶层 `bindings[]` 条目中配置持久化 ACP 绑定。
对于非临时工作流,请在顶层 `bindings[]` 条目中配置持久化 ACP 绑定。
### 绑定模型
- `bindings[].type="acp"` 表示一个持久 ACP 对话绑定。
- `bindings[].match` 标识目标对话:
- `bindings[].type="acp"` 表示一个持久 ACP 对话绑定。
- `bindings[].match` 用于标识目标对话:
- Discord 频道或线程:`match.channel="discord"` + `match.peer.id="<channelOrThreadId>"`
- Telegram forum topic`match.channel="telegram"` + `match.peer.id="<chatId>:topic:<topicId>"`
- BlueBubbles 私/群聊:`match.channel="bluebubbles"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
- Telegram 论坛话题`match.channel="telegram"` + `match.peer.id="<chatId>:topic:<topicId>"`
- BlueBubbles 私/群聊:`match.channel="bluebubbles"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
对于稳定的群组绑定,优先使用 `chat_id:*``chat_identifier:*`
- iMessage 私/群聊:`match.channel="imessage"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
- iMessage 私/群聊:`match.channel="imessage"` + `match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"`
对于稳定的群组绑定,优先使用 `chat_id:*`
- `bindings[].agentId`拥有该绑定的 OpenClaw 智能体 id。
- 可选的 ACP 覆盖位于 `bindings[].acp` 下:
- `bindings[].agentId`所属的 OpenClaw 智能体 id。
- 可选的 ACP 覆盖位于 `bindings[].acp` 下:
- `mode``persistent` 或 `oneshot`
- `label`
- `cwd`
@ -267,22 +269,22 @@ ACP 绑定会话的覆盖优先级:
行为:
- OpenClaw 会在使用前确保已配置的 ACP 会话存在
- 该频道或主题中的消息会路由到已配置的 ACP 会话。
- 在已绑定对话中,`/new` 和 `/reset` 会在原地重置同一个 ACP 会话键。
- 临时运行时绑定(例如由线程聚焦流程创建的绑定)在存在时仍然适用
- OpenClaw 会在使用前确保已存在配置的 ACP 会话。
- 该频道或话题中的消息会路由到配置好的 ACP 会话。
- 在绑定的对话中,`/new` 和 `/reset` 会在原位重置同一个 ACP 会话键。
- 临时运行时绑定(例如通过线程聚焦流程创建的绑定)在存在时仍会生效
- 对于未显式指定 `cwd` 的跨智能体 ACP 启动OpenClaw 会从智能体配置中继承目标智能体工作区。
- 缺失的继承工作区路径会回退到后端默认 cwd非缺失访问失败会作为启动错误暴露。
- 缺失的继承工作区路径会回退到后端默认 `cwd`;非缺失访问失败会作为启动错误直接暴露。
## 启动 ACP 会话(接口)
### 从 `sessions_spawn`
### 从 `sessions_spawn` 启动
使用 `runtime: "acp"`从智能体轮次或工具调用中启动一个 ACP 会话。
使用 `runtime: "acp"` 可从智能体轮次或工具调用中启动 ACP 会话。
```json
{
"task": "Open the repo and summarize failing tests",
"task": "打开仓库并总结失败的测试",
"runtime": "acp",
"agentId": "codex",
"thread": true,
@ -292,9 +294,9 @@ ACP 绑定会话的覆盖优先级:
说明:
- `runtime` 默认值是 `subagent`,因此对于 ACP 会话请显式设置 `runtime: "acp"`
- `runtime` 默认`subagent`,因此 ACP 会话必须显式设置 `runtime: "acp"`
- 如果省略 `agentId`OpenClaw 会在已配置时使用 `acp.defaultAgent`
- `mode: "session"` 需要 `thread: true`,以保持持久的绑定对话。
- `mode: "session"` 需要 `thread: true` 才能保持一个持久化的绑定对话。
接口详情:
@ -303,110 +305,110 @@ ACP 绑定会话的覆盖优先级:
- `agentId`可选ACP 目标 harness id。如果已设置则回退到 `acp.defaultAgent`
- `thread`(可选,默认 `false`):在支持时请求线程绑定流程。
- `mode`(可选):`run`(一次性)或 `session`(持久化)。
- 默认`run`
- 如果 `thread: true`未指定 modeOpenClaw 可能会根据运行时路径默认采用持久化行为
- 默认为 `run`
- 如果 `thread: true`省略 `mode`OpenClaw 可能会根据运行时路径默认采用持久化行为
- `mode: "session"` 需要 `thread: true`
- `cwd`(可选):请求的运行时工作目录(由后端/运行时策略验。如果省略ACP 启动会在已配置时继承目标智能体工作区;缺失的继承路径会回退到后端默认值,而真实的访问错误会直接返回。
- `cwd`(可选):请求的运行时工作目录(由后端/运行时策略。如果省略ACP 启动会在已配置时继承目标智能体工作区;缺失的继承路径会回退到后端默认值,而真实的访问错误会直接返回。
- `label`(可选):用于会话/横幅文本中的面向操作员标签。
- `resumeSessionId`(可选):恢复现有 ACP 会话,而不是创建新会话。智能体会通过 `session/load` 重放其对话历史。需要 `runtime: "acp"`
- `streamTo`(可选):`"parent"` 会将初始 ACP 运行进度摘要作为系统事件流式回传给请求方会话。
- 可用时,接受的响应会包含 `streamLogPath`,指向一个按会话划分的 JSONL 日志(`<sessionId>.acp-stream.jsonl`),你可以对其执行 tail 以查看完整中继历史。
- `model`(可选):对子 ACP 会话显式覆盖模型。对于 `runtime: "acp"` 会生效,因此子会话会使用所请求的模型,而不是静默回退到目标智能体默认值
- `streamTo`(可选):`"parent"` 会将初始 ACP 运行进度摘要作为系统事件流式回传给请求方会话。
- 可用时,接受的响应会包含 `streamLogPath`,指向一个按会话划分的 JSONL 日志(`<sessionId>.acp-stream.jsonl`),你可以 tail 它来查看完整的中继历史。
- `model`(可选):为 ACP 子会话显式覆盖模型。对 `runtime: "acp"` 生效,因此子会话会使用所请求的模型,而不是静默回退到目标智能体默认模型
## 投递模型
## 交付模型
ACP 会话既可以是交互式工作区,也可以是由父会话拥有的后台工作。投递路径取决于其形态。
ACP 会话既可以是交互式工作区,也可以是由父级拥有的后台工作。交付路径取决于它的形态。
### 交互式 ACP 会话
交互式会话旨在继续在可见的聊天界面中对话
交互式会话旨在让你持续在可见的聊天界面中交流
- `/acp spawn ... --bind here` 将当前对话绑定到 ACP 会话。
- `/acp spawn ... --thread ...` 会将一个渠道线程/主题绑定到 ACP 会话。
- `/acp spawn ... --bind here` 将当前对话绑定到 ACP 会话。
- `/acp spawn ... --thread ...` 将某个渠道线程/话题绑定到 ACP 会话。
- 持久化配置的 `bindings[].type="acp"` 会将匹配的对话路由到同一个 ACP 会话。
绑定对话中的后续消息会直接路由到 ACP 会话,而 ACP 输出会投递回同一个渠道/线程/主题。
绑定对话中的后续消息会直接路由到 ACP 会话,ACP 输出也会回传到同一个频道/线程/话题。
### 由父会话拥有的一次性 ACP 会话
### 由父拥有的一次性 ACP 会话
由另一智能体运行启动的一次性 ACP 会话属于后台子会话,类似于子智能体:
由另一个智能体运行启动的一次性 ACP 会话是后台子级,类似子智能体:
- 父会话通过 `sessions_spawn({ runtime: "acp", mode: "run" })` 请求工作。
- 子会话在自己的 ACP harness 会话中运行。
- 父通过 `sessions_spawn({ runtime: "acp", mode: "run" })` 请求工作。
- 子在自己的 ACP harness 会话中运行。
- 完成结果通过内部任务完成通知路径回报。
- 当需要面向用户的回复时,父会话会用正常助手口吻重写子会话结果。
- 当需要面向用户的回复时,父级会用普通助手口吻重写子级结果。
不要将此路径视为父子之间的点对点聊天。子会话已经有一条回到父会话的完成结果通道。
不要把这一路径视为父子之间的点对点聊天。子级已经有一条回传完成结果给父级的通道。
### `sessions_send` 和 A2A 投递
### `sessions_send` 与 A2A 交付
`sessions_send`在启动后指向另一个会话。对于普通对等会话OpenClaw 在注入消息后会使用一条智能体到智能体A2A的后续路径
`sessions_send`以在启动后将消息发送到另一个会话。对于普通对等会话OpenClaw 在注入消息后会使用智能体到智能体A2A的后续跟进路径:
- 等待目标会话回复
- 可选地允许请求方和目标方交换有限数量的后续轮次
- 请求目标方生成一条通知消息
- 将该通知投递到可见道或线程
- 等待目标会话回复
- 可选地让请求方与目标交换有限轮数的后续消息
- 要求目标生成一条通知消息
- 将该通知投递到可见的频道或线程
这条 A2A 路径是用于对等发送的一种回退方案,适用于发送方需要一个可见后续结果的情况。当某个无关会话能够看到并给 ACP 目标发消息时,它仍保持启用,例如在较宽松的 `tools.sessions.visibility` 设置下。
这条 A2A 路径是对等发送时的一种回退机制,用于发送方需要可见跟进结果的场景。当一个无关会话能够看到并向 ACP 目标发送消息时,它仍然保持启用,例如在较宽松的 `tools.sessions.visibility` 设置下。
仅当请求方是其自己所拥有的、由父会话拥有的一次性 ACP 子会话的父会话时OpenClaw 才会跳过 A2A 后续流程。在这种情况下,如果在任务完成之上再运行 A2A可能会用子会话结果唤醒父会话再把父会话的回复回送进子会话从而形成父/子回声循环。对于这种已拥有的子会话场景,`sessions_send` 结果会报告 `delivery.status="skipped"`,因为完成路径已经负责结果。
只有当请求方是其自有的一次性 ACP 子会话的父级时OpenClaw 才会跳过 A2A 跟进。在这种情况下,如果在任务完成之上再运行 A2A就可能用子级结果唤醒父级再将父级回复转发回子级从而形成父子回声循环。对于这种自有子级场景,`sessions_send` 结果会报告 `delivery.status="skipped"`,因为完成路径已经负责处理结果。
### 恢复现有会话
使用 `resumeSessionId`继续之前的 ACP 会话,而不是重新开始。智能体会通过 `session/load` 重放其对话历史,因此它能够带着完整上下文继续之前的工作。
使用 `resumeSessionId` 可继续之前的 ACP 会话,而不是重新开始。智能体会通过 `session/load` 重放其对话历史,因此它会带着之前的完整上下文继续工作。
```json
{
"task": "Continue where we left off — fix the remaining test failures",
"task": "从我们上次停下的地方继续——修复剩余的测试失败",
"runtime": "acp",
"agentId": "codex",
"resumeSessionId": "<previous-session-id>"
}
```
常见使用场景
常见用例
- 将一个 Codex 会话从你的笔记本电脑交接到手机——告诉你的智能体继续你之前的工作
- 继续一个你最初在 CLI 中交互式启动、现在希望通过智能体无头继续的编码会话
- 将一个 Codex 会话从你的笔记本电脑交接到手机 —— 告诉你的智能体从你上次停下的地方继续
- 继续一个你此前在 CLI 中交互式启动、现在要通过智能体以无头方式继续的编码会话
- 继续处理因 Gateway 网关重启或空闲超时而中断的工作
说明:
- `resumeSessionId` 需要 `runtime: "acp"` —— 如果与子智能体运行时一起使用会返回错误。
- `resumeSessionId` 会恢复上游 ACP 对话历史;`thread` 和 `mode` 仍会正常应用于你正在创建的新 OpenClaw 会话,因此 `mode: "session"` 仍然要求 `thread: true`
- 目标智能体必须支持 `session/load`Codex 和 Claude Code 支持)。
- 如果找不到该会话 ID启动会以清晰错误失败——不会静默回退为新会话。
- `resumeSessionId` 需要 `runtime: "acp"` —— 如果与子智能体运行时一起使用会返回错误。
- `resumeSessionId` 会恢复上游 ACP 对话历史;`thread` 和 `mode`会正常应用于你正在创建的新 OpenClaw 会话,因此 `mode: "session"` 仍然要求 `thread: true`
- 目标智能体必须支持 `session/load`Codex 和 Claude Code 支持)。
- 如果找不到该会话 id启动会以清晰错误失败 —— 不会静默回退到新会话。
<Accordion title="部署后冒烟测试">
Gateway 网关部署后,请运行一次实时端到端检查,而不要只信任单元测试:
Gateway 网关部署后,请运行一次真实的端到端检查,而不要只依赖单元测试:
1. 验证目标主机上的已部署 Gateway 网关版本和提交。
2. 打开一个指向实时智能体的临时 ACPX 桥接会话
3. 要求该智能体调用 `sessions_spawn`参数为 `runtime: "acp"`、`agentId: "codex"`、`mode: "run"`,任务内容为 `Reply with exactly LIVE-ACP-SPAWN-OK`
4. 验证 `accepted=yes`、存在真实的 `childSessionKey`,并且没有验器错误。
1. 在目标主机上验证已部署的 Gateway 网关版本和提交。
2. 打开一个临时的 ACPX 桥接会话连接到在线智能体
3. 要求该智能体调用 `sessions_spawn`并设置 `runtime: "acp"`、`agentId: "codex"`、`mode: "run"`,任务内容为 `Reply with exactly LIVE-ACP-SPAWN-OK`
4. 验证 `accepted=yes`、存在真实的 `childSessionKey`,并且没有验器错误。
5. 清理该临时桥接会话。
请将门槛保持在 `mode: "run"`,并跳过 `streamTo: "parent"` —— 绑定线程的 `mode: "session"` 和流式中继路径属于单独、更丰富的集成测试阶段。
请将门槛保持在 `mode: "run"`,并跳过 `streamTo: "parent"` —— 绑定线程的 `mode: "session"` 和流中继路径属于另外更丰富的集成验证阶段。
</Accordion>
## 沙箱兼容性
ACP 会话当前运行在主机运行时中,而不是在 OpenClaw 沙箱内运行
ACP 会话当前运行在宿主运行时上,而不是 OpenClaw 沙箱内部
当前限制:
- 如果请求方会话处于沙箱中,那么对于 `sessions_spawn({ runtime: "acp" })``/acp spawn`ACP 启动都会被阻止。
- 如果请求方会话处于沙箱中,`sessions_spawn({ runtime: "acp" })``/acp spawn`ACP 启动都会被阻止。
- 错误:`Sandboxed sessions cannot spawn ACP sessions because runtime="acp" runs on the host. Use runtime="subagent" from sandboxed sessions.`
- 带 `runtime: "acp"``sessions_spawn` 不支持 `sandbox: "require"`
- 带 `runtime: "acp"``sessions_spawn` 不支持 `sandbox: "require"`
- 错误:`sessions_spawn sandbox="require" is unsupported for runtime="acp" because ACP sessions run outside the sandbox. Use runtime="subagent" or sandbox="inherit".`
当你需要由沙箱强制执行时,请使用 `runtime: "subagent"`
当你需要由沙箱强制执行的运行时,请使用 `runtime: "subagent"`
### 从 `/acp` 命令启动
聊天中需要显式操作员控制时,使用 `/acp spawn`
在需要时,使用 `/acp spawn` 从聊天中进行显式的操作员控制
```text
/acp spawn codex --mode persistent --thread auto
@ -427,15 +429,15 @@ ACP 会话当前运行在主机运行时中,而不是在 OpenClaw 沙箱内运
## 会话目标解析
大多数 `/acp` 操作都接受一个可选会话目标(`session-key`、`session-id` 或 `session-label`)。
大多数 `/acp` 操作都接受一个可选会话目标(`session-key`、`session-id` 或 `session-label`)。
解析顺序:
1. 显式目标参数(或 `/acp steer``--session`
- 先尝试 key
- 尝试 UUID 形状的 session id
- 然后尝试 label
2. 当前线程绑定(如果这个对话/线程绑定到了某个 ACP 会话)
- 然后尝试 UUID 形状的 session id
- 尝试 label
2. 当前线程绑定(如果此对话/线程已绑定到 ACP 会话)
3. 当前请求方会话回退
当前对话绑定和线程绑定都会参与第 2 步。
@ -448,15 +450,15 @@ ACP 会话当前运行在主机运行时中,而不是在 OpenClaw 沙箱内运
| 模式 | 行为 |
| ------ | ---------------------------------------------------------------------- |
| `here` | 原地绑定当前活动对话;如果当前没有活动对话则失败。 |
| `here` | 将当前活动对话原位绑定;如果当前没有活动对话则失败。 |
| `off` | 不创建当前对话绑定。 |
说明:
- `--bind here`操作员实现“让这个频道或聊天由 Codex 驱动”的最简单路径。
- `--bind here`“让这个频道或聊天由 Codex 支持”的最简单操作路径。
- `--bind here` 不会创建子线程。
- `--bind here` 仅在暴露当前对话绑定支持的渠道中可用。
- `--bind``--thread` 不能在同一`/acp spawn` 调用中组合使用。
- `--bind``--thread` 不能在同一`/acp spawn` 调用中同时使用。
## 启动线程模式
@ -466,328 +468,77 @@ ACP 会话当前运行在主机运行时中,而不是在 OpenClaw 沙箱内运
| ------ | --------------------------------------------------------------------------------------------------- |
| `auto` | 在活动线程中:绑定该线程。在线程外:在支持时创建/绑定一个子线程。 |
| `here` | 要求当前处于活动线程中;如果不在线程中则失败。 |
| `off` | 不绑定。会话以未绑定状态启动。 |
| `off` | 不进行绑定。会话以未绑定状态启动。 |
说明:
- 在不支持线程绑定的界面上,默认行为实际上等同于 `off`
- 绑定线程的启动需要渠道策略支持:
- 绑定线程的启动需要渠道策略支持:
- Discord`channels.discord.threadBindings.spawnAcpSessions=true`
- Telegram`channels.telegram.threadBindings.spawnAcpSessions=true`
- 如果你希望固定当前对话而不创建子线程,请使用 `--bind here`
- 当你想固定当前对话且不创建子线程时,请使用 `--bind here`
## ACP 控制
| 命令 | 作用 | 示例 |
| -------------------- | --------------------------------------------------------- | ------------------------------------------------------------- |
| `/acp spawn` | 创建 ACP 会话;可选当前绑定或线程绑定。 | `/acp spawn codex --bind here --cwd /repo` |
| `/acp spawn` | 创建 ACP 会话;可选当前对话绑定或线程绑定。 | `/acp spawn codex --bind here --cwd /repo` |
| `/acp cancel` | 取消目标会话的进行中轮次。 | `/acp cancel agent:codex:acp:<uuid>` |
| `/acp steer` | 向运行中的会话发送引导指令。 | `/acp steer --session support inbox prioritize failing tests` |
| `/acp close` | 关闭会话并解绑线程目标。 | `/acp close` |
| `/acp close` | 关闭会话并解除线程目标绑定。 | `/acp close` |
| `/acp status` | 显示后端、模式、状态、运行时选项和能力。 | `/acp status` |
| `/acp set-mode` | 设置目标会话的运行时模式。 | `/acp set-mode plan` |
| `/acp set` | 通用运行时配置项写入。 | `/acp set model openai/gpt-5.4` |
| `/acp set-mode` | 为目标会话设置运行时模式。 | `/acp set-mode plan` |
| `/acp set` | 通用运行时配置项写入。 | `/acp set model openai/gpt-5.4` |
| `/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-6` |
| `/acp reset-options` | 移除会话运行时选项覆盖。 | `/acp reset-options` |
| `/acp sessions` | 从存储中列出最近的 ACP 会话。 | `/acp sessions` |
| `/acp doctor` | 后端健康、能力、可执行修复建议。 | `/acp doctor` |
| `/acp sessions` | 列出存储中的最近 ACP 会话。 | `/acp sessions` |
| `/acp doctor` | 后端健康状态、能力和可执行修复建议。 | `/acp doctor` |
| `/acp install` | 打印确定性的安装和启用步骤。 | `/acp install` |
`/acp status` 会显示生效的运行时选项,以及运行时级别和后端级别的会话标识符。当某个后端缺少某项能力时,不支持的控制错误会被清晰显示。`/acp sessions` 会为当前已绑定或请求方会话读取存储;目标令牌`session-key`、`session-id` 或 `session-label`)会通过 Gateway 网关会话发现进行解析,包括智能体自定义的 `session.store` 根路径。
`/acp status` 会显示生效的运行时选项,以及运行时级别和后端级别的会话标识符。当后端缺少某项能力时,不支持控制的错误会被清晰地呈现出来。`/acp sessions` 会读取当前绑定会话或请求方会话的存储;目标标记`session-key`、`session-id` 或 `session-label`)会通过 Gateway 网关会话发现进行解析,包括每个智能体自定义的 `session.store` 根路径。
## 运行时选项映射
`/acp` 同时提供便捷命令和一个通用设置器。
`/acp` 提供便捷命令和一个通用设置器。
操作:
操作:
- `/acp model <id>` 映射到运行时配置键 `model`
- `/acp permissions <profile>` 映射到运行时配置键 `approval_policy`
- `/acp timeout <seconds>` 映射到运行时配置键 `timeout`
- `/acp cwd <path>` 直接更新运行时 cwd 覆盖。
- `/acp cwd <path>` 直接更新运行时 `cwd` 覆盖。
- `/acp set <key> <value>` 是通用路径。
- 特殊情况:`key=cwd` 使用 cwd 覆盖路径。
- 特殊情况:`key=cwd` 使用 `cwd` 覆盖路径。
- `/acp reset-options` 会清除目标会话的所有运行时覆盖。
## acpx harness 支持(当前)
## acpx harness、插件设置和权限
当前 acpx 内置 harness 别名:
- `claude`
- `codex`
- `copilot`
- `cursor`Cursor CLI`cursor-agent acp`
- `droid`
- `gemini`
- `iflow`
- `kilocode`
- `kimi`
- `kiro`
- `openclaw`
- `opencode`
- `pi`
- `qwen`
当 OpenClaw 使用 acpx 后端时,除非你的 acpx 配置定义了自定义智能体别名,否则 `agentId` 应优先使用这些值。
如果你本地安装的 Cursor 仍将 ACP 暴露为 `agent acp`,请在你的 acpx 配置中覆盖 `cursor` 智能体命令,而不是更改内置默认值。
直接使用 acpx CLI 也可以通过 `--agent <command>` 指向任意适配器,但这个原始逃生舱口属于 acpx CLI 功能(不是正常的 OpenClaw `agentId` 路径)。
## 必需配置
核心 ACP 基线配置:
```json5
{
acp: {
enabled: true,
// Optional. Default is true; set false to pause ACP dispatch while keeping /acp controls.
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: [
"claude",
"codex",
"copilot",
"cursor",
"droid",
"gemini",
"iflow",
"kilocode",
"kimi",
"kiro",
"openclaw",
"opencode",
"pi",
"qwen",
],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: {
ttlMinutes: 120,
},
},
}
```
线程绑定配置取决于具体的渠道适配器。Discord 示例:
```json5
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
},
},
},
}
```
如果绑定到线程的 ACP 启动不起作用,请先验证适配器功能标志:
- Discord`channels.discord.threadBindings.spawnAcpSessions=true`
当前对话绑定不需要创建子线程。它们需要一个活动对话上下文,以及一个暴露 ACP 对话绑定能力的渠道适配器。
参见 [配置参考](/zh-CN/gateway/configuration-reference)。
## acpx 后端的插件设置
全新安装默认启用了内置的 `acpx` 运行时插件,因此 ACP 通常无需手动安装插件即可工作。
先从以下命令开始:
```text
/acp doctor
```
如果你禁用了 `acpx`、通过 `plugins.allow` / `plugins.deny` 拒绝了它,或者你想切换到本地开发检出版本,请使用显式插件路径:
```bash
openclaw plugins install acpx
openclaw config set plugins.entries.acpx.enabled true
```
开发期间的本地工作区安装:
```bash
openclaw plugins install ./path/to/local/acpx-plugin
```
然后验证后端健康状态:
```text
/acp doctor
```
### acpx 命令和版本配置
默认情况下,内置的 `acpx` 插件使用其插件本地固定版本的二进制文件(插件包内的 `node_modules/.bin/acpx`)。启动时会先将后端注册为未就绪,并由后台任务验证 `acpx --version`;如果二进制缺失或版本不匹配,它会运行 `npm install --omit=dev --no-save acpx@<pinned>` 后再重新验证。整个过程中 Gateway 网关始终保持非阻塞。
在插件配置中覆盖命令或版本:
```json
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}
```
- `command` 接受绝对路径、相对路径(相对于 OpenClaw 工作区解析)或命令名。
- `expectedVersion: "any"` 会禁用严格版本匹配。
- 自定义 `command` 路径会禁用插件本地自动安装。
参见 [Plugins](/zh-CN/tools/plugin)。
### 自动依赖安装
当你通过 `npm install -g openclaw` 全局安装 OpenClaw 时acpx
运行时依赖(平台特定二进制文件)会通过 postinstall hook 自动安装。如果自动安装失败Gateway 网关仍会正常启动,并通过 `openclaw acp doctor` 报告缺失的依赖。
### 插件工具 MCP 桥接
默认情况下ACPX 会话**不会**将 OpenClaw 插件注册的工具暴露给 ACP harness。
如果你希望 Codex 或 Claude Code 这样的 ACP 智能体能够调用已安装的
OpenClaw 插件工具,例如记忆 recall/store请启用专用桥接
```bash
openclaw config set plugins.entries.acpx.config.pluginToolsMcpBridge true
```
其作用如下:
- 在 ACPX 会话引导中注入一个名为 `openclaw-plugin-tools` 的内置 MCP 服务器。
- 暴露已安装且已启用的 OpenClaw 插件已注册的插件工具。
- 让该功能保持显式开启,并默认关闭。
安全和信任说明:
- 这会扩大 ACP harness 的工具接口范围。
- ACP 智能体只能访问 Gateway 网关中已激活的插件工具。
- 请将其视为与允许这些插件在 OpenClaw 自身中执行相同的信任边界。
- 启用前请审查已安装的插件。
自定义 `mcpServers` 仍可照常使用。内置的插件工具桥接只是一个额外的选择启用便利功能,并不是对通用 MCP 服务器配置的替代。
### OpenClaw 工具 MCP 桥接
默认情况下ACPX 会话同样**不会**通过 MCP 暴露内置 OpenClaw 工具。当 ACP 智能体需要访问选定的内置工具(例如 `cron`)时,请启用单独的核心工具桥接:
```bash
openclaw config set plugins.entries.acpx.config.openClawToolsMcpBridge true
```
其作用如下:
- 在 ACPX 会话引导中注入一个名为 `openclaw-tools` 的内置 MCP 服务器。
- 暴露选定的内置 OpenClaw 工具。初始服务器暴露的是 `cron`
- 让核心工具暴露保持显式开启,并默认关闭。
### 运行时超时配置
内置的 `acpx` 插件默认将嵌入式运行时轮次超时设为 120 秒。这为 Gemini CLI 等较慢的 harness 预留了足够时间来完成 ACP 启动和初始化。如果你的主机需要不同的运行时限制,请进行覆盖:
```bash
openclaw config set plugins.entries.acpx.config.timeoutSeconds 180
```
更改该值后请重启 Gateway 网关。
### 健康探针智能体配置
内置的 `acpx` 插件在判定嵌入式运行时后端是否就绪时,会探测一个 harness 智能体。默认是 `codex`。如果你的部署使用了不同的默认 ACP 智能体,请将探针智能体设置为同样的 id
```bash
openclaw config set plugins.entries.acpx.config.probeAgent claude
```
更改该值后请重启 Gateway 网关。
## 权限配置
ACP 会话以非交互方式运行——没有 TTY 可用于批准或拒绝文件写入和 shell 执行权限提示。acpx 插件提供了两个配置键来控制权限处理方式:
这些 ACPX harness 权限独立于 OpenClaw exec 审批,也独立于 CLI-backend 的供应商绕过标志,例如 Claude CLI 的 `--permission-mode bypassPermissions`。ACPX 的 `approve-all` 是 ACP 会话在 harness 级别的破玻璃开关。
### `permissionMode`
控制 harness 智能体在不提示的情况下可执行哪些操作。
| 值 | 行为 |
| --------------- | --------------------------------------------------------- |
| `approve-all` | 自动批准所有文件写入和 shell 命令。 |
| `approve-reads` | 仅自动批准读取;写入和 exec 需要提示。 |
| `deny-all` | 拒绝所有权限提示。 |
### `nonInteractivePermissions`
控制当本应显示权限提示、但没有可交互 TTY 可用时ACP 会话始终如此)的行为。
| 值 | 行为 |
| ------ | ----------------------------------------------------------------- |
| `fail` | 使用 `AcpRuntimeError` 中止会话。**(默认)** |
| `deny` | 静默拒绝该权限并继续执行(优雅降级)。 |
### 配置
通过插件配置进行设置:
```bash
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
```
更改这些值后请重启 Gateway 网关。
> **重要:** OpenClaw 当前默认使用 `permissionMode=approve-reads``nonInteractivePermissions=fail`。在非交互式 ACP 会话中,任何会触发权限提示的写入或 exec 操作都可能以 `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` 失败。
>
> 如果你需要限制权限,请将 `nonInteractivePermissions` 设置为 `deny`,这样会话会优雅降级,而不是直接崩溃。
关于 acpx harness 配置Claude Code / Codex / Gemini CLI 别名、plugin-tools 和 OpenClaw-tools MCP 桥接,以及 ACP 权限模式,请参见
[ACP 智能体 — 设置](/zh-CN/tools/acp-agents-setup)。
## 故障排除
| 症状 | 可能原因 | 修复 |
| 症状 | 可能原因 | 修复方法 |
| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ACP runtime backend is not configured` | 后端插件缺失或已禁用。 | 安装并启用后端插件,然后运行 `/acp doctor`。 |
| `ACP is disabled by policy (acp.enabled=false)` | ACP 已被全局禁用。 | 设置 `acp.enabled=true`。 |
| `ACP dispatch is disabled by policy (acp.dispatch.enabled=false)` | 来自普通线程消息的分发已禁用。 | 设置 `acp.dispatch.enabled=true`。 |
| `ACP agent "<id>" is not allowed by policy` | 智能体不在允许名单中。 | 使用允许的 `agentId`,或更新 `acp.allowedAgents`。 |
| `Unable to resolve session target: ...` | 错误的 key/id/label 令牌。 | 运行 `/acp sessions`,复制精确的 key/label 后重试。 |
| `--bind here requires running /acp spawn inside an active ... conversation` | 在没有活动可绑定对话的情况下使用了 `--bind here`。 | 移动到目标聊天/频道后重试,或使用无绑定启动。 |
| `ACP dispatch is disabled by policy (acp.dispatch.enabled=false)` | 来自普通线程消息的分发已禁用。 | 设置 `acp.dispatch.enabled=true`。 |
| `ACP agent "<id>" is not allowed by policy` | 智能体不在允许列表中。 | 使用允许的 `agentId`,或更新 `acp.allowedAgents`。 |
| `Unable to resolve session target: ...` | key/id/label 标记错误。 | 运行 `/acp sessions`,复制准确的 key/label 后重试。 |
| `--bind here requires running /acp spawn inside an active ... conversation` | 在没有活动可绑定对话的情况下使用了 `--bind here`。 | 切换到目标聊天/频道后重试,或使用不绑定的启动。 |
| `Conversation bindings are unavailable for <channel>.` | 适配器缺少当前对话 ACP 绑定能力。 | 在支持时使用 `/acp spawn ... --thread ...`,配置顶层 `bindings[]`,或切换到受支持的渠道。 |
| `--thread here requires running /acp spawn inside an active ... thread` | 在线程上下文之外使用了 `--thread here`。 | 移动到目标线程,或使用 `--thread auto`/`off`。 |
| `Only <user-id> can rebind this channel/conversation/thread.` | 当前活动绑定目标归另一位用户所有。 | 由所有者重新绑定,或使用不同的对话或线程。 |
| `--thread here requires running /acp spawn inside an active ... thread` | 在线程上下文之外使用了 `--thread here`。 | 切换到目标线程,或使用 `--thread auto`/`off`。 |
| `Only <user-id> can rebind this channel/conversation/thread.` | 另一个用户拥有当前活动绑定目标。 | 由拥有者重新绑定,或使用其他对话或线程。 |
| `Thread bindings are unavailable for <channel>.` | 适配器缺少线程绑定能力。 | 使用 `--thread off`,或切换到受支持的适配器/渠道。 |
| `Sandboxed sessions cannot spawn ACP sessions ...` | ACP 运行时位于主侧;请求方会话处于沙箱中。 | 在沙箱会话中使用 `runtime="subagent"`,或从非沙箱会话启动 ACP。 |
| `sessions_spawn sandbox="require" is unsupported for runtime="acp" ...` | 为 ACP 运行时请求了 `sandbox="require"`。 | 如需强制沙箱,请使用 `runtime="subagent"`,或者在非沙箱会话中以 `sandbox="inherit"` 使用 ACP。 |
| 绑定会话缺少 ACP 元数据 | ACP 会话元数据已陈旧/被删除。 | 使用 `/acp spawn` 重新创建,然后重新绑定/聚焦线程。 |
| `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` | `permissionMode` 阻止了非交互式 ACP 会话中的写入/exec。 | 将 `plugins.entries.acpx.config.permissionMode` 设置为 `approve-all` 并重启 Gateway 网关。参见[权限配置](#permission-configuration)。 |
| ACP 会话很早失败且输出很少 | 权限提示被 `permissionMode`/`nonInteractivePermissions` 阻止。 | 检查 Gateway 网关日志中的 `AcpRuntimeError`如需完整权限,请设置 `permissionMode=approve-all`;如需优雅降级,请设置 `nonInteractivePermissions=deny`。 |
| ACP 会话在完成工作后无限期卡住 | harness 进程已结束,但 ACP 会话没有报告完成。 | 使用 `ps aux \| grep acpx` 监控;手动杀掉陈旧进程。 |
| `Sandboxed sessions cannot spawn ACP sessions ...` | ACP 运行时位于宿主侧;请求方会话处于沙箱中。 | 在沙箱会话中使用 `runtime="subagent"`,或从非沙箱会话运行 ACP 启动。 |
| `sessions_spawn sandbox="require" is unsupported for runtime="acp" ...` | 为 ACP 运行时请求了 `sandbox="require"`。 | 对需要强制沙箱隔离的场景使用 `runtime="subagent"`,或从非沙箱会话中配合 `sandbox="inherit"` 使用 ACP。 |
| 绑定会话缺少 ACP 元数据 | ACP 会话元数据已过期/被删除。 | 使用 `/acp spawn` 重新创建,然后重新绑定/聚焦线程。 |
| `AcpRuntimeError: Permission prompt unavailable in non-interactive mode` | `permissionMode` 在非交互式 ACP 会话中阻止写入/执行。 | 将 `plugins.entries.acpx.config.permissionMode` 设置为 `approve-all` 并重启 Gateway 网关。参见 [权限配置](#permission-configuration)。 |
| ACP 会话在很少输出的情况下提前失败 | 权限提示被 `permissionMode`/`nonInteractivePermissions` 阻止。 | 检查 Gateway 网关日志中的 `AcpRuntimeError`。若需完整权限,设置 `permissionMode=approve-all`;若需优雅降级,设置 `nonInteractivePermissions=deny`。 |
| ACP 会话在完成工作后无限期卡住 | harness 进程已结束,但 ACP 会话未报告完成。 | 使用 `ps aux \| grep acpx` 监控;手动终止陈旧进程。 |
## 相关内容

View File

@ -0,0 +1,349 @@
---
read_when:
- 通过本地控制 API 编写脚本或调试智能体浏览器
- 正在查找 `openclaw browser` CLI 参考文档
- 添加带有快照和 refs 的自定义浏览器自动化
summary: OpenClaw 浏览器控制 API、CLI 参考和脚本操作
title: 浏览器控制 API
x-i18n:
generated_at: "2026-04-24T02:39:52Z"
model: gpt-5.4
provider: openai
source_hash: e29ad295085e2c36a6c2ce01366a4186e45a7ecfe1d3c3072353c55794b05b5f
source_path: tools/browser-control.md
workflow: 15
---
有关设置、配置和故障排除,请参阅 [Browser](/zh-CN/tools/browser)。
本页是本地控制 HTTP API、`openclaw browser`
CLI 以及脚本模式快照、refs、等待、调试流程的参考文档。
## 控制 API可选
仅用于本地集成时Gateway 网关会暴露一个小型的 loopback HTTP API
- 状态/启动/停止:`GET /`、`POST /start`、`POST /stop`
- 标签页:`GET /tabs`、`POST /tabs/open`、`POST /tabs/focus`、`DELETE /tabs/:targetId`
- 快照/截图:`GET /snapshot`、`POST /screenshot`
- 操作:`POST /navigate`、`POST /act`
- Hooks`POST /hooks/file-chooser`、`POST /hooks/dialog`
- 下载:`POST /download`、`POST /wait/download`
- 调试:`GET /console`、`POST /pdf`
- 调试:`GET /errors`、`GET /requests`、`POST /trace/start`、`POST /trace/stop`、`POST /highlight`
- 网络:`POST /response/body`
- 状态:`GET /cookies`、`POST /cookies/set`、`POST /cookies/clear`
- 状态:`GET /storage/:kind`、`POST /storage/:kind/set`、`POST /storage/:kind/clear`
- 设置:`POST /set/offline`、`POST /set/headers`、`POST /set/credentials`、`POST /set/geolocation`、`POST /set/media`、`POST /set/timezone`、`POST /set/locale`、`POST /set/device`
所有端点都接受 `?profile=<name>`
如果配置了共享密钥 Gateway 网关认证,浏览器 HTTP 路由也需要认证:
- `Authorization: Bearer <gateway token>`
- `x-openclaw-password: <gateway password>`,或使用该密码的 HTTP Basic auth
注意:
- 这个独立的 loopback 浏览器 API **不会** 使用受信任代理或
Tailscale Serve 身份标头。
- 如果 `gateway.auth.mode``none``trusted-proxy`,这些 loopback 浏览器
路由不会继承这些携带身份信息的模式;请将它们保持为仅 loopback 可用。
### `/act` 错误约定
`POST /act` 对路由级验证和策略失败使用结构化错误响应:
```json
{ "error": "<message>", "code": "ACT_*" }
```
当前的 `code` 值:
- `ACT_KIND_REQUIRED`HTTP 400缺少 `kind` 或无法识别。
- `ACT_INVALID_REQUEST`HTTP 400操作负载标准化或验证失败。
- `ACT_SELECTOR_UNSUPPORTED`HTTP 400在不受支持的操作类型中使用了 `selector`
- `ACT_EVALUATE_DISABLED`HTTP 403配置中禁用了 `evaluate`(或 `wait --fn`)。
- `ACT_TARGET_ID_MISMATCH`HTTP 403顶层或批处理中的 `targetId` 与请求目标冲突。
- `ACT_EXISTING_SESSION_UNSUPPORTED`HTTP 501现有会话 profile 不支持此操作。
其他运行时失败仍可能返回不带
`code` 字段的 `{ "error": "<message>" }`
### Playwright 要求
某些功能navigate/act/AI 快照/role 快照、元素截图、
PDF需要 Playwright。如果未安装 Playwright这些端点会返回
明确的 501 错误。
未安装 Playwright 时仍可使用的功能:
- ARIA 快照
- 当每个标签页的 CDP
WebSocket 可用时,受管 `openclaw` 浏览器的页面截图
- `existing-session` / Chrome MCP profiles 的页面截图
- 来自快照输出的 `existing-session` 基于 ref 的截图(`--ref`
仍然需要 Playwright 的功能:
- `navigate`
- `act`
- AI 快照 / role 快照
- CSS 选择器元素截图(`--element`
- 完整浏览器 PDF 导出
元素截图也会拒绝 `--full-page`;该路由会返回 `fullPage is
not supported for element screenshots`。
如果你看到 `Playwright is not available in this gateway build`,请修复
内置浏览器插件运行时依赖,确保已安装 `playwright-core`
然后重启 Gateway 网关。对于打包安装,请运行 `openclaw doctor --fix`
对于 Docker还需要安装下面所示的 Chromium 浏览器二进制文件。
#### Docker Playwright 安装
如果你的 Gateway 网关运行在 Docker 中,请避免使用 `npx playwright`npm 覆盖冲突)。
请改用内置 CLI
```bash
docker compose run --rm openclaw-cli \
node /app/node_modules/playwright-core/cli.js install chromium
```
要持久化浏览器下载,请设置 `PLAYWRIGHT_BROWSERS_PATH`(例如
`/home/node/.cache/ms-playwright`),并确保通过
`OPENCLAW_HOME_VOLUME` 或 bind mount 持久化 `/home/node`。请参阅 [Docker](/zh-CN/install/docker)。
## 工作原理(内部)
一个小型 loopback 控制服务器接收 HTTP 请求,并通过 CDP 连接到基于 Chromium 的浏览器。高级操作(点击/输入/快照/PDF通过 CDP 之上的 Playwright 执行;当缺少 Playwright 时,只有不依赖 Playwright 的操作可用。智能体看到的是一个稳定的接口,而底层的本地/远程浏览器和 profiles 可以自由切换。
## CLI 快速参考
所有命令都接受 `--browser-profile <name>` 以定位到特定 profile并接受 `--json` 以输出机器可读格式。
<AccordionGroup>
<Accordion title="基础:状态、标签页、打开/聚焦/关闭">
```bash
openclaw browser status
openclaw browser start
openclaw browser stop # 也会清除仅附加/远程 CDP 上的仿真
openclaw browser tabs
openclaw browser tab # 当前标签页的快捷方式
openclaw browser tab new
openclaw browser tab select 2
openclaw browser tab close 2
openclaw browser open https://example.com
openclaw browser focus abcd1234
openclaw browser close abcd1234
```
</Accordion>
<Accordion title="检查:截图、快照、控制台、错误、请求">
```bash
openclaw browser screenshot
openclaw browser screenshot --full-page
openclaw browser screenshot --ref 12 # 或 --ref e12
openclaw browser snapshot
openclaw browser snapshot --format aria --limit 200
openclaw browser snapshot --interactive --compact --depth 6
openclaw browser snapshot --efficient
openclaw browser snapshot --labels
openclaw browser snapshot --selector "#main" --interactive
openclaw browser snapshot --frame "iframe#main" --interactive
openclaw browser console --level error
openclaw browser errors --clear
openclaw browser requests --filter api --clear
openclaw browser pdf
openclaw browser responsebody "**/api" --max-chars 5000
```
</Accordion>
<Accordion title="操作navigate、click、type、drag、wait、evaluate">
```bash
openclaw browser navigate https://example.com
openclaw browser resize 1280 720
openclaw browser click 12 --double # 或对 role refs 使用 e12
openclaw browser type 23 "hello" --submit
openclaw browser press Enter
openclaw browser hover 44
openclaw browser scrollintoview e12
openclaw browser drag 10 11
openclaw browser select 9 OptionA OptionB
openclaw browser download e12 report.pdf
openclaw browser waitfordownload report.pdf
openclaw browser upload /tmp/openclaw/uploads/file.pdf
openclaw browser fill --fields '[{"ref":"1","type":"text","value":"Ada"}]'
openclaw browser dialog --accept
openclaw browser wait --text "Done"
openclaw browser wait "#main" --url "**/dash" --load networkidle --fn "window.ready===true"
openclaw browser evaluate --fn '(el) => el.textContent' --ref 7
openclaw browser highlight e12
openclaw browser trace start
openclaw browser trace stop
```
</Accordion>
<Accordion title="状态cookies、storage、offline、headers、geo、device">
```bash
openclaw browser cookies
openclaw browser cookies set session abc123 --url "https://example.com"
openclaw browser cookies clear
openclaw browser storage local get
openclaw browser storage local set theme dark
openclaw browser storage session clear
openclaw browser set offline on
openclaw browser set headers --headers-json '{"X-Debug":"1"}'
openclaw browser set credentials user pass # 使用 --clear 移除
openclaw browser set geo 37.7749 -122.4194 --origin "https://example.com"
openclaw browser set media dark
openclaw browser set timezone America/New_York
openclaw browser set locale en-US
openclaw browser set device "iPhone 14"
```
</Accordion>
</AccordionGroup>
注意:
- `upload``dialog` 是**预置**调用;请在触发文件选择器/对话框的点击或按键之前运行它们。
- `click`/`type`/等操作需要来自 `snapshot``ref`(数字 `12` 或 role ref `e12`)。操作有意不支持 CSS 选择器。
- 下载、trace 和上传路径被限制在 OpenClaw 临时根目录下:`/tmp/openclaw{,/downloads,/uploads}`(回退为:`${os.tmpdir()}/openclaw/...`)。
- `upload` 也可以通过 `--input-ref``--element` 直接设置文件输入框。
快照标志一览:
- `--format ai`(安装了 Playwright 时为默认):带数字 refs 的 AI 快照(`aria-ref="<n>"`)。
- `--format aria`:无障碍树,不含 refs仅用于检查。
- `--efficient`(或 `--mode efficient`):紧凑型 role 快照预设。设置 `browser.snapshotDefaults.mode: "efficient"` 可将其设为默认值(参见 [Gateway 配置](/zh-CN/gateway/configuration-reference#browser))。
- `--interactive`、`--compact`、`--depth`、`--selector` 会强制使用 role 快照,并生成 `ref=e12` refs。`--frame "<iframe>"` 会将 role 快照限定在某个 iframe 中。
- `--labels` 会添加一张仅视口的截图,并叠加 ref 标签(输出 `MEDIA:<path>`)。
## 快照和 refs
OpenClaw 支持两种“快照”样式:
- **AI 快照(数字 refs**`openclaw browser snapshot`(默认;`--format ai`
- 输出:包含数字 refs 的文本快照。
- 操作:`openclaw browser click 12`、`openclaw browser type 23 "hello"`。
- 在内部ref 通过 Playwright 的 `aria-ref` 解析。
- **Role 快照(如 `e12` 的 role refs**`openclaw browser snapshot --interactive`(或 `--compact`、`--depth`、`--selector`、`--frame`
- 输出:基于 role 的列表/树,带有 `[ref=e12]`(以及可选的 `[nth=1]`)。
- 操作:`openclaw browser click e12`、`openclaw browser highlight e12`。
- 在内部ref 通过 `getByRole(...)` 解析(重复项会额外使用 `nth()`)。
- 添加 `--labels` 可附带一张叠加 `e12` 标签的视口截图。
Ref 行为:
- Refs **不会在导航之间保持稳定**;如果操作失败,请重新运行 `snapshot` 并使用新的 ref。
- 如果 role 快照是在 `--frame` 下获取的role refs 会限定在该 iframe 中,直到下一次 role 快照。
## Wait 增强功能
你可以等待的不只是时间或文本:
- 等待 URL支持 Playwright 的 glob
- `openclaw browser wait --url "**/dash"`
- 等待加载状态:
- `openclaw browser wait --load networkidle`
- 等待 JS 谓词:
- `openclaw browser wait --fn "window.ready===true"`
- 等待选择器变为可见:
- `openclaw browser wait "#main"`
这些条件可以组合使用:
```bash
openclaw browser wait "#main" \
--url "**/dash" \
--load networkidle \
--fn "window.ready===true" \
--timeout-ms 15000
```
## 调试工作流
当某个操作失败时(例如“不可见”“严格模式违规”“被遮挡”):
1. `openclaw browser snapshot --interactive`
2. 使用 `click <ref>` / `type <ref>`(在交互模式下优先使用 role refs
3. 如果仍然失败:运行 `openclaw browser highlight <ref>`,查看 Playwright 实际定位的目标
4. 如果页面行为异常:
- `openclaw browser errors --clear`
- `openclaw browser requests --filter api --clear`
5. 如需深入调试:记录 trace
- `openclaw browser trace start`
- 复现问题
- `openclaw browser trace stop`(输出 `TRACE:<path>`
## JSON 输出
`--json` 用于脚本编写和结构化工具。
示例:
```bash
openclaw browser status --json
openclaw browser snapshot --interactive --json
openclaw browser requests --filter api --json
openclaw browser cookies --json
```
JSON 格式的 role 快照包含 `refs`,以及一个小型 `stats`lines/chars/refs/interactive便于工具推断负载大小和密度。
## 状态和环境调节项
这些选项对于“让网站表现得像 X 一样”的工作流非常有用:
- Cookies`cookies`、`cookies set`、`cookies clear`
- Storage`storage local|session get|set|clear`
- Offline`set offline on|off`
- Headers`set headers --headers-json '{"X-Debug":"1"}'`(旧版 `set headers --json '{"X-Debug":"1"}'` 仍然受支持)
- HTTP Basic auth`set credentials user pass`(或 `--clear`
- 地理位置:`set geo <lat> <lon> --origin "https://example.com"`(或 `--clear`
- 媒体:`set media dark|light|no-preference|none`
- 时区 / 区域设置:`set timezone ...`、`set locale ...`
- 设备 / 视口:
- `set device "iPhone 14"`Playwright 设备预设)
- `set viewport 1280 720`
## 安全与隐私
- openclaw 浏览器 profile 可能包含已登录的会话;请将其视为敏感信息。
- `browser act kind=evaluate` / `openclaw browser evaluate``wait --fn`
会在页面上下文中执行任意 JavaScript。提示注入可能会引导
这一行为。如果你不需要它,请使用 `browser.evaluateEnabled=false` 将其禁用。
- 关于登录和反机器人说明X/Twitter 等),请参阅 [Browser login + X/Twitter posting](/zh-CN/tools/browser-login)。
- 请将 Gateway 网关/节点主机保持为私有(仅 loopback 或仅 tailnet
- 远程 CDP 端点权限很高;请通过隧道并加以保护。
严格模式示例(默认阻止私有/内部目标):
```json5
{
browser: {
ssrfPolicy: {
dangerouslyAllowPrivateNetwork: false,
hostnameAllowlist: ["*.example.com", "example.com"],
allowedHostnames: ["localhost"], // 可选精确允许
},
},
}
```
## 相关内容
- [Browser](/zh-CN/tools/browser) — 概览、配置、profiles、安全
- [Browser login](/zh-CN/tools/browser-login) — 登录网站
- [Browser Linux troubleshooting](/zh-CN/tools/browser-linux-troubleshooting)
- [Browser WSL2 troubleshooting](/zh-CN/tools/browser-wsl2-windows-remote-cdp-troubleshooting)

View File

@ -1,41 +1,39 @@
---
read_when:
- 添加由智能体控制的浏览器自动化
- |-
调试为什么 openclaw 会干扰你自己的 Chrome♀♀♀♀♀♀analysis to=functions.read code 】!【json
{"path":"/home/runner/work/docs/docs/source/scripts/docs-i18n/","offset":1,"limit":1}
- 调试为什么 openclaw 会干扰你自己的 Chrome
- 在 macOS 应用中实现浏览器设置 + 生命周期
summary: 集成式浏览器控制服务 + 动作命令
summary: 集成浏览器控制服务 + 操作命令
title: 浏览器(由 OpenClaw 管理)
x-i18n:
generated_at: "2026-04-23T21:07:01Z"
generated_at: "2026-04-24T02:39:44Z"
model: gpt-5.4
provider: openai
source_hash: 3232ec0627004aabd8fe7c73efa237949e4148a9648de7a12951c2af54608d4b
source_hash: 2fb0fc0b6235fa8a0324b754e247e015d5ca19d114d324d565ed4a19f9313f7e
source_path: tools/browser.md
workflow: 15
---
OpenClaw 可以运行一个**专用的 Chrome/Brave/Edge/Chromium profile**,由智能体控制。
它与您的个人浏览器隔离,并通过 Gateway 网关中的一个小型本地
控制服务进行管理(仅限 loopback
OpenClaw 可以运行一个**专用的 Chrome/Brave/Edge/Chromium 配置文件**,由智能体控制。
它与你的个人浏览器隔离,并通过 Gateway 网关内部一个小型本地控制服务进行管理
(仅限 loopback
新手视角:
初学者视角:
- 可以把它看作一个**独立的、仅供智能体使用的浏览器**。
- `openclaw` profile **不会**触碰你的个人浏览器 profile
- `openclaw` 配置文件**不会**触碰你的个人浏览器配置文件
- 智能体可以在一个安全通道中**打开标签页、读取页面、点击和输入**。
- 内置的 `user` profile 会通过 Chrome MCP 连接到你真实的、已登录的 Chrome 会话。
- 内置的 `user` 配置文件会通过 Chrome MCP 连接到你真实的、已登录的 Chrome 会话。
## 你获得什么
## 你获得什么
- 一个名为 **openclaw** 的独立浏览器 profile默认使用橙色强调色)。
- 一个名为 **openclaw** 的独立浏览器配置文件(默认橙色强调色)。
- 可预测的标签页控制(列出/打开/聚焦/关闭)。
- 智能体动作(点击/输入/拖拽/选择、快照、截图、PDF。
- 可选的多 profile 支持(`openclaw`、`work`、`remote`,等等)。
- 智能体操作(点击/输入/拖动/选择、快照、截图、PDF。
- 可选的多配置文件支持(`openclaw`、`work`、`remote`,等等)。
这个浏览器**不是**你的日常主浏览器。它是一个安全、隔离的表面,
用于智能体自动化和验证。
这个浏览器**不是**你的日常主力浏览器。它是一个安全、隔离的界面,用于
智能体自动化与验证。
## 快速开始
@ -46,15 +44,14 @@ openclaw browser --browser-profile openclaw open https://example.com
openclaw browser --browser-profile openclaw snapshot
```
如果你看到 “Browser disabled”请在配置中启用它见下文然后重启
如果你看到“Browser disabled”请在配置中启用它见下文然后重启
Gateway 网关。
如果 `openclaw browser` 整体都不存在,或者智能体提示浏览器工具
不可用,请直接跳转到 [缺少 browser 命令或工具](/zh-CN/tools/browser#missing-browser-command-or-tool)。
如果根本没有 `openclaw browser`,或者智能体提示浏览器工具不可用,请跳转到 [缺少浏览器命令或工具](/zh-CN/tools/browser#missing-browser-command-or-tool)。
## 插件控制
默认的 `browser` 工具是一个内置插件。若要用另一个注册了相同 `browser` 工具名的插件来替换它,请先禁用该插件
默认的 `browser` 工具是一个内置插件。禁用它可以用另一个注册相同 `browser` 工具名称的插件来替换
```json5
{
@ -68,13 +65,13 @@ Gateway 网关。
}
```
默认情况下需要同时满足 `plugins.entries.browser.enabled` **以及** `browser.enabled=true`。仅禁用插件会整体移除 `openclaw browser` CLI、`browser.request` gateway 方法、智能体工具和控制服务;你的 `browser.*` 配置会原样保留,以供替代插件使用。
默认行为需要同时设置 `plugins.entries.browser.enabled` **和** `browser.enabled=true`。仅禁用插件会整体移除 `openclaw browser` CLI、`browser.request` Gateway 网关方法、智能体工具以及控制服务;你的 `browser.*` 配置会保持不变,以供替代方案使用。
浏览器配置变更需要重启 Gateway 网关,这样插件才能重新注册其服务。
浏览器配置变更需要重启 Gateway 网关,以便插件重新注册其服务。
## 缺少 browser 命令或工具
## 缺少浏览器命令或工具
如果升级后 `openclaw browser` 变成未知命令,`browser.request` 缺失,或智能体报告浏览器工具不可用,通常原因是 `plugins.allow` 列表中未包含 `browser`。请将它加上
如果升级后 `openclaw browser` 未知、缺少 `browser.request`,或者智能体报告浏览器工具不可用,通常原因是 `plugins.allow` 列表中遗漏了 `browser`。请添加它
```json5
{
@ -84,19 +81,18 @@ Gateway 网关。
}
```
`browser.enabled=true`、`plugins.entries.browser.enabled=true` 和 `tools.alsoAllow: ["browser"]` 都不能替代 allowlist 成员资格——allowlist 负责门控插件加载,而工具策略只会在加载之后才生效。完全移除 `plugins.allow` 也会恢复默认行为。
`browser.enabled=true`、`plugins.entries.browser.enabled=true` 和 `tools.alsoAllow: ["browser"]` 都不能替代允许列表成员资格——允许列表控制插件加载,而工具策略只有在加载之后才会运行。完全移除 `plugins.allow` 也会恢复默认行为。
## Profiles`openclaw` vs `user`
## 配置文件:`openclaw` 与 `user`
- `openclaw`:受管理、隔离的浏览器(不需要扩展)。
- `user`:内置的 Chrome MCP 附加 profile用于连接你**真实的已登录 Chrome**
会话。
- `openclaw`:受管理的隔离浏览器(无需扩展)。
- `user`:内置的 Chrome MCP 连接配置文件,用于连接你**真实的已登录 Chrome** 会话。
对于智能体浏览器工具调用:
- 默认:使用隔离的 `openclaw` 浏览器。
- 当已登录会话很重要,并且用户本人在电脑前可以点击/批准任何附加提示时,优先使用 `profile="user"`
- 当你想指定某种浏览器模式时,`profile` 是显式覆盖项。
- 当现有登录会话很重要,且用户就在电脑前可以点击/批准任何连接提示时,优先使用 `profile="user"`
- 当你想指定浏览器模式时,`profile` 是显式覆盖项。
如果你希望默认使用受管理模式,请设置 `browser.defaultProfile: "openclaw"`
@ -107,16 +103,16 @@ Gateway 网关。
```json5
{
browser: {
enabled: true, // default: true
enabled: true, // 默认:true
ssrfPolicy: {
// dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access
// allowPrivateNetwork: true, // legacy alias
// dangerouslyAllowPrivateNetwork: true, // 仅在可信的私有网络访问场景下启用
// allowPrivateNetwork: true, // 旧别名
// hostnameAllowlist: ["*.example.com", "example.com"],
// allowedHostnames: ["localhost"],
},
// cdpUrl: "http://127.0.0.1:18792", // legacy single-profile override
remoteCdpTimeoutMs: 1500, // remote CDP HTTP timeout (ms)
remoteCdpHandshakeTimeoutMs: 3000, // remote CDP WebSocket handshake timeout (ms)
// cdpUrl: "http://127.0.0.1:18792", // 旧的单配置文件覆盖项
remoteCdpTimeoutMs: 1500, // 远程 CDP HTTP 超时(毫秒)
remoteCdpHandshakeTimeoutMs: 3000, // 远程 CDP WebSocket 握手超时(毫秒)
defaultProfile: "openclaw",
color: "#FF4500",
headless: false,
@ -147,29 +143,29 @@ Gateway 网关。
<Accordion title="端口与可达性">
- 控制服务会绑定到 loopback其端口由 `gateway.port` 派生(默认 `18791` = gateway + 2。覆盖 `gateway.port``OPENCLAW_GATEWAY_PORT`让同一族派生端口一起偏移
- 本地 `openclaw` profiles 会自动分配 `cdpPort`/`cdpUrl`;仅在远程 CDP 场景下才需要手动设置这些值。未设置时,`cdpUrl` 默认指向受管理的本地 CDP 端口。
- 控制服务绑定到 loopback端口基于 `gateway.port` 派生(默认 `18791` = gateway + 2。覆盖 `gateway.port``OPENCLAW_GATEWAY_PORT`同步移动同一组派生端口
- 本地 `openclaw` 配置文件会自动分配 `cdpPort`/`cdpUrl`;仅在远程 CDP 场景下才需要设置它们。未设置时,`cdpUrl` 默认指向受管理的本地 CDP 端口。
- `remoteCdpTimeoutMs` 适用于远程(非 loopbackCDP HTTP 可达性检查;`remoteCdpHandshakeTimeoutMs` 适用于远程 CDP WebSocket 握手。
</Accordion>
<Accordion title="SSRF 策略">
- 浏览器导航与 open-tab 会在导航前执行 SSRF 防护,并在导航后对最终 `http(s)` URL 做尽力复检
- 在严格 SSRF 模式下,远程 CDP 端点发现 `/json/version` 探测(`cdpUrl`)也会被检查。
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` 默认关闭;仅当你明确信任私有网络浏览器访问时才启用。
- `browser.ssrfPolicy.allowPrivateNetwork` 作为旧别名受支持。
- 浏览器导航与打开标签页会在导航前进行 SSRF 防护,并在最终 `http(s)` URL 上尽力再次检查
- 在严格 SSRF 模式下,远程 CDP 端点发现 `/json/version` 探测(`cdpUrl`)也会被检查。
- `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` 默认关闭;仅当你明确信任私有网络浏览器访问时才启用。
- `browser.ssrfPolicy.allowPrivateNetwork` 作为旧别名仍然受支持。
</Accordion>
<Accordion title="Profile 行为">
<Accordion title="配置文件行为">
- `attachOnly: true` 表示绝不启动本地浏览器;只有在浏览器已运行时才进行附加
- `color`(顶层和按 profile会给浏览器 UI 着色,以便你看出当前激活的是哪个 profile
- 默认 profile 是 `openclaw`(受管理的独立实例)。使用 `defaultProfile: "user"` 可切换为已登录用户浏览器。
- 自动检测顺序:若系统默认浏览器是基于 Chromium则优先使用它否则按 Chrome → Brave → Edge → Chromium → Chrome Canary 的顺序检测
- `driver: "existing-session"` 使用 Chrome DevTools MCP而不是原始 CDP。对该驱动不要设置 `cdpUrl`
- 当某个 existing-session profile 应附加到非默认 Chromium 用户 profileBrave、Edge 等)时,请设置 `browser.profiles.<name>.userDataDir`
- `attachOnly: true` 表示绝不启动本地浏览器;仅在浏览器已经运行时连接
- `color`(顶层和各配置文件级别)会为浏览器 UI 着色,方便你查看当前活动的是哪个配置文件
- 默认配置文件是 `openclaw`(受管理的独立模式)。使用 `defaultProfile: "user"` 可切换为已登录用户浏览器。
- 自动检测顺序:如果系统默认浏览器是基于 Chromium则优先使用它否则依次为 Chrome → Brave → Edge → Chromium → Chrome Canary。
- `driver: "existing-session"` 使用 Chrome DevTools MCP而不是原始 CDP。不要为该驱动设置 `cdpUrl`
- 当某个 existing-session 配置文件需要连接到非默认的 Chromium 用户配置文件Brave、Edge 等)时,请设置 `browser.profiles.<name>.userDataDir`
</Accordion>
@ -177,15 +173,15 @@ Gateway 网关。
## 使用 Brave或其他基于 Chromium 的浏览器)
如果你的**系统默认**浏览器是基于 Chromium 的Chrome/Brave/Edge 等),
OpenClaw 会自动使用它。你也可以通过设置 `browser.executablePath` 来覆盖
如果你的**系统默认**浏览器是基于 Chromium 的Chrome/Brave/Edge 等),
OpenClaw 会自动使用它。设置 `browser.executablePath` 可覆盖
自动检测:
```bash
openclaw config set browser.executablePath "/usr/bin/google-chrome"
```
或者在配置中按平台设置:
或者按平台在配置中设置:
<Tabs>
<Tab title="macOS">
@ -219,50 +215,47 @@ openclaw config set browser.executablePath "/usr/bin/google-chrome"
## 本地控制 vs 远程控制
- **本地控制(默认):** Gateway 网关启动 loopback 控制服务,并可启动本地浏览器。
- **远程控制node host** 在有浏览器的机器上运行 node hostGateway 网关会将浏览器动作代理到它。
- **远程 CDP** 设置 `browser.profiles.<name>.cdpUrl`(或 `browser.cdpUrl`
以附加到远程的基于 Chromium 的浏览器。在这种情况下OpenClaw 不会启动本地浏览器。
- **本地控制(默认):** Gateway 网关会启动 loopback 控制服务,并可启动本地浏览器。
- **远程控制(节点主机):** 在拥有浏览器的机器上运行一个节点主机Gateway 网关会将浏览器操作代理过去。
- **远程 CDP** 设置 `browser.profiles.<name>.cdpUrl`(或 `browser.cdpUrl`)以连接到远程的基于 Chromium 的浏览器。在这种情况下OpenClaw 不会启动本地浏览器。
不同 profile 模式的停止行为不同:
停止行为会因配置文件模式而不同:
- 本地受管理 profiles`openclaw browser stop` 会停止由
- 本地受管理配置文件:`openclaw browser stop` 会停止
OpenClaw 启动的浏览器进程
- attach-only 和远程 CDP profiles`openclaw browser stop` 会关闭当前活动的
控制会话,并释放 Playwright/CDP 仿真覆盖viewport、
color scheme、locale、timezone、offline mode 以及类似状态),即使
该浏览器进程并不是由 OpenClaw 启动的
- 仅连接和远程 CDP 配置文件`openclaw browser stop` 会关闭当前活动的
控制会话,并释放 Playwright/CDP 仿真覆盖项(视口、
配色方案、区域设置、时区、离线模式及类似状态),即使
OpenClaw 并未启动任何浏览器进程
远程 CDP URL 可以包含认证信息:
- Query token(例如 `https://provider.example?token=<token>`
- HTTP Basic auth(例如 `https://user:pass@provider.example`
- 查询参数令牌(例如 `https://provider.example?token=<token>`
- HTTP Basic 认证(例如 `https://user:pass@provider.example`
OpenClaw 在调用 `/json/*` 端点以及连接
CDP WebSocket 时都会保留这些认证信息。对于 token建议优先使用环境变量或 secrets 管理器,
而不是将其提交到配置文件中。
OpenClaw 在调用 `/json/*` 端点以及连接
CDP WebSocket 时会保留这些认证信息。对于令牌,建议优先使用环境变量或秘密管理器,而不是将其提交到配置文件中。
## 节点浏览器代理(零配置默认)
如果你在拥有浏览器的机器上运行了**node host**OpenClaw 可以
自动将浏览器工具调用路由到该节点,而无需额外的浏览器配置
这是远程 gateway 的默认路径。
如果你在拥有浏览器的机器上运行了一个**节点主机**OpenClaw 可以
在无需任何额外浏览器配置的情况下,自动将浏览器工具调用路由到该节点。
这是远程 Gateway 网关的默认路径。
说明:
- node host 会通过一个**代理命令**暴露其本地浏览器控制服务器。
- Profiles 来自该节点自身的 `browser.profiles` 配置(与本地相同)。
- `nodeHost.browserProxy.allowProfiles` 是可选的。保持为空即可获得旧版/默认行为:所有已配置的 profiles 都可以通过代理访问,包括 profile 创建/删除路由。
- 如果你设置了 `nodeHost.browserProxy.allowProfiles`OpenClaw 会将其视为最小权限边界:只有加入 allowlist 的 profiles 才能被访问,且持久化 profile 创建/删除路由会在代理表面被阻止。
- 如果你不想使用它,可以禁用
- 节点主机会通过一个**代理命令**暴露其本地浏览器控制服务器。
- 配置文件来自节点自身的 `browser.profiles` 配置(与本地相同)。
- `nodeHost.browserProxy.allowProfiles` 是可选项。保持为空即可使用旧版/默认行为:所有已配置的配置文件都可通过代理访问,包括配置文件创建/删除路由。
- 如果你设置了 `nodeHost.browserProxy.allowProfiles`OpenClaw 会将其视为最小权限边界:只有允许列表中的配置文件可以被访问,而且持久化配置文件创建/删除路由会在代理层被阻止。
- 如果你不想启用它,可以关闭
- 在节点上:`nodeHost.browserProxy.enabled=false`
- 在 gateway 上:`gateway.nodes.browser.mode="off"`
- 在 Gateway 网关上:`gateway.nodes.browser.mode="off"`
## Browserless托管远程 CDP
[Browserless](https://browserless.io) 是一项托管 Chromium 服务,通过 HTTPS 和 WebSocket 暴露
CDP 连接 URL。OpenClaw 两种形式都支持,但对于远程浏览器 profile
最简单的方案是直接使用 Browserless 连接文档中给出的 WebSocket URL。
[Browserless](https://browserless.io) 是一项托管的 Chromium 服务,通过 HTTPS 和 WebSocket 暴露
CDP 连接 URL。OpenClaw 两种形式都支持,但对于远程浏览器配置文件,最简单的选择通常是 Browserless 连接文档中提供的直接 WebSocket URL。
示例:
@ -285,38 +278,38 @@ CDP 连接 URL。OpenClaw 两种形式都支持,但对于远程浏览器 profi
说明:
- `<BROWSERLESS_API_KEY>` 替换为你的真实 Browserless token
- 将 `<BROWSERLESS_API_KEY>` 替换为你真实的 Browserless 令牌
- 选择与你的 Browserless 账户匹配的区域端点(参见其文档)。
- 如果 Browserless 给你的是 HTTPS 基础 URL你可以将其转换为
`wss://` 用于直接 CDP 连接,或者保留 HTTPS URL让 OpenClaw
通过 `/json/version` 自动发现
- 如果 Browserless 提供给你的是 HTTPS 基础 URL可以将其转换为
`wss://` 以建立直接 CDP 连接,也可以保留 HTTPS URL让 OpenClaw
去发现 `/json/version`
## 直接 WebSocket CDP providers
## 直接 WebSocket CDP 提供商
些托管浏览器服务暴露的是**直接 WebSocket**端点,而不是
标准的基于 HTTP 的 CDP 发现(`/json/version`。OpenClaw 接受三种
CDP URL 形,并会自动选择正确的连接策略:
些托管浏览器服务暴露的是**直接 WebSocket** 端点,而不是
标准的基于 HTTP 的 CDP 发现(`/json/version`。OpenClaw 接受三种
CDP URL 形,并会自动选择正确的连接策略:
- **HTTP(S) 发现** `http://host[:port]``https://host[:port]`
OpenClaw 会调用 `/json/version` 来发现 WebSocket debugger URL然后
进行连接。没有 WebSocket 回退。
- **直接 WebSocket 端点** `ws://host[:port]/devtools/<kind>/<id>`
`wss://...`其中路径为 `/devtools/browser|page|worker|shared_worker|service_worker/<id>`
OpenClaw 会直接通过 WebSocket 握手连接,并完全跳过
- **HTTP(S) 发现**`http://host[:port]``https://host[:port]`
OpenClaw 会调用 `/json/version` 来发现 WebSocket 调试器 URL然后
连接。没有 WebSocket 回退。
- **直接 WebSocket 端点**`ws://host[:port]/devtools/<kind>/<id>`
`wss://...`,路径为 `/devtools/browser|page|worker|shared_worker|service_worker/<id>`
OpenClaw 会直接通过 WebSocket 握手连接,并完全跳过
`/json/version`
- **裸 WebSocket 根地址** —`ws://host[:port]``wss://host[:port]`,没有
`/devtools/...` 路径(例如 [Browserless](https://browserless.io)、
[Browserbase](https://www.browserbase.com)。OpenClaw 会先尝试 HTTP
`/json/version` 发现(并将 scheme 标准化为 `http`/`https`
如果发现结果返回了 `webSocketDebuggerUrl`,就使用它;否则 OpenClaw
会回退为对裸根地址直接执行 WebSocket 握手。这让一个指向本地 Chrome 的
`ws://` 也能工作,因为 Chrome 只会在来自
`/json/version` 的特定按目标路径上接受 WebSocket 升级。
- **裸 WebSocket 根路径** `ws://host[:port]``wss://host[:port]`没有
`/devtools/...` 路径(例如 [Browserless](https://browserless.io)、
[Browserbase](https://www.browserbase.com)。OpenClaw 会先尝试 HTTP
`/json/version` 发现(将协议规范化为 `http`/`https`
如果发现返回 `webSocketDebuggerUrl`,则使用它,否则 OpenClaw
会回退为在裸根路径上直接进行 WebSocket 握手。这样一来,指向本地 Chrome 的
`ws://` 仍然可以连接,因为 Chrome 只接受针对
`/json/version` 返回的特定目标路径的 WebSocket 升级。
### Browserbase
[Browserbase](https://www.browserbase.com) 是一个云平台,用于运行
无头浏览器,内置 CAPTCHA 求解、隐身模式和住宅代理。
[Browserbase](https://www.browserbase.com) 是一个云平台,用于运行
无头浏览器,并内置 CAPTCHA 求解、隐身模式以及住宅代理。
```json5
{
@ -337,76 +330,75 @@ CDP URL 形态,并会自动选择正确的连接策略:
说明:
- 前往 [注册](https://www.browserbase.com/sign-up)并从 [Overview dashboard](https://www.browserbase.com/overview) 复制你的 **API Key**
- `<BROWSERBASE_API_KEY>` 替换为你真实的 Browserbase API key。
- Browserbase 会在 WebSocket 连接时自动创建浏览器会话,因此
- [注册](https://www.browserbase.com/sign-up)然后从 [Overview 控制台](https://www.browserbase.com/overview) 复制你的**API Key**。
- 将 `<BROWSERBASE_API_KEY>` 替换为你真实的 Browserbase API key。
- Browserbase 会在 WebSocket 连接时自动创建浏览器会话,因此
不需要手动创建会话。
- 免费套餐每月允许一个并发会话和一个浏览器小时。
付费套餐限制请参见 [定价](https://www.browserbase.com/pricing)。
- 完整 API
参考、SDK 指南和集成示例请参见 [Browserbase 文档](https://docs.browserbase.com)。
- 免费套餐每月允许一个并发会话和一个浏览器小时。
付费方案限制请参见 [pricing](https://www.browserbase.com/pricing)。
- 完整 API 参考、SDK 指南和集成示例,请参见 [Browserbase docs](https://docs.browserbase.com)。
## 安全性
关键概念:
- 浏览器控制仅限 loopback访问通过 Gateway 网关的认证或节点配对进行。
- 独立的 loopback 浏览器 HTTP API 仅使用**共享 secret 认证**
gateway token bearer 认证、`x-openclaw-password`,或带有
已配置 gateway 密码的 HTTP Basic auth。
- Tailscale Serve 身份 headers 和 `gateway.auth.mode: "trusted-proxy"`
- 独立的 loopback 浏览器 HTTP API **仅使用共享密钥认证**
Gateway 网关 token Bearer 认证、`x-openclaw-password`,或使用已配置 Gateway 网关密码的 HTTP Basic 认证。
- Tailscale Serve 身份头和 `gateway.auth.mode: "trusted-proxy"`
**不能**为这个独立的 loopback 浏览器 API 提供认证。
- 如果启用了浏览器控制但未配置共享 secret 认证OpenClaw
会在启动时自动生成 `gateway.auth.token`并将其持久化到配置中。
- `gateway.auth.mode` 已经是
`password`、`none` 或 `trusted-proxy`OpenClaw **不会**自动生成该 token。
- 请将 Gateway 网关和任何节点宿主机保持在私有网络中(如 Tailscale避免公开暴露。
- 请将远程 CDP URL/token 视为 secrets优先使用环境变量或 secrets 管理器。
- 如果启用了浏览器控制且未配置共享密钥认证OpenClaw
会在启动时自动生成 `gateway.auth.token` 并将其持久化到配置中。
- 如果 `gateway.auth.mode` 已经是
`password`、`none` 或 `trusted-proxy`OpenClaw **不会**自动生成该 token。
- 请将 Gateway 网关和任何节点主机保持在私有网络上(Tailscale避免公开暴露。
- 将远程 CDP URL/token 视为敏感信息;优先使用环境变量或秘密管理器。
远程 CDP 提示:
- 尽可能优先使用加密端点HTTPS 或 WSS和短期 token。
- 避免将长期有效 token 直接嵌入配置文件
- 避免将长期 token 直接嵌入配置文件。
## Profiles(多浏览器)
## 配置文件(多浏览器)
OpenClaw 支持多个命名 profile路由配置。Profiles 可以是:
OpenClaw 支持多个命名配置文件(路由配置)。配置文件可以是:
- **由 OpenClaw 管理**:一个专用的、基于 Chromium 的浏览器实例,拥有自己的用户数据目录 + CDP 端口
- **远程**:一个显式的 CDP URL运行在其他位置的基于 Chromium 的浏览器)
- **现有会话**:通过 Chrome DevTools MCP 自动连接到你现有的 Chrome profile
- **openclaw-managed**:一个专用的基于 Chromium 的浏览器实例,拥有自己的用户数据目录 + CDP 端口
- **remote**显式的 CDP URL运行在其他位置的基于 Chromium 的浏览器)
- **existing session**:通过 Chrome DevTools MCP 自动连接你现有的 Chrome 配置文件
默认值:
- 如果缺失,会自动创建 `openclaw` profile
- `user` profile 是内置的,用于 Chrome MCP existing-session 附加
- 除 `user`existing-session profiles 都是显式启用的;请使用 `--driver existing-session` 创建它们
- 如果缺`openclaw` 配置文件,会自动创建
- `user` 配置文件是内置的,用于 Chrome MCP existing-session 连接
- 除 `user`existing-session 配置文件需要显式启用;请使用 `--driver existing-session` 创建。
- 本地 CDP 端口默认从 **1880018899** 分配。
- 删除一个 profile 时,会将其本地数据目录移到废纸篓。
- 删除配置文件时,会将其本地数据目录移到废纸篓。
所有控制端点都接受 `?profile=<name>`CLI 使用 `--browser-profile`
## 通过 Chrome DevTools MCP 使用 existing-session
OpenClaw 还可以通过官方 Chrome DevTools MCP 服务器,附加到正在运行的基于 Chromium 的浏览器 profile。这样可以复用该浏览器 profile 中已经打开的标签页和登录状态。
OpenClaw 也可以通过官方 Chrome DevTools MCP 服务器连接到一个正在运行的基于 Chromium 的浏览器配置文件。这样会复用该浏览器配置文件中
已经打开的标签页和登录状态。
官方背景与设置参考:
- [Chrome for DevelopersUse Chrome DevTools MCP with your browser session](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session)
- [Chrome for Developers在你的浏览器会话中使用 Chrome DevTools MCP](https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session)
- [Chrome DevTools MCP README](https://github.com/ChromeDevTools/chrome-devtools-mcp)
内置 profile
内置配置文件
- `user`
可选:如果你想使用不同的名称、颜色或浏览器数据目录,也可以创建自己的自定义 existing-session profile
可选:如果你想使用不同的名称、颜色或浏览器数据目录,可以创建你自己的自定义 existing-session 配置文件
默认行为:
- 内置的 `user` profile 使用 Chrome MCP 自动连接,目标是
默认本地 Google Chrome profile
- 内置的 `user` 配置文件使用 Chrome MCP 自动连接,目标是
默认的本地 Google Chrome 配置文件
对于 Brave、Edge、Chromium 或非默认 Chrome profile,请使用 `userDataDir`
对于 Brave、Edge、Chromium 或非默认 Chrome 配置文件,请使用 `userDataDir`
```json5
{
@ -427,7 +419,7 @@ OpenClaw 还可以通过官方 Chrome DevTools MCP 服务器,附加到正在
1. 打开该浏览器用于远程调试的 inspect 页面。
2. 启用远程调试。
3. 保持浏览器运行,并在 OpenClaw 附加时批准连接提示。
3. 保持浏览器运行,并在 OpenClaw 连接时批准连接提示。
常见 inspect 页面:
@ -435,7 +427,7 @@ OpenClaw 还可以通过官方 Chrome DevTools MCP 服务器,附加到正在
- Brave`brave://inspect/#remote-debugging`
- Edge`edge://inspect/#remote-debugging`
实时附加冒烟测试:
实时连接冒烟测试:
```bash
openclaw browser --browser-profile user start
@ -452,53 +444,52 @@ openclaw browser --browser-profile user snapshot --format ai
- `tabs` 列出你已经打开的浏览器标签页
- `snapshot` 返回所选实时标签页中的 refs
如果附加无效,请检查:
如果连接无效,请检查:
- 目标的基于 Chromium 的浏览器版本是否为 `144+`
- 是否已在该浏览器的 inspect 页面中启用远程调试
- 浏览器是否弹出了附加同意提示,并且你已接受
- `openclaw doctor` 可以迁移旧的基于扩展的浏览器配置,并检查
默认自动连接 profile 所需的 Chrome 是否已在本地安装,但它无法替你启用浏览器侧的远程调试
- 目标的基于 Chromium 的浏览器版本为 `144+`
- 已在该浏览器的 inspect 页面中启用远程调试
- 浏览器已显示连接同意提示,并且你已接受
- `openclaw doctor` 会迁移旧的基于扩展的浏览器配置,并检查
默认自动连接配置文件所需的 Chrome 是否已在本地安装,但它不能
替你启用浏览器端的远程调试
智能体使用:
智能体使用方式
- 当你需要使用用户已登录浏览器状态时,请使用 `profile="user"`
- 如果你使用的是自定义 existing-session profile请传入那个显式 profile 名称。
- 只有当用户本人在电脑前、可以批准附加
提示时,才应选择此模式。
- Gateway 网关或节点宿主机可以启动 `npx chrome-devtools-mcp@latest --autoConnect`
- 当你需要用户已登录的浏览器状态时,使用 `profile="user"`
- 如果你使用自定义 existing-session 配置文件,请传入其明确的配置文件名称。
- 仅当用户就在电脑前、可以批准连接提示时才选择此模式。
- Gateway 网关或节点主机可以启动 `npx chrome-devtools-mcp@latest --autoConnect`
说明:
- 相比隔离的 `openclaw` profile这条路径风险更高因为它可以
在你已登录的浏览器会话中执行操作。
- 对于这个驱动OpenClaw 不会启动浏览器;它只会附加。
- OpenClaw 在这里使用官方 Chrome DevTools MCP `--autoConnect` 流程。如果
设置了 `userDataDir`,它会被透传,以定位到对应的用户数据目录。
- Existing-session 可以在所选宿主机上附加,也可以通过已连接的
浏览器节点附加。如果 Chrome 位于其他位置且没有连接浏览器节点,请改用
远程 CDP 或 node host。
- 由于它可以在你已登录的浏览器会话中执行操作,因此这一路径比隔离的 `openclaw` 配置文件风险更高。
- 对于该驱动OpenClaw 不会启动浏览器;它只会连接。
- OpenClaw 在此处使用官方 Chrome DevTools MCP `--autoConnect` 流程。如果
设置了 `userDataDir`,则会一并传递,用于定位该用户数据目录。
- existing-session 可以连接到所选主机,或通过已连接的
浏览器节点进行连接。如果 Chrome 位于其他位置且未连接浏览器节点,请改用
远程 CDP 或节点主机。
<Accordion title="Existing-session 功能限制">
<Accordion title="existing-session 功能限制">
与受管理的 `openclaw` profile 相比existing-session 驱动的能力会更受限
与受管理的 `openclaw` 配置文件相比existing-session 驱动限制更多
- **截图** —— 页面截图和 `--ref` 元素截图可用CSS `--element` 选择器不可用。`--full-page` 不能与 `--ref``--element` 组合使用。页面或基于 ref 的元素截图不需要 Playwright。
- **作** —— `click`、`type`、`hover`、`scrollIntoView`、`drag` 和 `select` 需要 snapshot refs不支持 CSS 选择器)。`click` 仅支持左键。`type` 不支持 `slowly=true`;请使用 `fill``press`。`press` 不支持 `delayMs`。`hover`、`scrollIntoView`、`drag`、`select`、`fill` 和 `evaluate` 不支持按次调用的超时。`select` 只接受单个值。
- **等待 / 上传 / 对话框** —— `wait --url` 支持精确、子串和 glob 模式;不支持 `wait --load networkidle`。上传 hooks 需要 `ref``inputRef`,一次仅支持一个文件,不支持 CSS `element`。对话框 hooks 不支持超时覆盖。
- **仅受管理模式支持的功能** —— 批量动作、PDF 导出、下载拦截和 `responsebody` 仍然需要受管理浏览器路径。
- **截图** —— 支持页面截图和 `--ref` 元素截图;不支持 CSS `--element` 选择器。`--full-page` 不能与 `--ref``--element` 组合使用。页面截图或基于 ref 的元素截图不需要 Playwright。
- **作** —— `click`、`type`、`hover`、`scrollIntoView`、`drag` 和 `select` 需要使用快照 ref不支持 CSS 选择器)。`click` 仅支持鼠标左键。`type` 不支持 `slowly=true`;请使用 `fill``press`。`press` 不支持 `delayMs`。`hover`、`scrollIntoView`、`drag`、`select`、`fill` 和 `evaluate` 不支持按调用单独设置超时。`select` 接受单个值。
- **Wait / upload / dialog** —— `wait --url` 支持精确、子串和 glob 模式;不支持 `wait --load networkidle`。上传钩子要求使用 `ref``inputRef`,每次一个文件,不支持 CSS `element`。对话框钩子不支持超时覆盖。
- **仅限 managed 的功能** —— 批量操作、PDF 导出、下载拦截以及 `responsebody` 仍然需要受管理浏览器路径。
</Accordion>
## 隔离保证
- **专用用户数据目录**:绝不触碰你的个人浏览器 profile
- **专用用户数据目录**:绝不会触碰你的个人浏览器配置文件
- **专用端口**:避免使用 `9222`,以防与开发工作流冲突。
- **确定性的标签页控制**:通过 `targetId` 定位标签页,而不是依赖“最后一个标签页”。
- **可预测的标签页控制**:通过 `targetId` 定位标签页,而不是“最后一个标签页”。
## 浏览器选择
在本地启动时OpenClaw 会选择第一个可用
在本地启动时OpenClaw 会选择第一个可用的浏览器
1. Chrome
2. Brave
@ -506,9 +497,9 @@ openclaw browser --browser-profile user snapshot --format ai
4. Chromium
5. Chrome Canary
你可以通过 `browser.executablePath` 覆盖。
你可以通过 `browser.executablePath` 覆盖
平台差异
平台说明
- macOS检查 `/Applications``~/Applications`
- Linux查找 `google-chrome`、`brave`、`microsoft-edge`、`chromium` 等。
@ -516,352 +507,33 @@ openclaw browser --browser-profile user snapshot --format ai
## 控制 API可选
对于仅限本地的集成Gateway 网关暴露了一个小型 loopback HTTP API
- 状态/启动/停止:`GET /`、`POST /start`、`POST /stop`
- 标签页:`GET /tabs`、`POST /tabs/open`、`POST /tabs/focus`、`DELETE /tabs/:targetId`
- Snapshot/截图:`GET /snapshot`、`POST /screenshot`
- 动作:`POST /navigate`、`POST /act`
- Hooks`POST /hooks/file-chooser`、`POST /hooks/dialog`
- 下载:`POST /download`、`POST /wait/download`
- 调试:`GET /console`、`POST /pdf`
- 调试:`GET /errors`、`GET /requests`、`POST /trace/start`、`POST /trace/stop`、`POST /highlight`
- 网络:`POST /response/body`
- 状态:`GET /cookies`、`POST /cookies/set`、`POST /cookies/clear`
- 状态:`GET /storage/:kind`、`POST /storage/:kind/set`、`POST /storage/:kind/clear`
- 设置:`POST /set/offline`、`POST /set/headers`、`POST /set/credentials`、`POST /set/geolocation`、`POST /set/media`、`POST /set/timezone`、`POST /set/locale`、`POST /set/device`
所有端点都接受 `?profile=<name>`
如果配置了共享 secret Gateway 网关认证,则浏览器 HTTP 路由也需要认证:
- `Authorization: Bearer <gateway token>`
- `x-openclaw-password: <gateway password>` 或带该密码的 HTTP Basic auth
说明:
- 这个独立的 loopback 浏览器 API **不会**消费 trusted-proxy 或
Tailscale Serve 身份 headers。
- 如果 `gateway.auth.mode``none``trusted-proxy`,这些 loopback 浏览器
路由也不会继承这些基于身份的模式;请保持它们仅限 loopback。
### `/act` 错误契约
`POST /act` 对于路由级校验和
策略失败使用结构化错误响应:
```json
{ "error": "<message>", "code": "ACT_*" }
```
当前 `code` 值:
- `ACT_KIND_REQUIRED`HTTP 400缺少 `kind` 或无法识别。
- `ACT_INVALID_REQUEST`HTTP 400动作负载标准化或校验失败。
- `ACT_SELECTOR_UNSUPPORTED`HTTP 400在不支持的动作类型中使用了 `selector`
- `ACT_EVALUATE_DISABLED`HTTP 403`evaluate`(或 `wait --fn`)已被配置禁用。
- `ACT_TARGET_ID_MISMATCH`HTTP 403顶层或批量 `targetId` 与请求目标冲突。
- `ACT_EXISTING_SESSION_UNSUPPORTED`HTTP 501该动作不支持 existing-session profiles。
其他运行时故障仍可能只返回 `{ "error": "<message>" }`
而不包含 `code` 字段。
### Playwright 要求
部分功能navigate/act/AI snapshot/role snapshot、元素截图、
PDF需要 Playwright。如果未安装 Playwright这些端点会返回
明确的 501 错误。
在没有 Playwright 的情况下仍可工作的内容:
- ARIA snapshots
- 当存在按标签页划分的 CDP
WebSocket 时,针对受管理 `openclaw` 浏览器的页面截图
- 针对 `existing-session` / Chrome MCP profiles 的页面截图
- 来自 snapshot 输出的 `existing-session` 基于 ref 的截图(`--ref`
仍然需要 Playwright 的内容:
- `navigate`
- `act`
- AI snapshots / role snapshots
- 基于 CSS 选择器的元素截图(`--element`
- 完整浏览器 PDF 导出
元素截图也会拒绝 `--full-page`;该路由会返回 `fullPage is
not supported for element screenshots`。
如果你看到 `Playwright is not available in this gateway build`,请修复
内置浏览器插件的运行时依赖,确保已安装 `playwright-core`
然后重启 gateway。对于打包安装请运行 `openclaw doctor --fix`
对于 Docker还需按下文所示安装 Chromium 浏览器二进制文件。
#### Docker Playwright 安装
如果你的 Gateway 网关运行在 Docker 中,请避免使用 `npx playwright`(会与 npm 覆盖产生冲突)。
请改用内置 CLI
```bash
docker compose run --rm openclaw-cli \
node /app/node_modules/playwright-core/cli.js install chromium
```
要持久化浏览器下载内容,请设置 `PLAYWRIGHT_BROWSERS_PATH`(例如
`/home/node/.cache/ms-playwright`),并确保 `/home/node` 通过
`OPENCLAW_HOME_VOLUME` 或 bind mount 持久化。参见 [Docker](/zh-CN/install/docker)。
## 工作原理(内部)
一个小型的 loopback 控制服务器接收 HTTP 请求,并通过 CDP 连接到基于 Chromium 的浏览器。高级动作click/type/snapshot/PDF通过建立在 CDP 之上的 Playwright 完成;当 Playwright 缺失时,只能使用非 Playwright 操作。对智能体来说,始终看到的是一个稳定接口,而本地/远程浏览器和 profile 可以在底层自由切换。
## CLI 快速参考
所有命令都接受 `--browser-profile <name>` 用于指定某个 profile并接受 `--json` 用于机器可读输出。
<AccordionGroup>
<Accordion title="基础status、tabs、open/focus/close">
```bash
openclaw browser status
openclaw browser start
openclaw browser stop # also clears emulation on attach-only/remote CDP
openclaw browser tabs
openclaw browser tab # shortcut for current tab
openclaw browser tab new
openclaw browser tab select 2
openclaw browser tab close 2
openclaw browser open https://example.com
openclaw browser focus abcd1234
openclaw browser close abcd1234
```
</Accordion>
<Accordion title="检查screenshot、snapshot、console、errors、requests">
```bash
openclaw browser screenshot
openclaw browser screenshot --full-page
openclaw browser screenshot --ref 12 # or --ref e12
openclaw browser snapshot
openclaw browser snapshot --format aria --limit 200
openclaw browser snapshot --interactive --compact --depth 6
openclaw browser snapshot --efficient
openclaw browser snapshot --labels
openclaw browser snapshot --selector "#main" --interactive
openclaw browser snapshot --frame "iframe#main" --interactive
openclaw browser console --level error
openclaw browser errors --clear
openclaw browser requests --filter api --clear
openclaw browser pdf
openclaw browser responsebody "**/api" --max-chars 5000
```
</Accordion>
<Accordion title="动作navigate、click、type、drag、wait、evaluate">
```bash
openclaw browser navigate https://example.com
openclaw browser resize 1280 720
openclaw browser click 12 --double # or e12 for role refs
openclaw browser type 23 "hello" --submit
openclaw browser press Enter
openclaw browser hover 44
openclaw browser scrollintoview e12
openclaw browser drag 10 11
openclaw browser select 9 OptionA OptionB
openclaw browser download e12 report.pdf
openclaw browser waitfordownload report.pdf
openclaw browser upload /tmp/openclaw/uploads/file.pdf
openclaw browser fill --fields '[{"ref":"1","type":"text","value":"Ada"}]'
openclaw browser dialog --accept
openclaw browser wait --text "Done"
openclaw browser wait "#main" --url "**/dash" --load networkidle --fn "window.ready===true"
openclaw browser evaluate --fn '(el) => el.textContent' --ref 7
openclaw browser highlight e12
openclaw browser trace start
openclaw browser trace stop
```
</Accordion>
<Accordion title="状态cookies、storage、offline、headers、geo、device">
```bash
openclaw browser cookies
openclaw browser cookies set session abc123 --url "https://example.com"
openclaw browser cookies clear
openclaw browser storage local get
openclaw browser storage local set theme dark
openclaw browser storage session clear
openclaw browser set offline on
openclaw browser set headers --headers-json '{"X-Debug":"1"}'
openclaw browser set credentials user pass # --clear to remove
openclaw browser set geo 37.7749 -122.4194 --origin "https://example.com"
openclaw browser set media dark
openclaw browser set timezone America/New_York
openclaw browser set locale en-US
openclaw browser set device "iPhone 14"
```
</Accordion>
</AccordionGroup>
说明:
- `upload``dialog` 是**预置**调用;请在触发文件选择器/对话框的 click/press 之前先执行它们。
- `click`/`type`/等动作需要来自 `snapshot``ref`(数字 `12` 或角色引用 `e12`)。动作故意不支持 CSS 选择器。
- 下载、trace 和 upload 路径被限制在 OpenClaw 临时根目录内:`/tmp/openclaw{,/downloads,/uploads}`(回退路径:`${os.tmpdir()}/openclaw/...`)。
- `upload` 也可以通过 `--input-ref``--element` 直接设置文件输入。
Snapshot 标志速览:
- `--format ai`(装有 Playwright 时的默认值):带数字引用的 AI snapshot`aria-ref="<n>"`)。
- `--format aria`:无障碍树,不含引用;仅用于检查。
- `--efficient`(或 `--mode efficient`):紧凑角色 snapshot 预设。将 `browser.snapshotDefaults.mode: "efficient"` 设为默认值(参见 [Gateway 网关配置](/zh-CN/gateway/configuration-reference#browser))。
- `--interactive`、`--compact`、`--depth`、`--selector` 会强制使用角色 snapshot并生成 `ref=e12` 形式的引用。`--frame "<iframe>"` 可将角色 snapshot 限定在某个 iframe 内。
- `--labels` 会附加一张仅限 viewport 的截图,并叠加 `e12` 标签(打印 `MEDIA:<path>`)。
## Snapshots 与 refs
OpenClaw 支持两种 “snapshot” 风格:
- **AI snapshot数字 refs**`openclaw browser snapshot`(默认;`--format ai`
- 输出:包含数字 refs 的文本 snapshot。
- 动作:`openclaw browser click 12`、`openclaw browser type 23 "hello"`。
- 内部通过 Playwright 的 `aria-ref` 解析 ref。
- **角色 snapshot如 `e12` 这样的角色 refs**`openclaw browser snapshot --interactive`(或 `--compact`、`--depth`、`--selector`、`--frame`
- 输出:带 `[ref=e12]`(以及可选 `[nth=1]`)的基于角色的列表/树。
- 动作:`openclaw browser click e12`、`openclaw browser highlight e12`。
- 内部通过 `getByRole(...)`(以及在重复场景下使用 `nth()`)解析 ref。
- 添加 `--labels` 可附带一张带有叠加 `e12` 标签的 viewport 截图。
Ref 行为:
- Refs **在导航之间并不稳定**;如果动作失败,请重新运行 `snapshot` 并使用新的 ref。
- 如果角色 snapshot 是通过 `--frame` 获取的,则角色 refs 会被限定在该 iframe 中,直到下一次角色 snapshot 生成。
## Wait 增强功能
你可以等待的不只是时间/文本:
- 等待 URL支持 Playwright 风格 glob
- `openclaw browser wait --url "**/dash"`
- 等待加载状态:
- `openclaw browser wait --load networkidle`
- 等待 JS 谓词:
- `openclaw browser wait --fn "window.ready===true"`
- 等待某个选择器变为可见:
- `openclaw browser wait "#main"`
这些条件可以组合:
```bash
openclaw browser wait "#main" \
--url "**/dash" \
--load networkidle \
--fn "window.ready===true" \
--timeout-ms 15000
```
## 调试工作流
当动作失败时(例如 “not visible”、“strict mode violation”、“covered”
1. `openclaw browser snapshot --interactive`
2. 使用 `click <ref>` / `type <ref>`(在交互模式下优先使用角色 refs
3. 如果仍然失败:运行 `openclaw browser highlight <ref>`,查看 Playwright 实际定位到的目标
4. 如果页面行为异常:
- `openclaw browser errors --clear`
- `openclaw browser requests --filter api --clear`
5. 对于深入调试:录制 trace
- `openclaw browser trace start`
- 复现问题
- `openclaw browser trace stop`(会打印 `TRACE:<path>`
## JSON 输出
`--json` 用于脚本和结构化工具链。
示例:
```bash
openclaw browser status --json
openclaw browser snapshot --interactive --json
openclaw browser requests --filter api --json
openclaw browser cookies --json
```
JSON 中的角色 snapshot 会包含 `refs` 以及一个小型 `stats`lines/chars/refs/interactive以便工具能够推断负载大小和密度。
## 状态与环境调节项
对于“让网站表现得像 X”之类的工作流这些选项很有用
- Cookies`cookies`、`cookies set`、`cookies clear`
- Storage`storage local|session get|set|clear`
- Offline`set offline on|off`
- Headers`set headers --headers-json '{"X-Debug":"1"}'`(旧版 `set headers --json '{"X-Debug":"1"}'` 仍受支持)
- HTTP Basic auth`set credentials user pass`(或 `--clear`
- Geolocation`set geo <lat> <lon> --origin "https://example.com"`(或 `--clear`
- Media`set media dark|light|no-preference|none`
- Timezone / locale`set timezone ...`、`set locale ...`
- Device / viewport
- `set device "iPhone 14"`Playwright 设备预设)
- `set viewport 1280 720`
## 安全与隐私
- `openclaw` 浏览器 profile 可能包含已登录会话;请将其视为敏感对象。
- `browser act kind=evaluate` / `openclaw browser evaluate` 以及 `wait --fn`
会在页面上下文中执行任意 JavaScript。提示注入可能会引导
这一行为。如果你不需要,请通过 `browser.evaluateEnabled=false` 禁用它。
- 关于登录和反机器人注意事项X/Twitter 等),请参见 [浏览器登录 + X/Twitter 发帖](/zh-CN/tools/browser-login)。
- 请将 Gateway 网关/节点宿主机保持私有(仅限 loopback 或 tailnet
- 远程 CDP 端点权限很高;请通过隧道并做好保护。
严格模式示例(默认阻止私有/内部目标):
```json5
{
browser: {
ssrfPolicy: {
dangerouslyAllowPrivateNetwork: false,
hostnameAllowlist: ["*.example.com", "example.com"],
allowedHostnames: ["localhost"], // optional exact allow
},
},
}
```
为了便于脚本化和调试Gateway 网关暴露了一个小型的**仅限 loopback 的 HTTP 控制 API**,并提供匹配的 `openclaw browser` CLI快照、refs、wait 增强功能、JSON 输出、调试工作流)。完整参考请参见
[浏览器控制 API](/zh-CN/tools/browser-control)。
## 故障排除
对于 Linux 特有问题(尤其是 snap Chromium请参见
有关 Linux 特有问题(尤其是 snap Chromium请参见
[浏览器故障排除](/zh-CN/tools/browser-linux-troubleshooting)。
对于 WSL2 Gateway 网关 + Windows Chrome 的分离宿主机场景,请参见
[WSL2 + Windows + remote Chrome CDP 故障排除](/zh-CN/tools/browser-wsl2-windows-remote-cdp-troubleshooting)。
有关 WSL2 Gateway 网关 + Windows Chrome 分离主机设置,请参见
[WSL2 + Windows + 远程 Chrome CDP 故障排除](/zh-CN/tools/browser-wsl2-windows-remote-cdp-troubleshooting)。
### CDP 启动失败 vs 导航 SSRF 阻止
### CDP 启动失败 vs 导航 SSRF 拦截
这是两类不同的故障,它们指向不同的代码路径。
这是两类不同的失败,它们指向不同的代码路径。
- **CDP 启动或就绪失败** 表示 OpenClaw 无法确认浏览器控制平面是健康的
- **导航 SSRF 阻止** 表示浏览器控制平面是健康的,但页面导航目标被策略拒绝了
- **CDP 启动或就绪失败** 表示 OpenClaw 无法确认浏览器控制平面处于健康状态。
- **导航 SSRF 拦截** 表示浏览器控制平面是健康的,但页面导航目标因策略而被拒绝。
常见示例:
- CDP 启动或就绪失败:
- `Chrome CDP websocket for profile "openclaw" is not reachable after start`
- `Remote CDP for profile "<name>" is not reachable at <cdpUrl>`
- 导航 SSRF 阻止
- `open`、`navigate`、snapshot 或 tab-opening 流程因浏览器/网络策略错误而失败,而 `start``tabs` 仍然可以工作
- 导航 SSRF 拦截:
- 当 `start``tabs` 仍然可用时,`open`、`navigate`、snapshot 或打开标签页流程因浏览器/网络策略错误而失败
使用下面这组最小命令来区分两者:
使用以下最小序列来区分两者:
```bash
openclaw browser --browser-profile openclaw start
@ -869,47 +541,47 @@ openclaw browser --browser-profile openclaw tabs
openclaw browser --browser-profile openclaw open https://example.com
```
结果解读:
结果解读方式
- 如果 `start``not reachable after start` 失败,先排查 CDP 就绪性。
- 如果 `start` 成功但 `tabs` 失败,控制平面仍不健康。这仍应视为 CDP 可达性问题,而不是页面导航问题。
- 如果 `start``tabs` 成功,但 `open``navigate` 失败,则说明浏览器控制平面已经正常,故障点在于导航策略或目标页面。
- 如果 `start`、`tabs` 和 `open` 都成功,则说明基础的受管理浏览器控制路径是健康的。
- 如果 `start``not reachable after start` 失败,先排查 CDP 就绪性。
- 如果 `start` 成功但 `tabs` 失败,控制平面仍不健康。应将其视为 CDP 可达性问题,而不是页面导航问题。
- 如果 `start``tabs` 成功,但 `open``navigate` 失败,则浏览器控制平面已正常运行,失败出在导航策略或目标页面。
- 如果 `start`、`tabs` 和 `open` 全部成功,则基本的受管理浏览器控制路径是健康的。
重要行为细节:
- 即使你没有配置 `browser.ssrfPolicy`,浏览器配置默认也会带有一个失败关闭的 SSRF 策略对象。
- 对于本地 loopback 的受管理 `openclaw` profileCDP 健康检查会有意跳过针对 OpenClaw 自身本地控制平面的浏览器 SSRF 可达性强制检查。
- 导航保护是独立的。`start` 或 `tabs` 成功结果并不意味着后续的 `open``navigate` 目标一定被允许。
- 即使你没有配置 `browser.ssrfPolicy`,浏览器配置默认也会使用失败即关闭的 SSRF 策略对象。
- 对于本地 loopback 的受管理 `openclaw` 配置文件CDP 健康检查会刻意跳过对 OpenClaw 自身本地控制平面的浏览器 SSRF 可达性强制检查。
- 导航保护是独立的。`start` 或 `tabs` 成功并不意味着后续的 `open``navigate` 目标一定被允许。
安全建议
安全指导
- **不要** 默认放宽浏览器 SSRF 策略。
- 优先使用`hostnameAllowlist``allowedHostnames` 这样的精细主机例外,而不是开放广泛的私有网络访问。
- 只有在明确受信任、且确实需要访问私有网络浏览器目标并已完成审查的环境中,才使用 `dangerouslyAllowPrivateNetwork: true`
- 默认情况下**不要**放宽浏览器 SSRF 策略。
- 优先使用狭义的主机例外,例如 `hostnameAllowlist``allowedHostnames`,而不是宽泛的私有网络访问。
- 仅在明确受信任且已审查、确实需要私有网络浏览器访问的环境中,才使用 `dangerouslyAllowPrivateNetwork: true`
## 智能体工具 + 控制方式
## 智能体工具 + 控制工作方式
智能体获得**一个工具**用于浏览器自动化:
智能体获得**一个工具**用于浏览器自动化:
- `browser` — status/start/stop/tabs/open/focus/close/snapshot/screenshot/navigate/act
映射方式
其映射关系如下
- `browser snapshot` 返回一个稳定的 UI 树AI 或 ARIA
- `browser act` 会使用 snapshot 中的 `ref` ID 来执行 click/type/drag/select
- `browser screenshot` 捕获像素(整页或元素)。
- `browser snapshot` 返回稳定的 UI 树AI 或 ARIA
- `browser act` 使用快照中的 `ref` ID 执行点击/输入/拖动/选择
- `browser screenshot` 捕获像素(整页或元素)。
- `browser` 接受:
- `profile`,用于选择命名浏览器 profileopenclaw、chrome 或远程 CDP
- `target``sandbox` | `host` | `node`,用于选择浏览器位于何处
- `profile`:选择命名浏览器配置文件openclaw、chrome 或远程 CDP
- `target``sandbox` | `host` | `node`:选择浏览器所在位置
- 在沙箱隔离会话中,`target: "host"` 需要 `agents.defaults.sandbox.browser.allowHostControl=true`
- 如果省略 `target`:沙箱隔离会话默认使用 `sandbox`,非沙箱会话默认使用 `host`
- 如果已连接具备浏览器能力的节点,工具可能会自动路由到该节点,除非你 `target="host"``target="node"` 固定下来
- 如果已连接具备浏览器能力的节点,工具可能会自动路由到该节点,除非你固定指定 `target="host"``target="node"`
这样可以让智能体保持确定性,并避免脆弱的选择器。
这样可以让智能体保持可预测性,并避免脆弱的选择器。
## 相关内容
- [工具概览](/zh-CN/tools) — 所有可用的智能体工具
- [沙箱隔离](/zh-CN/gateway/sandboxing) — 沙箱环境中的浏览器控制
- [安全](/zh-CN/gateway/security) — 浏览器控制风险与加固
- [沙箱隔离](/zh-CN/gateway/sandboxing) — 沙箱隔离环境中的浏览器控制
- [安全](/zh-CN/gateway/security) — 浏览器控制风险与加固