Web 界面

Control UI

Control UI 是由 Gateway 网关提供服务的小型 Vite + Lit 单页应用:

  • 默认值:http://<host>:18789/
  • 可选前缀:设置 gateway.controlUi.basePath(例如 /openclaw

它通过同一端口直接连接 Gateway 网关 WebSocket

查看正在运行的会话时,Gateway 网关可以使用该智能体的实用模型生成简洁的状态摘要。聊天界面将其显示为单行状态标签,展开后会显示一张卡片,其中包含评估、计划进度、PR 和已用时间。当运行卡住或需要输入时,卡片可以自动展开一次;/btw 侧边聊天的优先级高于展开的卡片。

展开的卡片还可以接收有关该次运行的简短问题。回答仅使用观察器当前的摘要和经过净化且长度受限的备注,只在该会话的浏览器中保留,并且绝不会进入或中断主智能体运行。如果观察内容中没有答案,观察器会说明它无法得知。

第一个摘要到达后,它将取代启发式实时活动,作为该次运行的侧边栏副标题。最终的完成或失败摘要会在会话未读期间保持可见,之后该行将恢复为正常的工作副标题。

会话观察默认启用。在 Settings > Appearance > Sidebar 中,可以在整个 Gateway 网关范围内将其关闭、查看解析后的小模型及其来源,或者选择自动路由、禁用实用任务,或明确选择一个 agents.defaults.utilityModel。对应的配置控制项为 gateway.controlUi.sessionObserver: falseagents.defaults.utilityModel: ""

快速打开(本地)

如果 Gateway 网关运行在同一台计算机上,请打开 http://127.0.0.1:18789/(或 http://localhost:18789/)。

如果页面无法加载,请先启动 Gateway 网关:openclaw gateway

身份验证在 WebSocket 握手期间通过以下方式提供:

  • connect.params.auth.token
  • connect.params.auth.password
  • gateway.auth.allowTailscale: true 时使用 Tailscale Serve 身份标头
  • gateway.auth.mode: "trusted-proxy" 时使用受信任代理身份标头

Gateway 网关身份验证先于设备配对运行。直接 local loopback 连接不会绕过令牌或密码身份验证。仪表板设置面板会为当前浏览器标签页会话和所选 Gateway 网关 URL 保留令牌;密码不会持久化。配对后,浏览器可在后续连接中使用其存储的每设备令牌。

新手引导通常会配置 Gateway 网关令牌以用于共享密钥身份验证。如果 Gateway 网关以令牌模式启动但未配置令牌,它会改为为该进程生成临时运行时令牌。运行时令牌不会写入配置,因此 openclaw config get gateway.auth.token 无法获取它,并且没有该令牌的 local loopback 浏览器会被拒绝。运行 openclaw doctor --generate-gateway-token,重启 Gateway 网关,然后将配置的令牌粘贴到 Control UI 设置中。当 gateway.auth.mode"password" 时,也可以改用密码身份验证。

设备配对(首次连接)

Gateway 网关身份验证成功后,从新浏览器或设备连接通常需要进行一次性配对批准,显示为 disconnected (1008): pairing required

  • 列出待处理请求

    bash
    openclaw devices list
  • 按请求 ID 批准

    bash
    openclaw devices approve <requestId>
  • 如果浏览器使用已更改的身份验证详细信息(角色/权限范围/公钥)重试配对,之前的待处理请求会被取代,并创建新的 requestId;批准前请重新运行 openclaw devices list

    将已配对的远程浏览器从读取权限切换为写入/管理员权限会被视为批准升级,而不是静默重新连接:OpenClaw 会保持旧批准有效,阻止权限更广的重新连接,并要求你明确批准新的权限范围集合。符合条件的直接 local loopback Control UI 连接可在通过身份验证后静默批准升级。

    批准后,设备会被记住,无需再次批准,除非使用 openclaw devices revoke --device <id> --role <role> 将其撤销。有关令牌轮换、撤销以及 Paperclip / openclaw_gateway 首次运行批准流程,请参阅设备 CLI

    配对移动设备

    已配对的管理员无需打开终端,即可创建 iOS/Android 连接二维码:

  • 打开移动设备配对

    选择 Devices,然后点击 Devices 卡片中的 Pair mobile device

  • 连接手机

    在 OpenClaw 移动应用中,打开 SettingsGateway 并扫描二维码。也可以改为复制并粘贴设置代码。

  • 确认连接

    官方 iOS/Android 应用会自动连接。如果 Pending approval 显示请求,请先检查其角色和权限范围,再予以批准。

  • 创建设置代码需要 operator.admin;不具备该权限的会话中,此按钮会被禁用。设置代码包含短期有效的引导凭据,因此在二维码和复制的代码有效期间,应像对待密码一样保护它们。对于远程配对,Gateway 网关必须解析为 wss://(例如通过 Tailscale Serve/Funnel);普通的 ws:// 仅限 local loopback 和专用 LAN 地址。有关完整的安全和回退详细信息,请参阅配对

    个人身份(浏览器本地)

    Control UI 支持为每个浏览器设置个人身份(显示名称和头像),该身份会附加到外发消息,以便在共享会话中标明来源。它存储在浏览器存储空间中,作用域限定为当前浏览器配置文件,不会同步到其他设备;除你发送的消息中正常的对话记录作者元数据外,也不会持久化到服务器端。清除网站数据或切换浏览器会将其重置为空。

    助手头像覆盖项遵循相同的浏览器本地模式:上传的覆盖项仅在本地覆盖 Gateway 网关解析的身份,绝不会通过 config.patch 往返传输。共享的 ui.assistant.avatar 配置字段仍可供直接写入该字段的非 UI 客户端使用。

    运行时配置端点

    Control UI 从 /control-ui-config.json 获取运行时设置,该路径相对于 Gateway 网关的 Control UI 基础路径解析(例如,基础路径 /__openclaw__/ 下的 /__openclaw__/control-ui-config.json)。该端点受与其余 HTTP 接口相同的 Gateway 网关身份验证保护:未经身份验证的浏览器无法获取它,成功获取需要有效的 Gateway 网关令牌/密码、Tailscale Serve 身份或受信任代理身份。

    Gateway 网关主机状态

    打开 Settings → General,即可查看 Gateway Host 卡片,其中显示 Gateway 网关计算机、LAN 地址、操作系统、运行时、运行时间、CPU 负载、内存和状态卷磁盘空间。该卡片可见时,每 10 秒通过 system.info Gateway RPC 刷新一次,该 RPC 需要 operator.read 权限范围。较旧的 Gateway 网关以及不具备该权限范围的连接不会显示此卡片。

    语言支持

    Control UI 首次加载时会根据浏览器区域设置进行本地化。若要稍后覆盖该设置,请打开 Settings -> General -> Language(选择器位于 General 页面,而不是 Appearance 下)。

    • 支持的区域设置:enardeesfafrhiiditja-JPkonlplpt-BRruthtrukvizh-CNzh-TW
    • 非英语翻译会在浏览器中延迟加载。
    • 所选区域设置会保存到浏览器存储空间,并在以后访问时重复使用。
    • 缺少的翻译键会回退到英语。

    文档翻译会针对相同的非英语区域设置集合生成,但文档站点内置的 Mintlify 语言选择器仅列出 Mintlify 接受的区域设置代码。泰语(th)和波斯语(fa)文档仍会在发布仓库中生成;在 Mintlify 支持这些代码之前,它们可能不会出现在该选择器中。

    外观主题

    Appearance 面板内置 Claw、Knot 和 Dash 主题(默认使用 Claw),另提供一个浏览器本地 tweakcn 导入槽位。要导入主题,请打开 tweakcn 编辑器,选择或创建主题,点击 Share,然后将复制的链接粘贴到 Appearance 中。导入器还接受 https://tweakcn.com/r/themes/<id> 注册表 URL、https://tweakcn.com/editor/theme?theme=amethyst-haze 之类的编辑器 URL、相对 /themes/<id> 路径、原始主题 ID,以及 amethyst-haze 等默认主题名称。

    导入的主题仅存储在当前浏览器配置文件中;它们不会写入 Gateway 网关配置,也不会跨设备同步。替换导入的主题会更新这一个本地槽位;如果导入的主题处于启用状态,清除它会切换回 Claw。

    Appearance 还提供 Text size 设置。它适用于聊天文本、编辑器文本、工具卡片和聊天侧边栏,并确保文本输入框字号至少为 16px,防止移动版 Safari 在获得焦点时自动缩放。

    主题、主题模式、文本大小、语言和聊天显示偏好通过 Gateway 网关配置(ui.prefs)同步,因此它们会在你的设备间保持一致,智能体也可以通过审批关卡更改这些偏好——已连接的客户端会通过 Gateway 网关的 config.changed 通知实时应用更改。每个浏览器都会保留一个本地副本,以便即时启动;无法写入配置的客户端(仅查看权限范围、离线)会将更改仅保留在设备本地。请参阅配置参考

    OpenClaw 系统维护

    打开设置 → 询问 OpenClaw,与系统设置和修复智能体对话。在新手引导之外,此页面每次访问最多显示一个可关闭的事件提示标签。对于常规 Gateway 网关流量,它会保持静默,仅在健康快照报告配置重新加载器已禁用、已配置渠道断开连接或性能下降、渠道探测失败或渠道凭据不可用时作出响应。只有在新事件更严重时,它才会替换待处理的提示标签;关闭或使用提示标签后,本次访问期间将不再显示事件提示。点击提示标签会将其诊断问题作为一条真实的 openclaw.chat 消息发送,因此对话记录会记下该请求,并由 OpenClaw 执行诊断。新手引导期间绝不会显示这些事件提示标签。

    管理插件

    打开侧边栏中的插件,或使用相对于已配置 Control UI 基础路径的 /settings/plugins,即可在不离开 Control UI 的情况下浏览和管理插件。 例如,基础路径为 /openclaw 时,使用 /openclaw/settings/plugins。即使所有可选插件都已禁用,此页面也始终可用。

    插件中心包含四个标签页:已安装发现用于管理 /settings/plugins 中的插件代码,Skills/skills 中托管按智能体划分的技能管理器,工作坊则在 /skills/workshop 中托管技能工作坊提案审查。每个标签页都保留自己的 URL, 而侧边栏只显示一个统一的插件入口。

    已安装标签页按类别分组显示完整的本地清单,并提供概览计数。 每一行都可打开详细信息视图;其更多操作()菜单可用于 启用或禁用插件,并为外部安装的插件提供移除选项。 它还会列出已配置的 MCP 服务器,并支持直接添加、禁用和移除。 相同的服务器控制项也位于设置 → MCP中。 发现标签页是插件商店:其中包含 OpenClaw 内置的精选插件、 官方外部插件,以及适用于热门服务的一键式 MCP 连接器。 在搜索框中输入内容会直接查询 ClawHub,并附加一个来自 ClawHub 部分,其中包含下载次数和来源验证徽章。深层链接可通过 /settings/plugins?tab=discover 直接指向商店。

    Skills标签页保留技能状态报告、启用/禁用开关、API 密钥输入框以及内嵌的 ClawHub 技能搜索,其作用域限定为所选智能体。 工作坊标签页保留技能工作坊看板和针对 技能提案的“今日”审查流程。查找技能创意会从新到旧审查一个有界范围内的重要会话,并将所有结果保留为待处理提案。面板会显示累计覆盖范围;扫描更早的工作 会从持久化游标处继续,较早的历史记录扫描完毕后则变为扫描新工作。 即使自主自我学习已禁用,也可以手动审查历史记录,并使用所选智能体已配置的模型。

    内置插件已存在于 Gateway 网关中,因此会显示启用禁用,而不是安装。例如,Workboard 随 OpenClaw 内置,但默认处于禁用状态,因此其操作为启用。内置插件 无法移除,只能禁用。

    读取目录和搜索 ClawHub 需要 operator.read。安装、 启用、禁用或移除插件以及更改 MCP 服务器需要 operator.admin;对于只读操作员,这些操作会保持禁用状态。

    ClawHub 安装通过 Gateway 网关运行,并执行与其他经由 Gateway 网关的安装相同的信任、 完整性和插件安装策略检查。安装或移除插件代码需要重启 Gateway 网关。 如果插件和当前 Gateway 网关运行时支持,启用或禁用已安装的插件可以无需重启即可生效; 否则 UI 会报告需要重启。基于 OAuth 的 MCP 连接器在添加后,需要从 CLI 执行一次 openclaw mcp login <name>

    此页面特意专注于清单、发现、安装、启用和移除。 对于任意 npm、git 或本地路径来源、更新以及高级插件配置,请使用 openclaw plugins

    应用和扩展

    从侧边栏的更多菜单、命令面板或侧边栏智能体菜单(获取应用)打开 应用,也可以使用相对于已配置 Control UI 基础路径的 /apps。此页面汇集了每个 OpenClaw 配套界面的安装链接: iOSAndroid 应用、 与它们捆绑提供的 Apple Watch 和 Wear OS 配套应用、 macOSWindowsLinux 桌面应用、 Chrome 扩展程序、包含 ClawHub 的应用内插件中心,以及 Discord 社区和文档。

    侧边栏导航

    侧边栏以智能体为中心组织所有内容。顶部的身份行表示当前活动智能体;其下方的页面部分以主页开头——即智能体持续更新的主会话,并带有表示未读或运行状态的徽章——随后是固定的目标位置(默认为自动化插件)。页面标题上的自定义控件会打开一个菜单,其中包含所有其他目标位置,包括用量和插件提供的标签页,以及编辑固定项目;右键点击导航区域可直接打开固定项目编辑器。下方的会话列表分为多个区域:话题用于智能体的聊天会话(主会话保留在主页下;由主会话生成的会话会作为顶层话题显示在这里,具名话题不显示类型前缀),群组用于群聊和房间对话,编码用于绑定到托管工作树或 Exec 节点的会话(每行显示一条 repo ⎇ branch 信息以及节点主机)、由 ACP 支持的 harness 会话,以及 Codex/Claude CLI 目录。编码区域首次运行时默认折叠,并会记住你的选择;折叠后的标题会保留真实数量,并在其中的会话运行时显示运行指示器。自定义群组(会话的 category)和已固定行位于话题上方,将会话分配给自定义群组始终优先于自动区域分类。话题标题包含排序控件(创建时间或最后更新时间、分组方式,以及持久化的状态筛选器:活动、已归档或全部)和用于打开新建会话页面的 +。已归档行仍显示在原位置,以较暗样式并附带归档图标;它们不计入未读或需要关注状态,也不参与谱系提升。打开会话会移动选择高亮,但不会重新排列各行。具有近期子运行的父会话会显示展开控件和子会话数量;展开后,无需离开侧边栏即可检查嵌套子会话、实时或终止状态以及运行时。选择子会话会打开其聊天,并自动显示其祖先路径。子会话行不参与根级分组、固定、拖动、多选和分页;折叠区域不会占用可见页面配额。自上次阅读后有新活动的会话会显示未读圆点,打开后即标记为已读。智能体还可以发布一条简短且会过期的状态信息,并可选择通过精心设计的琥珀色图标请求关注;当你打开该会话、发送下一条消息、明确清除该状态或其 TTL 到期时,此声明会被清除。云端工作节点的生命周期状态使用地球徽章;本地会话和已收回的会话不显示位置徽章,因为本地执行是默认方式。每个根会话行都有上下文菜单(更多按钮或右键点击),其中包含固定/取消固定、标记为未读/已读、重命名、派生、移至群组(包括新建群组和从群组中移除)、归档或取消归档,以及删除;触控布局会始终显示直接固定和菜单控件。按住 Cmd/Ctrl 点击可切换根会话行的多选状态,按住 Shift 点击可按可见顺序扩展选择范围;随后在所选行上打开菜单时,会提供批量操作(将 N 个标记为未读/已读、将 N 个移至群组、归档 N 个、删除 N 个),这些操作会应用于所有选中的会话,批量删除只需确认一次。将根会话拖到已固定即可固定,或拖到自定义群组即可移动。自定义群组标题可以折叠、展开或通过拖动重新排序;群组名称及其顺序存储在 Gateway 网关中(sessions.groups.*),因此会在浏览器间保持一致,而折叠状态则保留在浏览器配置文件中。群组标题也有菜单(更多按钮或右键点击),其中包含重命名群组、新建群组和删除群组;重命名或删除群组会在服务器端更新所有成员会话,包括已归档的会话,而删除群组会保留其中的会话并将其移回话题。

    新建会话页面

    侧边栏会话列表标题中的 + 会在 /new 打开一个全页面草稿:在你发送第一条消息之前,不会创建任何内容。统一的位置选择器用于选择工作文件夹,并允许管理员操作员选择执行目标:Gateway 网关 · 本地、公开 system.run 的已配对节点,或可用的云端配置文件。文件夹默认为 Agent 工作区;其他 Gateway 网关绝对路径需要 operator.admin,但无需是 Git 检出目录即可直接运行。当所选 Gateway 网关文件夹是 Git 检出目录时,同一选择器会提供可选的工作树隔离功能,其中包含由 worktrees.branches 支持的基础分支选择器(不执行 fetch),以及可选的工作树名称(分支将变为 openclaw/<name>)。云端工作节点必须使用该托管工作树路径;已配对节点绝不会提供此选项。编辑器页脚用于选择新会话的模型和推理级别。其中的隐身模式开关会创建一个仅限 Web 的话题,其会话条目、对话记录和压缩状态会一直保存在内存中,直到 Gateway 网关重启;OpenClaw 也会跳过其自动记忆刷新。智能体仍保留常规工具,因此明确的保存请求或由工具驱动的文件写入仍可能持久化数据。模型提供商仍会处理消息,并且不含内容的审计元数据仍会被记录。云端启动会在将会话分派给工作节点之前,持久化所选的模型和推理设置。

    在多用户 Gateway 网关中,只有具有管理员权限范围的连接才能创建或查看隐身话题,其他会话也无法通过智能体会话工具或对话记录搜索访问它们。隐身模式可防止内容被持久存储或被其他经由 Gateway 网关的用户访问,但无法防范 Gateway 网关所有者或进程操作员,因为他们始终可以观察实时会话。

    浏览文件夹会打开位置选择器的内嵌目录浏览器,该浏览器由仅限管理员使用的 fs.listDir 方法支持,其作用域限定为所选 Gateway 网关或节点。Gateway 网关和支持浏览的节点会列出其文件系统;不支持 fs.listDir 但具备执行能力的节点仍接受手动输入的绝对路径。最近使用的位置可以同时恢复文件夹及其所属节点,而不会在不同主机之间传递路径。提交时会调用 sessions.create 并附带第一条消息,因此运行会在同一次往返中启动,UI 随后跳转到新会话的聊天。如果 Gateway 网关创建了会话,但拒绝发送第一条消息,聊天会在重新加载后保留提示词和错误;重试会通过已创建的会话发送该消息,而不是再创建一个会话。

    设置中,专用侧边栏包含询问 OpenClaw,并在顶部提供搜索设置字段,以便快速查找设置部分。

    在桌面网页中,内容区域左上角固定着一组控件——对应 macOS 标题栏条带的网页版本——其中包含侧边栏折叠开关(⌘B)和命令面板搜索按钮(⌘K)。点击侧边栏顶部的智能体身份行会打开智能体菜单;主页会打开主会话。当有事项需要处理时——定时任务失败或逾期、模型身份验证即将过期或已过期——侧边栏页脚上方会显示紧凑的提醒标签,点击即可前往对应页面。身份行显示智能体的头像(身份图片或表情符号)、名称、连接状态点和实时副标题。其智能体范围菜单包含内联智能体切换器(多智能体设置)、新建智能体、“此智能体能做什么?”和智能体设置。智能体超过十个时,名单会提供筛选字段并优先列出已置顶的智能体;可在智能体设置页面置顶或取消置顶智能体,置顶集合存储在浏览器配置文件中。选择智能体后,聊天以及用量、自动化、任务、Workboard 和会话都会限定到该智能体。每个限定范围的页面都提供一个智能体控件,并可通过所有智能体退出该范围;这会扩大共享页面的范围,但不会更改具体的聊天智能体,而直接会话链接仍会打开其目标。智能体设置页面保留自身的 ?agent= 选择,不跟随共享页面范围。页脚是一张占据全宽的身份卡片,离线时仍可使用,并会在最后已知的账户名称下方显示正在重新连接…。它会打开应用/账户菜单,其中的个人资料身份标题下依次为设置用量、移动端配对、获取应用帮助(帮助、Discord、文档和更新日志)、必要时显示的离线重试操作、版本/构建标签以及颜色模式开关。点击构建标签会打开“关于”页面。当 Gateway 网关从源码检出目录运行,且所在分支不是 main 时,页脚还会以红色显示该分支名称,以便一眼识别非发布版 Gateway 网关(发布版安装永远不会显示)。在 Apple 平台上按 Shift-Command-Comma,或在其他平台上按 Ctrl-Shift-Comma,可打开设置,且不会覆盖浏览器原有的 Command-Comma 快捷键。折叠侧边栏(通过 ⌘B 或控件组中的开关)会将其完全隐藏,以提供全宽工作区;折叠时,左上角控件组会保留展开开关和搜索,并增加新建话题按钮——与 macOS 应用在原生标题栏中承载的控件一致。在桌面端,侧边栏是唯一的导航界面,不设顶栏。在窄视口中,侧边栏会替换为一个滑出式抽屉,其上方的紧凑标题行包含抽屉开关、品牌标识和命令面板搜索;在手机上,聊天会将该导航行并入其标题栏,菜单和搜索控件位于会话标题旁。在 macOS 应用中,独立的标题行会将标题栏留白整合到窗口控件旁的一条紧凑条带中。导航使用常规浏览器历史记录,因此可通过浏览器的后退/前进按钮进行浏览;macOS 应用还会在窗口控件旁添加原生侧边栏开关和触控板轻扫手势,侧边栏展开时,其右侧边缘会显示后退/前进按钮;侧边栏折叠时,则显示原生搜索(命令面板)和新建会话按钮。

    待处理的审批也会在侧边栏页脚上方生成提醒标签; 选择该标签可打开对应的审批页面。

    它目前能做什么

    聊天和 Talk
    • 通过 Gateway 网关 WS 与模型聊天(chat.historychat.sendchat.abortchat.inject)。已归档会话会禁用输入框并显示横幅,必须先执行取消归档操作才能继续对话。
    • 刷新聊天记录时,会请求一个有界的近期窗口,并对每条消息设置文本上限,因此大型会话无需强制浏览器先渲染完整的对话记录载荷,聊天即可使用。
    • 将鼠标悬停在公开 GitHub 议题或拉取请求链接上,或用键盘将焦点移至该链接时,会显示其状态、标题、作者、近期活动、评论和变更统计信息。已连接的 Gateway 网关会获取并缓存公开元数据,而不更改链接目标,即使 UI 使用远程 Gateway 网关也是如此。确认仓库为公开仓库后,Gateway 网关会在可用时使用 GH_TOKENGITHUB_TOKEN;否则会使用 GitHub 的匿名 API,并采用更长的缓存时间。
    • 通过浏览器实时会话使用 Talk。OpenAI 使用直接 WebRTC,Google Live 通过 WebSocket 使用受限的一次性浏览器令牌,而仅限后端的实时语音插件使用 Gateway 网关中继传输。支持视频的浏览器会话可以在设置中选择设备本地摄像头,或从实时预览中切换摄像头;浏览器会为实时提供商捕获 JPEG 帧,而不会通过 Gateway 网关流式传输摄像头视频。客户端所有的提供商会话通过 talk.client.create 启动;Gateway 网关中继会话通过 talk.session.create 启动。中继会将提供商凭据保留在 Gateway 网关上,同时浏览器通过 talk.session.appendAudio 流式传输麦克风 PCM;它还会通过 talk.client.toolCall 转发 openclaw_agent_consult 提供商工具调用,以应用 Gateway 网关策略并使用已配置的更大型 OpenClaw 模型,并通过 talk.client.steertalk.session.steer 路由活动运行中的语音引导。
    • 在聊天中流式显示工具调用和实时工具输出卡片(智能体事件)。工具活动会按类型呈现为不同的行:Shell 命令会显示带语法高亮的命令和终端样式输出;受支持的编辑和写入调用会显示有界的内联 Diffs、可用时显示行号以及 +added -removed 统计信息;连续调用则会折叠为类似“运行了 13 条命令、读取了 6 个文件、编辑了 9 个文件”的摘要。运行进行期间,最新运行中的调用会成为组标题。展开某一行可查看其余参数和原始输出。
    • 可选的复杂工具调用 AI 用途标题(长 Shell 命令、参数较多的插件工具),通过 gateway.controlUi.toolTitles: true 启用(默认关闭)。标题由批处理的 chat.toolTitles 方法通过标准实用模型路由生成——优先使用显式指定的 utilityModel(操作员选择的提供商,与其他实用任务相同),否则使用会话提供商声明的默认小模型——并由 Gateway 网关按智能体缓存。未启用该选项或没有可用的低成本模型时,各行会保留其确定性标签,且不会发起模型调用。
    • 启动或忽略由模型临时建议的后续任务;接受建议后,会使用建议的提示词打开新的托管工作树会话。
    • 活动标签页使用浏览器本地、优先脱敏的摘要,展示通过现有 session.tool / 工具事件传送的实时工具活动。
    渠道、会话和记忆
    • 渠道:内置渠道以及内置/外部插件渠道的状态、二维码登录和各渠道配置(channels.statusweb.login.*config.patch)。
    • 刷新渠道探测时,会在较慢的提供商检查完成前继续显示上一份快照;当探测或审计超出其 UI 时间预算时,还会标记部分快照。
    • 话题(位于 /sessions 的工作区页面,旁边还有一个 Worktrees 标签页):默认列出已配置智能体的会话,可置顶常用会话、重命名、归档或恢复非活动会话,在遇到过时且未配置的智能体会话键时执行回退,并应用按会话设置的模型/思考/快速/详细/追踪/推理覆盖项(sessions.listsessions.patch)。三态活动 / 已归档 / 全部筛选器同时控制此页面和侧边栏;“全部”会淡化已归档行并明确标记。已归档会话会保留其对话记录,永远不会自动清理,并会一直搁置,直到被明确取消归档或删除。对于自上次阅读以来有活动的活跃会话,相应行会显示未读状态点,并提供标记为未读/已读操作(sessions.patch { unread });还提供分叉操作,可将对话记录分支为新会话(sessions.create { parentSessionKey, fork: true })。表格上方的概览图块会汇总已加载的名单(会话数、实时运行数、未读会话数、令牌总数,以及可用时的已归档数量);每行都有类型图标和实时运行状态点,状态以普通状态点加标签呈现;当会话报告令牌数和上下文大小时,令牌列会显示上下文窗口用量仪表。行管理操作位于每行菜单中(三点按钮或右键菜单),与侧边栏的会话菜单一致;行抽屉会在其他会话详情旁显示智能体运行时和运行时长。
    • 原生 Claude 和 Codex 侧边栏目录一次流式加载一个主机,并会在节点连接状态变化后、页面获得焦点时,以及页面可见期间最多每 30 秒进行一次协调。目录变更会触发一次更快的后续扫描,因此在原生工具中创建的会话无需重新加载 Control UI 即可显示。Claude Desktop 行还会保留本地自定义分组标签(如有);OpenClaw 从 Desktop 的本地存储中读取该映射,且永远不会写入。
    • 会话分组:“分组依据”控件可按自定义分组、渠道、类型、智能体或日期,将会话表格组织为多个区段。自定义分组通过 sessions.patchcategory)按会话持久化,因此从消息渠道(Discord、Telegram、WhatsApp……)启动的会话也可以分类;可将行拖动到某一区段,或使用每行的分组选择器来分配分组,也可通过“新建分组”操作创建分组。
    • 记忆(智能体页面上的标签页,范围限定为所选智能体):Dreaming 状态、启用/禁用开关和 Dream Diary 阅读器(doctor.memory.statusdoctor.memory.dreamDiaryconfig.patch)。
    • 导入记忆(/memory-import,可从智能体页面的“记忆”标签页进入):预览本地 Claude Code 自动记忆、Codex 整合记忆或 Hermes 记忆文件,并将其复制到所选智能体工作区(migrations.memory.planmigrations.memory.apply)。
    • 新手引导记忆导入提示:当 Control UI 以新手引导模式打开时(?onboarding=1,由 Linux 配套应用在首次运行安装后使用),单页对话框会提供导入检测到的记忆的选项,并采用相同的计划/应用流程;跳过后,设置页面仍可作为之后的入口。
    定时任务、任务、插件、Skills、设备、Exec 审批
    • 自动化(定时任务):在“自动化/运行历史”选项卡切换器上方显示统计卡片(自动化数量、失败数量、调度器状态、下次唤醒);“自动化”选项卡在可筛选的表格中列出任务(全部/活跃/已暂停、搜索、计划和上次运行筛选器、逐行操作菜单),下方提供入门建议;“运行历史”选项卡显示所有自动化最近的运行记录(cron.*)。
    • 任务:实时显示活跃和最近的后台任务账目,并包含关联会话和取消操作(tasks.*)。“聊天”的“后台任务”侧栏对运行中和已完成的工作进行分组;选择一行可检查其有界提示词和输出或错误摘要。
    • 插件:浏览已安装清单和精选商店、搜索 ClawHub、安装和移除插件代码,以及启用或禁用已安装的插件(plugins.*);MCP 服务器行通过配置方法编辑 mcp.servers
    • Skills:状态、启用/禁用、安装、API key 更新(skills.*)。
    • 设备:统一清单汇集已配对设备记录、节点目录和实时在线状态(device.pair.listnode.listsystem-presence)。Gateway 网关主机固定在首位;已配对客户端显示连接状态、角色、令牌、能力和命令。重复配对会折叠为可展开的组,清理 N 个过期项可批量移除经管理员确认处于离线状态,且曾自动获批(静默本地、受信任 CIDR 或 SSH 验证)或早于审批来源记录的重复项。可以移除条目(node.pair.removedevice.pair.remove),内联处理设备配对和节点重新审批(device.pair.*node.pair.approve/reject),还可在同一卡片中创建设备端设置码。
    • Exec 审批:为 exec host=gateway/node 编辑 Gateway 网关或节点允许列表及询问策略(exec.approvals.*)。
    配置
    • 查看/编辑 ~/.openclaw/openclaw.jsonconfig.getconfig.set)。
    • 设置导航以“询问 OpenClaw”开头,然后按关注重点对页面分组:顶部为“常规”“外观”和“通知”;“连接”(连接、渠道、通信、设备);“智能体与工具”(智能体、AI 与智能体、模型提供商、MCP、自动化、实验室);“隐私与安全”(安全、审批);以及“系统”(基础设施、高级、调试、日志、关于)。“常规”是一个精简中心,包含模型默认值、语言和 Gateway 网关主机统计信息;其他每项设置都只位于一个页面。
    • 隐私与安全:在基于架构的 security/approvals 部分上方,为 Gateway 网关身份验证、Exec 策略、浏览器启用状态、工具配置文件、设备身份验证和移动端配对提供精选设置行。
    • “审批”包含按时间从新到旧排列、保留 30 天的已解决 Exec、插件和系统智能体请求历史记录。可按类型筛选或翻阅更早的记录,以查看 Gateway 网关所记录的决定、原因、来源会话和处理者归属信息。
    • “实验室”提供已发布的实验性开关。代码模式和 Swarm 是当前条目,并会立即保存 tools.codeMode.enabledtools.swarm.enabled;尚未发布的实验不会显示,也不会写入推测性的配置键。
    • 通知:浏览器网页推送状态、订阅/取消订阅,以及测试发送。
    • 高级:包括没有专属精选页面的所有配置部分,以及原始 JSON5 编辑器(此前位于“常规”页面的“高级”模式)。
    • 模型设置(/settings/model-setup)是“模型提供商”的子页面,可从其页眉启动。
    • 智能体:一个设置页面(设置 → 智能体/settings/agents),包含按智能体划分的选项卡(概览、文件、工具、Skills、渠道、自动化、记忆)。“概览”选项卡可编辑智能体身份——显示名称、表情符号和头像图片;浏览器会在 agents.update 之前缩小图片并限制其大小。保存操作会存储已配置的身份字段,并将其同步到工作区 IDENTITY.md;对于同一文件字段,配置值优先于手动编辑。
    • 个人资料:一个设置页面,显示默认智能体的身份和全部历史用量统计信息——生命周期令牌数、峰值日期、最长会话、连续活跃记录、全年令牌热力图、最常用工具和渠道亮点(usage.costsessions.usage)。
    • MCP 有专属设置页面,其中包含服务器行(传输方式、启用状态、OAuth/筛选器/并行摘要)、直接添加/启用/禁用/移除控件、常用运维命令,以及限定范围的 mcp 配置编辑器。“插件”页面仍是一键式连接器和设备发现的入口。
    • 模型提供商:一个设置页面,列出每个已配置的模型提供商及其品牌图标、身份验证状态(models.authStatus)、模型可用性(models.list)、提供商所报告的实时套餐/配额/账单数据(usage.status),以及过去 30 天的本地会话支出(sessions.usage)。“刷新”操作会重新读取凭据状态和提供商用量。
    • 连接:位于连接下的设置页面,用于管理仪表板自身的 Gateway 网关连接——WebSocket URL、Gateway 网关令牌、密码和默认会话键,以及最新的握手快照(状态、运行时间、时钟周期、上次渠道刷新时间)。离线登录入口处理断开连接的情况;此页面用于在已连接时编辑连接。
    • 经过验证后应用并重启(config.apply),然后唤醒最近活跃的会话。
    • 写入包含基础哈希保护,以防覆盖并发编辑。
    • 写入操作(config.set/config.apply/config.patch)会预检已提交配置载荷中引用的活跃 SecretRef 解析情况;无法解析的已提交活跃引用会在写入前被拒绝。
    • 保存表单时,会丢弃无法从已保存配置中恢复的过期脱敏占位符,同时保留仍映射到已保存密钥的脱敏值。
    • 架构和表单渲染来自 config.schema / config.schema.lookup,包括字段 title/description、匹配的 UI 提示、直接子项摘要、嵌套对象/通配符/数组/组合节点上的文档元数据,以及可用时的插件和渠道架构。仅当快照能够安全地进行原始内容往返转换时,原始 JSON 编辑器才可用;否则 Control UI 会强制使用“表单”模式。
    • 原始 JSON 编辑器中的“重置为已保存内容”会保留原始编写形态(格式、注释、$include 布局),而不是重新渲染扁平化快照,因此当快照能够安全往返转换时,外部编辑可在重置后保留。
    • 结构化 SecretRef 对象值在表单文本输入框中以只读方式呈现,以防对象意外损坏为字符串。
    用量
    • 从会话派生的令牌和预估成本分析与提供商账单保持分离。
    • 提供商卡片调用 usage.status,并显示已配置提供商插件所报告的实时套餐名称、配额周期、余额、支出和预算。
    • 提供商用量获取失败不会阻止会话/成本仪表板;不可用的提供商卡片会显示各自的错误状态。
    调试、日志、更新
    • 调试:状态/健康/模型快照、事件日志和手动 RPC 调用(statushealthmodels.list)。
    • 当浏览器提供相应 PerformanceObserver 条目类型时,事件日志会包含 Control UI 刷新/RPC 耗时、缓慢的聊天/配置渲染耗时,以及针对长动画帧或长任务的浏览器响应性条目。
    • 日志:实时跟踪 Gateway 网关文件日志,并支持筛选/导出(logs.tail)。
    • 更新:执行软件包/git 更新并重启(update.run),同时提供重启报告;重新连接后轮询 update.status,以验证正在运行的 Gateway 网关版本。
    自动化面板说明
    • 选择一行会打开全页详情视图,页眉中包含“活跃/已暂停”开关和“立即运行”(菜单中包含到期时运行、克隆和移除);“设置”选项卡以内联方式编辑自动化(提示词、详细信息、频率、高级覆盖项),“运行历史”选项卡显示该自动化的运行记录。
    • 表格下方的入门自动化会使用可编辑的提示词和计划预填创建表单。
    • 对于隔离任务,交付方式默认为公告摘要;仅限内部运行时可切换为无。
    • 选择公告时,会显示渠道/目标字段。
    • Webhook 模式使用 delivery.mode = "webhook",并将 delivery.to 设置为有效的 HTTP(S) Webhook URL。
    • 对于主会话任务,可以使用 Webhook 和无交付模式。
    • 高级编辑控件包括运行后删除、清除智能体覆盖项、cron 精确/错峰选项、智能体模型/思考覆盖项,以及尽力交付开关。
    • 表单验证以内联方式显示字段级错误;修复无效值之前,保存按钮处于禁用状态。
    • 设置 cron.webhookToken 可发送专用不记名令牌;如果省略,则发送 Webhook 时不包含身份验证标头。
    • cron.webhook 是已弃用的旧版后备项,当前配置验证会拒绝它。运行 openclaw doctor --fix,将仍使用 notify: true 的已存储任务迁移到显式的逐任务 Webhook 或完成交付,并移除旧键。

    导入助手记忆

    打开 设置导入记忆,将本地 Codex 或 Claude Code 记忆 导入 OpenClaw 智能体。Gateway 网关会自行发现其所在 主机上受支持的本地记忆,因此远程 Control UI 会从 Gateway 网关计算机导入,而不是从 浏览器计算机导入。

    1. 选择目标智能体。
    2. 检查检测到的来源集合和 Markdown 文件名。文件内容 不会在计划响应中发送,也不会显示在页面上。
    3. 选择要导入的集合并确认。应用操作会在 写入前重新构建计划,使过期选择安全地失败。
    4. 如果文件已存在,请启用 替换现有导入内容,刷新 预览并确认替换。

    Codex 仅导入其整合后的 MEMORY.mdmemory_summary.md。Claude Code 从项目自动记忆目录和已配置的 autoMemoryDirectory 导入 Markdown;它不会通过此页面导入会话、设置、指令或 凭据。文件会复制到所选工作区的 memory/imports/ 下, 活跃的记忆插件可在此处为其建立索引。来源永远不会被更改。

    规划和应用需要 operator.admin。存在状态时,每次应用都会创建经过验证的 OpenClaw 备份,写入脱敏的迁移报告,并在替换现有目标文件前保留 项目级备份。有关路径和 回忆行为,请参阅记忆概览

    MCP 页面

    专用 MCP 页面是用于查看 mcp.servers 下由 OpenClaw 管理的 MCP 服务器的运维界面。它本身不会启动 MCP 传输;可用它检查和编辑已保存的配置,在需要实时服务器验证时再使用 openclaw mcp doctor --probe

    典型工作流:

    1. 从侧边栏打开 MCP
    2. 查看摘要卡片中的服务器总数、已启用数量、OAuth 数量和已筛选数量。
    3. 检查每个服务器行中的传输方式、启用状态、身份验证、筛选器、超时和命令提示。
    4. 直接在 MCP 页面上添加、启用、禁用或移除服务器。明确选择 Streamable HTTP、SSE 或 stdio;stdio 命令行接受带引号的参数,例如包含空格的路径。使用插件页面进行一键连接和发现。
    5. 编辑作用域内的 mcp 配置部分,以设置环境变量、工作目录、标头、TLS/mTLS 路径、OAuth 元数据、工具筛选器和 Codex 投影元数据等高级服务器字段。
    6. 使用 Save 写入配置;如果要让正在运行的 Gateway 网关应用已更改的配置,请使用 Save & Publish
    7. 在终端中运行 openclaw mcp status --verboseopenclaw mcp doctor --probeopenclaw mcp reload,分别执行静态诊断、实时验证或清除缓存的运行时。

    该页面会在渲染前隐去包含凭据的 URL 类值,并在命令片段中用引号括起服务器名称,因此复制的命令即使包含空格或 shell 元字符也仍能正常运行。完整的 CLI 和配置参考:MCP

    活动选项卡

    活动选项卡位于设置 › 系统中,紧邻 Logs 和 Debug。它是一个临时的浏览器本地观察器,用于查看实时工具活动,其数据来自为聊天工具卡片提供支持的同一 Gateway 网关 session.tool / 工具事件流。它不会添加其他 Gateway 网关事件系列、端点、持久活动存储、指标源或外部观察器流。

    活动条目仅保留经过清理的摘要和经过隐去、截断的输出预览。工具参数值不会存储在活动状态中;UI 会显示参数已隐藏,并且仅记录参数字段数量。内存中的列表与当前浏览器选项卡保持一致,在 Control UI 内导航时会保留,并在页面重新加载、切换会话或点击 Clear 时重置。

    操作员终端

    可停靠的操作员终端默认禁用。要启用它,请设置 gateway.terminal.enabled: true 并重启 Gateway 网关。该终端需要 operator.admin 连接,并在活动 Agent 工作区中打开主机 PTY。新选项卡会跟随当前选定的聊天智能体。

    使用 Ctrl + backtick 切换停靠面板。布局支持停靠在底部或右侧,可随浏览器视口调整大小,并保留多个 shell 选项卡。有关 gateway.terminal.enabled 和可选的 gateway.terminal.shell 覆盖设置,请参阅 Gateway 配置

    经所有者授权且不受沙箱隔离的智能体可以使用 terminal 工具执行需要操作员观察的长时间或交互式工作。每次工具调用都可以打开、读取、写入、调整大小、关闭或列出该智能体自己的 Gateway 网关 PTY。新会话默认会打开一个共同连接的 Control UI 选项卡,使智能体和操作员共享输出,双方都可以输入或调整大小。智能体访问权限严格限定于具体会话:智能体无法读取或控制由操作员创建的终端,也无法读取或控制由其他智能体会话打开的终端。

    将一个或多个文件拖到活动终端上,或使用回形针按钮选择文件。OpenClaw 会将每个文件暂存到 PTY 所在的机器上,并在光标处粘贴经过 shell 引号处理的绝对路径;它绝不会按 Enter 或执行输入。紧凑的批次指示器会显示当前文件和已完成数量。取消操作会停止批次中的剩余文件而不粘贴路径;传输失败的文件会保持可见,因此可以从该文件处重试,而无需重新上传已完成的文件。支持图片、PDF、压缩包及其他文件类型,每个文件最大 16 MiB。在 POSIX 主机上,暂存文件使用私有的系统临时目录(目录模式为 0700,文件模式为 0600);在 Windows 上,则使用用户配置文件 ACL 边界内的目录,并设置 24 小时清理计时器,因此需要保留的内容应移动或复制到其他位置。

    路径插入支持 PowerShell、cmd.exe 以及可识别的 POSIX shell(sh、Bash、Dash、Ash、Ksh、Zsh 和 Fish),包括 Windows 上的 Git Bash。系统会拒绝其他 shell 覆盖设置,因为无法安全推断其引号规则;要获得原生 WSL 终端和 Linux 上传路径,请在 WSL 内运行 Gateway 网关。包含 %!cmd.exe 路径也会被拒绝,因为该 shell 即使在双引号内也会展开这些字符。

    在会话侧边栏中发现的 Codex 和 Claude Code 会话可以在同一终端面板内通过其原生 CLI 打开。在设置 › 聊天中,将 Open Codex/Claude threads in 设置为 Terminal,即可在正常点击行时打开 codex resumeclaude --resume;默认仍使用只读的 OpenClaw 查看器。行的右键菜单或三点菜单始终提供这两个选项;会话符合条件时,查看器标题栏中也会包含 Open in terminal

    资格按会话和主机分别确定。Gateway 网关本地会话会在 Gateway 网关主机上启动由提供商所有的恢复命令。已配对节点会在所属节点上启动允许列表中的提供商命令,并且仅中继该 PTY 的输出、输入和调整大小事件;这不会暴露通用节点 shell,也不会接受浏览器提供的命令。文件上传使用独立且有大小限制的 terminal.upload 节点命令,并始终绑定到已打开的终端会话。该命令首次出现时,请批准节点配对升级。未声明匹配终端恢复命令的节点(包括不支持双工流式传输的嵌入式工作节点桥接器)仍可使用查看器,但会显示终端打开功能不可用;旧版节点仍可运行终端,但无法接收拖入的文件。

    连接所有的会话可在断开连接后继续存活:页面重新加载、笔记本电脑休眠或短暂网络中断时,会话会在 Gateway 网关上分离,而不是被终止;重新连接后,同一浏览器选项卡会重新连接该会话并重放最近的输出。分离的连接所有会话会在 gateway.terminal.detachedSessionTimeoutSeconds 后被终止(默认 300 秒;0 可恢复为断开连接即终止)。连接到这类会话时,仍采用类似 tmux 的接管方式。

    智能体所有的会话不绑定到浏览器连接。terminal.attach 会将每个浏览器添加为查看器,而不会取得所有权;关闭查看器选项卡只会分离该浏览器。PTY 会持续运行,直到所属智能体将其关闭、其进程退出、策略将其禁用或 Gateway 网关关闭。terminal.list 会将每个条目标记为连接所有或智能体所有;terminal.text 允许管理员连接在不附加会话的情况下读取最近的纯文本输出。

    该终端还可通过 /?view=terminal 作为全屏、仅终端的文档使用。iOS 和 Android 应用会在其终端屏幕中嵌入此页面,并复用已存储的 Gateway 网关凭据;可用性遵循相同的 gateway.terminal.enabledoperator.admin 门控条件;当连接的 Gateway 网关不提供终端时,该页面会显示通知。

    浏览器面板

    Control UI 提供可停靠的浏览器面板,可在任何常规 Web 浏览器中渲染由 Gateway 网关控制的浏览器(即智能体通过浏览器控制工具驱动的同一个浏览器),无需原生 WebView。当连接的 Gateway 网关向 operator.admin 连接声明 browser.request 时,该面板便会显示;会话工作区栏中的地球按钮可切换其显示状态。该面板显示实时页面快照,并提供选项卡、可编辑的 URL 栏、后退/前进/重新加载和在你的浏览器中打开功能;它可以停靠在右侧或底部,并将点击、滚轮滚动和基本键盘输入转发到远程页面。

    两种捕获模式可为智能体打包页面上下文:

    • 标注(铅笔):在页面上自由绘制标记。点击 Send to chat 会将笔迹合成到屏幕截图中,把图片附加到当前聊天编辑器,并预填一段提示词,其中描述页面 URL、标题和每个标记区域,使智能体准确了解你圈出的内容。
    • 检查(指针):悬停时查看光标下的元素(选择器、无障碍名称、角色、大小);点击后,通过相同的编辑器流程发送该元素的详细信息及高亮屏幕截图。检查、滚轮滚动以及后退/前进功能需要 browser.evaluateEnabled(默认启用)。

    macOS 应用会保留其原生链接浏览器侧边栏,用于打开在仪表板中点击的链接;浏览器面板也可在其中使用,并且是在其他所有平台上标注页面的方式。

    聊天行为

    Send and history semantics
    • chat.send非阻塞式的:它会立即使用 { runId, status: "started" } 确认,响应则通过 chat 事件流式传输。受信任的 Control UI 客户端还可能收到可选的 ACK 计时元数据,用于本地诊断。
    • 聊天上传支持图片和非视频文件。图片保留原生图片路径;其他文件存储为托管媒体,并在历史记录中显示为附件链接。
    • 运行期间使用相同的 idempotencyKey 重新发送会返回 { status: "in_flight" },完成后则返回 { status: "ok" }
    • 为确保 UI 安全,chat.history 响应有大小限制。当记录条目过大时,Gateway 网关可能会截断较长的文本字段、省略较大的元数据块,并使用占位符替换超大消息([chat.history omitted: message too large])。
    • chat.history 中可见的助手消息被截断时,侧边阅读器可以按需通过 chat.message.get 获取完整的显示规范化记录条目,所需参数包括 sessionKey、必要时的活动 agentId,以及记录 messageId。如果 Gateway 网关仍无法返回更多内容,阅读器会显示明确的不可用状态,而不是静默重复已截断的预览。
    • 助手生成的图片会持久化为托管媒体引用,并通过经过身份验证的 Gateway 网关媒体 URL 返回,因此重新加载不依赖原始 base64 图片载荷一直保留在聊天历史响应中。
    • 渲染 chat.history 时,Control UI 会从可见的助手文本中移除仅用于显示的内联指令标签(例如 [[reply_to_*]][[audio_as_voice]])、纯文本工具调用 XML 载荷(包括 <tool_call>...</tool_call><function_call>...</function_call><tool_calls>...</tool_calls><function_calls>...</function_calls> 以及被截断的工具调用块),以及泄漏的 ASCII/全角模型控制令牌。如果助手条目的全部可见文本仅为精确的静默令牌 NO_REPLY / no_reply 或 Heartbeat 确认令牌 HEARTBEAT_OK,则会省略该条目。
    • 在发送进行期间以及最终刷新历史记录时,如果 chat.history 短暂返回较旧的快照,聊天视图会继续显示本地乐观更新的用户/助手消息;Gateway 网关历史记录跟进后,规范记录会替换这些本地消息。
    • 实时 chat 事件表示传递状态,而 chat.history 则根据持久会话记录重建。工具结束事件发生后,Control UI 会重新加载历史记录,并且只合并一小段乐观更新的尾部内容;记录边界详见 WebChat
    • chat.inject 会向会话记录追加一条助手备注,并广播 chat 事件以仅更新 UI(不运行智能体,也不向渠道传递)。
    • 侧边栏按智能体分区以及置顶/渠道/工作/自定义/聊天分组列出所有已加载的活动会话,并提供一个统一的新建会话操作来打开草稿对话框。打开可见行只会移动高亮。可以将会话拖放到“置顶”以将其置顶,也可以拖放到自定义分组或“聊天”以移动会话;自定义分组支持折叠和拖动重新排序,分组名称和顺序通过 Gateway 网关同步,折叠状态则保存在浏览器中。新的仪表板会话会根据其第一条非命令消息异步生成简短标题;显式名称和经过身份验证的发送者身份保持分离,因此账户名称绝不会用作生成的标题。设置 agents.defaults.utilityModel(或 agents.entries.*.utilityModel)可将这次独立的模型调用路由到成本较低的模型;如果该独立模型失败,标题生成会使用主模型重试一次。展开另一个智能体分区即可浏览该智能体的会话,而无需离开当前打开的聊天。
    • 线程搜索位于命令面板中(⌘K,或左上角控制区中的搜索按钮):输入查询后,会在各智能体间查找数量有限的匹配页面,过滤内部子项/定时任务行,并在导航命令旁列出可见的匹配项。线程页面保留包含筛选功能的完整可搜索列表。
    • 每个侧边栏行都保留直接置顶入口,以及用于未读状态、重命名、分叉、分组、归档和删除的完整上下文菜单。多选行(Cmd/Ctrl 单击,Shift 单击选择范围)会显示批量菜单,其中包含未读状态、分组、归档和删除;除非所有选中的会话均可归档,否则批量归档/删除将保持禁用。正在运行的会话和智能体的主会话无法归档。归档或删除当前选中的会话后,聊天会切换回该智能体的主会话。
    • 在 macOS 应用中,OpenClaw 标志会使用窗口控件旁原本为空的原生标题栏区域,而不会占用侧边栏中的一行。
    • 在桌面宽度下,聊天控件保持在一个紧凑行中,并在沿记录向下滚动时收起;向上滚动、返回顶部或到达底部时,控件会恢复显示。
    • 当其他人正在查看同一会话时,会话标题会在工作区标签旁显示一个小型头像组;最多显示四个查看者头像和溢出数量,只有你一人时则会消失。
    • 连续重复的纯文本消息会渲染为一个带数量徽标的气泡。包含图片、附件、工具输出或 Canvas 预览的消息不会折叠。
    • 用户消息气泡包含记录操作:悬停时显示回退按钮(确认弹出框包含“Don't ask again”选项),右键菜单则包含回退到此处从此处分叉。回退会将会话重新指向该消息之前的状态,并将消息文本放回编辑器,以便编辑并重新发送(sessions.rewindoperator.admin);分叉会根据该消息之前活动路径的前缀创建新会话,打开该会话,并在其编辑器中填入相同文本(sessions.forkoperator.write)。智能体工作期间,这两个操作都会被禁用并显示说明性工具提示;它们仅适用于已持久化的用户消息,并且会对对话由外部 agent harness 所有的会话拒绝执行。回退只会移动聊天上下文,不会还原文件及其他工具副作用;回退前的记录仍保留在仅追加的会话存储中。当该存储包含多个记录分支时,聊天标题栏会显示分支菜单,其中包含每个分支的最新消息、消息数量和新近程度;选择非活动分支会将当前会话切换回该保留路径(sessions.branches.listoperator.readsessions.branches.switchoperator.admin)。智能体工作期间同样无法切换分支,而选择已处于活动状态的分支会在 RPC 边界产生一个类型化的空操作错误。用户气泡上的独立隐藏操作只会在当前浏览器中隐藏消息;消息仍保留在记录中,智能体也仍能看到它。
    • 当会话的检出目录位于 GitHub 仓库的非默认分支时,聊天视图会在编辑器上方固定显示拉取请求标签:PR 编号、仓库、分支、差异计数、CI 状态标签以及草稿/已合并/已关闭状态,每项都链接到该 PR。该行最多显示两个标签,并优先显示实时(打开/草稿)PR;“Show more”按钮会展开已折叠的已合并/已关闭历史记录。CI 状态标签会打开一个小型 CI 监控弹出框,其中包含通过/失败/运行中/已跳过检查的数量以及指向 PR 检查页面的链接。检测在服务器端通过 controlUi.sessionPullRequests 运行,并在已设置时复用 Gateway 网关的 GH_TOKEN/GITHUB_TOKEN。达到 GitHub API 速率限制时,标签会保留最后已知状态,并显示状态可能已过期的警告;关闭某个标签后,该标签会在当前浏览器配置文件中对此会话隐藏。在任何 PR 存在之前,该行会显示分支本身——仓库、分支名称,以及相对于默认分支合并基点的差异 +/− 大小(包括已提交和未提交的工作)。推送的分支有可供比较的提交后,该行会添加 Create PR 按钮,用于打开 GitHub 的新建拉取请求页面;在此之前,只要会话存在已更改文件(已提交、未提交或未跟踪),仍会显示该行,但不显示按钮。存在打开或草稿 PR 时,该行会自动隐藏。分支行仅来自本地 git,因此在 GitHub 受到速率限制时仍然可用,并会显示相同的状态过期警告,因为在限制重置之前,无法相信“未找到 PR”的结果。
    • 会话差异面板显示会话检出目录实际发生的更改:工作区侧栏或聊天标题栏中的分支按钮会打开详情面板,其中按文件显示分支、未提交和未跟踪工作相对于检出目录默认分支合并基点的差异——包括状态点、重命名箭头、每个文件的 +/− 计数、可折叠文件,以及差异块之间的“N 行未修改”标记。差异通过 sessions.diff Gateway 网关方法(operator.read 权限范围)在服务器端计算;二进制文件和超大文件会降级为仅显示统计信息的条目,并且仅当所连接的 Gateway 网关声明支持 sessions.diff 时才会显示该按钮。
    • 每个聊天窗格都有标题栏。单击会话标题可将其重命名;工作区标签可复制检出路径或分支,还可在主机文件管理器中显示本地 Gateway 网关工作区。远程会话和执行节点会话保留复制操作,但隐藏显示操作。
    • 每个聊天窗格中的线程工作区侧栏会列出线程文件、项目文件和工件。默认停靠在窗格右侧;拖动其标题(或使用停靠按钮)可将其移动到底部,所选位置会存储在当前浏览器配置文件中。折叠后的侧栏完全不占空间:使用 ⇧⌘B 或标题栏中的文件开关重新打开,文件开关会显示已更改文件数量徽标。独立的文件、工具和 Canvas 详情面板不受影响。
    • 单击聊天中的文件引用、展开的读取/编辑/写入工具卡片中的文件路径,或工作区侧栏中的文件行,会打开文件详情面板:这是一个基于 CodeMirror 的代码视图,支持语法高亮、行号、跳转到行、文件内搜索、复制操作和在外部编辑器中打开的菜单。当 Gateway 网关向 operator.admin 连接声明 sessions.files.set 时,面板会添加编辑模式,支持脏状态跟踪和使用 Cmd/Ctrl-S 保存;未保存的草稿可在当前浏览器标签页中跨文件、面板和会话导航保留,直至被明确保存或丢弃。保存操作会根据 sessions.files.get 返回的内容哈希执行比较并交换:如果文件自加载后已在磁盘上发生更改(例如智能体仍在继续工作),面板会显示冲突通知,并提供 Reload(采用最新内容)和 Overwrite(保留本地编辑)操作。写入操作与读取操作使用相同的 fs-safe 工作区防护措施——路径包含检查、拒绝符号链接/硬链接,以及 256 KB UTF-8 上限——并且只能覆盖现有文件;编辑器绝不会创建或删除文件。
    • 每个聊天窗格中的后台任务侧栏会列出当前智能体的后台任务和子智能体(tasks.list 按智能体限定范围,并由 task 事件保持实时更新):运行中的工作会显示实时已用时间计时器、工具使用次数、当前使用的工具和停止控件;可折叠的已完成部分会额外显示运行时长;“查看记录”链接会在窗格中打开任务的子会话。使用标题栏中的活动开关打开该侧栏;任务快照会立即加载,因此无需先打开侧栏即可显示运行中任务数量徽标。任务页面仍保留完整的跨智能体任务台账。
    • 工作区栏、后台任务栏和详情面板会根据各窗格自身的宽度而非窗口宽度进行调整:在较窄的窗格或紧凑窗口中,两个栏都会显示为底部条带(侧边停靠控件会隐藏,直到窗格变宽;当空间仅容纳一列时,工作区栏优先占用侧边位置),详情面板则堆叠在线程下方,并使用水平调整大小手柄,而不是与线程共享同一行。手机尺寸的视口仍会以全屏方式打开详情面板。
    • 聊天标题栏中的模型和思考选择器会通过 sessions.patch 立即修补当前会话;它们是持久的会话覆盖设置,而非仅对单轮发送有效的选项。
    • **拆分视图:**从聊天标题栏打开它(位于线程差异、后台任务和线程文件切换按钮旁),然后将当前窗格向右或向下拆分,直到容纳尽可能多的窗格。每个窗格都有自己的线程、对话记录、编辑器和工具流。
    • 当支持相应功能的 Control UI 已连接时,拥有 screen 工具的智能体可以请求执行相同的窗格、侧边栏、终端、浏览器、焦点和导航变更。协议 v1 会将命令应用于所有已连接且支持相应功能的 Control UI;参见屏幕
    • 将会话从侧边栏拖入聊天区域,即可在窗格中打开它。动画放置预览会在各区域之间平滑移动并标示结果——在新窗格将占据的确切一半区域上显示“拆分”,在整个窗格上显示“在此处打开”——并且单窗格模式也支持放置。
    • 当前拆分窗格决定侧边栏选中项和 URL。其标题栏会添加拆分和关闭控件;分隔条可调整列和堆叠窗格的大小,浏览器会在本地存储布局,使其在重新加载后仍然保留。
    • 在窄屏幕上,拆分视图会保留布局,但只渲染当前窗格,包括带关闭控件的标题栏。
    • 如果在同一会话的模型选择器变更仍在保存时发送消息,编辑器会等待该会话修补完成,再调用 chat.send,以确保发送时使用所选模型。
    • 输入 /new 会创建并切换到与“新建聊天”相同的全新仪表板会话,但有一种例外:当已配置 session.dmScope: "main",且当前父会话是智能体的主会话时,它会就地重置主会话。输入 /reset 则会保留 Gateway 网关对当前会话的显式就地重置行为。
    • 聊天模型选择器会请求 Gateway 网关已配置的模型视图。如果 agents.defaults.modelPolicy.allow 非空,该策略会决定选择器内容,其中包括让提供商级目录保持动态的 provider/* 条目。否则,选择器会显示已配置的条目以及拥有可用身份验证的提供商;agents.defaults.models 下的别名和设置不会对其构成限制。完整目录仍可通过调试用 models.list RPC 搭配 view: "all" 获取。
    • 当 Gateway 网关最新的会话用量报告包含当前上下文 token 数时,聊天编辑器工具栏会显示一个小型上下文用量环,指示已用百分比。打开该环可查看当前上下文窗口、最近一次运行的 token 数及估算总成本、提供商/模型标识,以及最新提供商响应所报告的输入、输出和缓存成本明细。上下文压力较高时,该环会切换为警告样式;达到建议的压缩级别时,还会显示一个紧凑按钮,用于运行常规会话压缩流程。在 Gateway 网关再次报告最新用量之前,过期的 token 快照会保持隐藏。
    Talk 模式(浏览器实时)

    Talk 模式使用已注册的实时语音提供商。配置 OpenAI 时需使用 talk.realtime.provider: "openai" 以及 openai API 密钥配置文件、talk.realtime.providers.openai.apiKeyOPENAI_API_KEY。OpenAI Realtime 使用公共 Platform API,并且需要 Platform API 密钥;Codex OAuth 登录无法满足此接口的要求。配置 Google 时需使用 talk.realtime.provider: "google" 以及 talk.realtime.providers.google.apiKey。浏览器绝不会收到标准的提供商 API 密钥:OpenAI 会收到用于 WebRTC 的临时 Realtime 客户端密钥,而 Google Live 会收到用于浏览器 WebSocket 会话的一次性受限 Live API 身份验证令牌,其中的指令和工具声明由 Gateway 网关锁定到令牌中。仅提供后端实时桥接的提供商通过 Gateway 网关中继传输运行,因此凭据和供应商套接字始终保留在服务器端,而浏览器音频则通过经过身份验证的 Gateway RPC 传输。Realtime 会话提示词由 Gateway 网关组装;talk.client.create 不接受调用方提供的指令覆盖。

    持久化的提供商、模型、语音、传输方式、推理强度、精确 VAD 阈值、静默时长和前缀填充默认值位于 Settings → Communications → Talk;更改这些设置需要 operator.admin 访问权限。配置 Gateway 网关中继会强制使用后端中继路径;配置 WebRTC 则会让会话由客户端负责,并且当提供商无法创建浏览器会话时直接失败,而不会静默回退到中继。

    Talk 控件本身是输入框工具栏中的麦克风按钮。其插入符菜单会列出 System default 以及浏览器公开的所有麦克风,包括 USB、Bluetooth 和虚拟输入设备。所选设备 ID 仅保存在浏览器本地,绝不会发送到 Gateway 网关;如果该确切设备消失,Talk 会要求你选择另一个输入设备,而不会静默改用其他麦克风录音。Talk 运行时,麦克风按钮会变为一个显示实时输入电平计的胶囊按钮;单击它会停止语音输入,悬停时则会显示停止图标。当实时工具调用正通过 talk.client.toolCall 咨询已配置的更大模型时,屏幕阅读器会播报 Connecting voice input...Listening...Asking OpenClaw...。停止正在运行的智能体响应仍需使用胶囊按钮旁边单独的方形 Stop 控件。

    OpenAI Realtime WebRTC 和 Google Live 浏览器会话支持 视频 Talk。单击摄像头按钮,允许访问摄像头和麦克风,然后确认本地预览。当 describe_view 请求视觉上下文时,OpenAI 会通过其浏览器数据通道发送一帧有大小限制的 JPEG 图像。Google Live 以其支持的最高每秒一帧速率,直接从浏览器向提供商发送有大小限制的 JPEG 图像帧,并使用摄像头流状态响应 describe_view 函数调用。摄像头帧绝不会经过 Gateway 网关。停止 Talk 会关闭预览并释放两条媒体轨道。有关提供商的线路协议,请参阅 Google 的 Live API 功能函数调用指南

    维护者实时冒烟测试:OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts 会验证 OpenAI 后端 WebSocket 桥接、OpenAI 浏览器 WebRTC SDP 交换、包含一帧 JPEG 图像和 describe_view 函数往返的 Google Live 受限令牌浏览器设置,以及使用模拟麦克风媒体的 Gateway 网关中继浏览器适配器。该命令仅输出提供商状态,不会记录机密信息。

    停止和中止
    • 单击 Stop。具有确切本地运行 ID 的运行会调用 chat.abort;当所选会话状态报告存在活动任务,但 Control UI 没有本地运行 ID 时,则会改为调用 sessions.abort。对于非全局会话,该所选会话路径还会丢弃排队的后续消息,使其无法在停止后重新启动任务。
    • 运行处于活动状态时,普通后续消息使用 Gateway 网关的有效 messages.queue 模式。steer 会将消息注入正在运行的轮次;其他模式则保留浏览器的持久排队投递。Steering 被拒绝时也会回退到该队列。单击排队消息上的 Steer 可手动注入消息。
    • Settings → Appearance → Chat → Follow-ups while the agent is working 可针对当前浏览器覆盖该服务器默认设置。页面会明确标记覆盖设置,并提供 Reset to server defaultSteer into the active run 会立即发送后续消息,而 Queue until the run ends 会将其保留到运行结束。
    • 输入 /stop(或 stopstop actionstop runstop openclawplease stop 等独立的中止短语)可带外中止运行。
    • chat.abort 支持使用 { sessionKey }(不带 runId)中止该会话的所有活动运行。当没有本地运行 ID 时,Control UI 使用 sessions.abort
    保留中止时的部分内容
    • 运行中止后,部分智能体文本仍可显示在 UI 中。
    • 存在缓冲输出时,Gateway 网关会将中止时的部分智能体文本持久化到对话记录历史中。
    • 持久化条目包含中止元数据,以便对话记录使用方区分中止时的部分内容与正常完成输出。

    连接丢失和重新连接

    会话建立后,Gateway 网关连接断开不会让你退出登录。客户端使用退避策略(从 800 ms 到最多 15 s)自动重试时,控制面板会保持可见,并在顶部栏下方显示一个悬浮的琥珀色“Gateway connection lost — Reconnecting…”胶囊提示。连接恢复前,实时更新以及实时/会话操作会暂停;胶囊提示中的 Retry now 会强制立即尝试重新连接。聊天内容仍可编辑:普通文本和附件发送会保存在当前标签页按 Gateway 网关/会话限定范围的浏览器存储中,显示为等待重新连接,并在 Gateway 网关恢复后自动发送。离线期间,实时控件和斜杠命令仍不可用,但 Stop 可以将确切的本地运行 ID 加入队列以便重放。仅针对会话的停止操作不会重放,因为连接恢复前该会话中可能已经启动了较新的任务。

    当此浏览器已持有凭据(配置的令牌/密码或已批准的设备令牌)时,首次打开和重新加载会在建立连接期间显示一个小型动态 OpenClaw 标记,而不会短暂闪现登录关卡。仅当尚未存储任何凭据,或 Gateway 网关主动拒绝凭据(令牌/密码错误、配对已撤销)时,登录关卡才会出现——这些状态需要你的输入,而不是等待即可解决。

    PWA 安装和 Web Push

    Control UI 随附 manifest.webmanifest 和一个 Service Worker,因此现代浏览器可以将其安装为独立 PWA。即使标签页或浏览器窗口未打开,Web Push 也允许 Gateway 网关通过通知唤醒已安装的 PWA。

    在 macOS 应用内,通知设置页面显示应用的原生通知权限,而不是浏览器推送权限,因为应用通过原生方式发送通知。

    如果 OpenClaw 更新后页面立即显示 Protocol mismatch,请先使用 openclaw dashboard 重新打开控制面板并强制刷新。如果仍然失败,请清除控制面板来源的站点数据,或在浏览器隐私窗口中测试;旧标签页或浏览器 Service Worker 缓存可能会继续运行更新前的 Control UI 软件包,并将其连接到较新的 Gateway 网关。

    接口 作用
    ui/public/manifest.webmanifest PWA 清单。可访问后,浏览器会提供“Install app”。
    ui/public/sw.js 处理 push 事件和通知单击操作的 Service Worker。
    state/openclaw.sqliteweb_push_vapid_keys 用于签署 Web Push 载荷的自动生成 VAPID 密钥对。
    state/openclaw.sqliteweb_push_subscriptions 持久化的浏览器订阅端点、密钥和注册时间戳。

    从已弃用的 push/vapid-keys.jsonpush/web-push-subscriptions.json 存储升级时,openclaw doctor --fix 会导入其中的数据。运行该修复前请停止 Gateway 网关,以免旧进程在导入期间重新创建已弃用的状态。升级后使用 Web Push 前请运行该修复;只要任一已弃用来源或中断的 Doctor 声明仍然存在,注册、投递、删除和密钥解析都会拒绝继续执行。Gateway 网关运行时仅对 SQLite 进行读写。

    如果需要固定密钥(多主机部署、机密轮换或测试),可通过 Gateway 网关进程的环境变量覆盖 VAPID 密钥对:

    • OPENCLAW_VAPID_PUBLIC_KEY
    • OPENCLAW_VAPID_PRIVATE_KEY
    • OPENCLAW_VAPID_SUBJECT(默认为 https://openclaw.ai

    Control UI 使用以下受权限范围限制的 Gateway 网关方法注册和测试浏览器订阅:

    • push.web.vapidPublicKey 获取活动的 VAPID 公钥。
    • push.web.subscribe 注册一个 endpoint 以及 keys.p256dh/keys.auth
    • push.web.unsubscribe 移除已注册的端点。
    • push.web.test 向调用方的订阅发送测试通知。

    托管式嵌入内容

    智能体消息可以使用 [embed ...] 短代码以内联方式呈现托管式 Web 内容。iframe 沙箱策略由 gateway.controlUi.embedSandbox 控制:

    核心 show_widget 工具直接通过工具调用呈现自包含的 SVG 或 HTML。浏览器和受支持的原生聊天客户端会公布 inline-widgets Gateway 网关能力,聊天历史重新加载后,生成的 Canvas 文档仍然可用。Discord Activities 在 Discord 上提供同名工具;来自其他渠道的运行不会获得该工具。

    strict

    禁止在托管式嵌入内容中执行脚本。

    scripts (default)

    在保持来源隔离的同时允许交互式嵌入内容;通常足以用于自包含的浏览器游戏/小组件。

    trusted

    allow-scripts 的基础上添加 allow-same-origin,适用于有意需要更高权限的同站点文档。

    json5
    {  gateway: {    controlUi: {      embedSandbox: "scripts",    },  },}

    默认情况下,绝对外部 http(s) 嵌入 URL 仍会被阻止。要允许 [embed url="https://..."] 加载第三方页面,请设置 gateway.controlUi.allowExternalEmbedUrls: true

    聊天对话记录布局

    聊天记录采用与编辑器对齐、居中且易于阅读的框架。在该框架内,助手和工具的输出保持左对齐,而你自己的消息保持右对齐。在多用户会话中(例如由渠道插件中继的群聊),来自其他已标明身份的参与者的消息会左对齐显示,并附带作者的头像、姓名以及每个身份对应的稳定颜色,因此只有已登录查看者的消息会被视为“我的消息”。当存在两名或更多已标明身份的参与者时,助手回复会带有一个小型“正在回复姓名”标记,指出触发该轮次的参与者。系统条目(例如本地斜杠命令输出)会呈现为不带头像的居中通知行。

    聊天消息宽度

    使用宽屏显示器时,可以在 设置 → 聊天 → 消息宽度 下覆盖聊天记录宽度。该偏好设置保存在相应浏览器的本地存储中。支持的 形式包括普通长度和百分比,例如 960px82%,以及 受约束的 min(...)max(...)clamp(...)calc(...)fit-content(...) 宽度表达式。

    Tailnet 访问(推荐)

    集成式 Tailscale Serve(首选)

    让 Gateway 网关保持监听回环地址,并由 Tailscale Serve 通过 HTTPS 代理:

    bash
    openclaw gateway --tailscale serve

    打开 https://<magicdns>/(或你配置的 gateway.controlUi.basePath)。

    默认情况下,当 gateway.auth.allowTailscaletrue 时,Control UI/WebSocket Serve 请求可以通过 Tailscale 身份标头(tailscale-user-login)进行身份验证。OpenClaw 会使用 tailscale whois 解析 x-forwarded-for 地址并将其与标头匹配,以验证身份;只有当请求通过回环地址到达且带有 Tailscale 的 x-forwarded-* 标头时,才会接受这些身份信息。对于具有浏览器设备身份的 Control UI 操作员会话,这条已验证的 Serve 路径也会跳过设备配对往返流程;无设备身份的浏览器和节点角色连接仍然遵循常规设备检查。如果希望即使对于 Serve 流量也要求显式共享密钥凭据,请设置 gateway.auth.allowTailscale: false,然后使用 gateway.auth.mode: "token""password"

    对于该异步 Serve 身份路径,在写入速率限制数据之前,会按相同客户端 IP 和身份验证范围串行处理失败的身份验证尝试。因此,来自同一浏览器的并发错误重试可能会使第二个请求显示 retry later,而不是让两个普通的不匹配结果并行竞争。

    绑定到 tailnet + 令牌

    bash
    openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"

    打开 http://<tailscale-ip>:18789/(或你配置的 gateway.controlUi.basePath)。

    将匹配的共享密钥粘贴到 UI 设置中(以 connect.params.auth.tokenconnect.params.auth.password 发送)。

    不安全的 HTTP

    如果通过普通 HTTP(http://<lan-ip>http://<tailscale-ip>)打开仪表板,浏览器将在非安全上下文中运行,并阻止 WebCrypto。默认情况下,OpenClaw 会阻止没有设备身份的 Control UI 连接。

    受支持的无设备身份例外是通过 gateway.auth.mode: "trusted-proxy" 成功完成操作员 Control UI 身份验证。不存在可禁用设备身份的持久化配置开关。

    **推荐修复方式:**使用 HTTPS(Tailscale Serve),或在本地通过 https://<magicdns>/(Serve)或 http://127.0.0.1:18789/(在 Gateway 网关主机上)打开 UI。

    可信代理说明
    • 成功的可信代理身份验证可以允许没有设备身份的操作员 Control UI 会话。
    • 适用于节点角色 Control UI 会话。
    • 同一主机上的回环反向代理仍不满足可信代理身份验证要求;请参阅可信代理身份验证

    有关 HTTPS 设置指南,请参阅 Tailscale

    内容安全策略

    Control UI 随附严格的 img-src 策略:仅允许同源资源、data: URL 和本地生成的 blob: URL。远程 http(s) 和协议相对图片 URL 会被浏览器拒绝,并且绝不会发起网络获取请求。

    实际行为如下:

    • 通过相对路径提供的头像和图片(例如 /avatars/<id>)仍可正常呈现,包括 UI 获取并转换为本地 blob: URL 的需身份验证头像路由。
    • 内联 data:image/... URL 仍可正常呈现。
    • 由 Control UI 创建的本地 blob: URL 仍可正常呈现。
    • GitHub 链接预览头像由 Gateway 网关从 GitHub 的固定头像主机获取,并以受限的 data: URL 返回;操作员浏览器绝不会联系远程头像主机。
    • 渠道元数据生成的远程头像 URL 会由 Control UI 的头像辅助程序移除,并替换为内置徽标/徽章,因此遭到入侵或恶意的渠道无法强制操作员浏览器获取任意远程图片。

    此功能始终启用且不可配置。

    头像路由身份验证

    配置 Gateway 网关身份验证后,Control UI 头像端点要求使用与 API 其余部分相同的 Gateway 网关令牌:

    • GET /avatar/<agentId> 仅向通过身份验证的调用方返回头像图片。GET /avatar/<agentId>?meta=1 按照相同规则返回头像元数据。
    • 对任一路由的未验证请求都会被拒绝(与同级助手媒体路由一致),因此在其他方面受保护的主机上,头像路由不会泄露智能体身份。
    • Control UI 获取头像时会将 Gateway 网关令牌作为 bearer 标头转发,并使用经过身份验证的 blob URL,使图片仍可在仪表板中呈现。

    如果禁用 Gateway 网关身份验证(不建议在共享主机上这样做),头像路由也会与 Gateway 网关其余部分一样变为无需身份验证。

    助手媒体路由身份验证

    配置 Gateway 网关身份验证后,助手本地媒体预览会使用两步路由:

    • GET /__openclaw__/assistant-media?meta=1&source=<path> 要求常规 Control UI 操作员身份验证;浏览器检查可用性时,会将 Gateway 网关令牌作为 bearer 标头发送。
    • 成功的元数据响应会包含一个短期有效的 mediaTicket,其作用域限定为该确切源路径。
    • 浏览器呈现的图片、音频、视频和文档 URL 使用 mediaTicket=<ticket>,而不是有效的 Gateway 网关令牌或密码。该凭据很快过期,且无法授权其他源。

    这样既能保持媒体呈现与浏览器原生媒体元素兼容,也不会将可重复使用的 Gateway 网关凭据放入可见的媒体 URL 中。

    审批链接

    操作员审批通知可以深层链接到保留的 ${controlUiBasePath}/approve/{approvalId} 命名空间下提供的独立审批文档(例如 /approve/<approvalId>,或配置了基础路径时的 /openclaw/approve/<approvalId>)。该 URL 在审批有效期内保持稳定,可以安全地在你自己的设备之间转发:它仅标识审批,绝不授予审批权限。

    • Gateway 网关会在插件 HTTP 路由之前,为所有 HTTP 方法保留单段式 /approve/<approvalId> 命名空间,因此插件路由绝不可能遮蔽或拦截审批文档。
    • 打开审批文档需要与 Control UI 其余部分相同的 Gateway 网关身份验证(令牌/密码、Tailscale Serve 身份或可信代理身份);凭据绝不会成为审批 URL 的一部分。
    • 禁用 Control UI 服务时,对该命名空间的请求会返回 404,而不会继续传递给插件处理程序。
    • 在审批文档上登录仅对该页面临时有效:它不会覆盖同一浏览器中完整 Control UI 保存的 Gateway 网关选择或设置。

    Gateway 网关从 dist/control-ui 提供静态文件:

    bash
    pnpm ui:build

    可选的绝对基础路径(固定资源 URL):

    bash
    OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build

    本地开发(独立开发服务器):

    bash
    pnpm ui:dev

    然后将 UI 指向你的 Gateway 网关 WS URL(例如 ws://127.0.0.1:18789)。

    Control UI 空白页面

    如果浏览器加载了空白仪表板,并且 DevTools 未显示有用的错误,则可能是某个扩展或提前运行的内容脚本阻止了 JavaScript 模块应用求值。静态页面包含一个纯 HTML 恢复面板,如果启动后 <openclaw-app> 未注册,该面板便会出现。

    更改浏览器环境后,使用面板中的 Try again 操作,或在完成以下检查后手动重新加载:

    • 禁用会向所有页面注入内容的扩展,尤其是带有 <all_urls> 内容脚本的扩展。
    • 尝试使用隐私窗口、干净的浏览器配置文件或其他浏览器。
    • 保持 Gateway 网关运行,并在更换浏览器后验证同一个仪表板 URL。

    调试/测试:开发服务器 + 远程 Gateway 网关

    Control UI 由静态文件组成;WebSocket 目标可配置,并且可以与 HTTP 来源不同。如果希望在本地运行 Vite 开发服务器,而 Gateway 网关运行在其他位置,这会很方便。

  • 启动 UI 开发服务器

    bash
    pnpm ui:dev
  • 使用 gatewayUrl 打开

    text
    http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789

    可选的一次性身份验证(如有需要):

    text
    http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
  • 说明
    • gatewayUrl 会在加载后存储到 localStorage 中,并从 URL 中移除。
    • 如果通过 gatewayUrl 传递完整的 ws://wss:// 端点,请对该值进行 URL 编码,以便浏览器正确解析查询字符串。
    • 只要可行,应通过 URL 片段(#token=...)传递 token。片段不会发送到服务器,从而避免请求日志和 Referer 泄露。为了兼容性,旧版 ?token= 查询参数仍会导入一次,但仅作为后备方案,并会在引导启动后立即移除。
    • password 仅保存在内存中。
    • 设置 gatewayUrl 后,UI 不会回退使用配置或环境凭据。请显式提供 token(或 password);缺少显式凭据属于错误。
    • 当 Gateway 网关位于 TLS 后方(Tailscale Serve、HTTPS 代理等)时,请使用 wss://
    • gatewayUrl 仅在顶层窗口中接受(不可嵌入),以防止点击劫持。
    • 公开的非回环 Control UI 部署必须显式设置 gateway.controlUi.allowedOrigins(完整来源)。从回环地址、RFC1918/链路本地地址、.local.ts.net 或 Tailscale CGNAT 主机加载的私有同源 LAN/Tailnet 请求,无需启用 Host 标头后备机制即可接受。
    • Gateway 网关启动时,可能会根据实际运行时绑定地址和端口填充 http://localhost:<port>http://127.0.0.1:<port> 等本地来源,但远程浏览器来源仍需显式配置。
    • 除非用于严格受控的本地测试,否则不要使用 gateway.controlUi.allowedOrigins: ["*"];它表示允许任何浏览器来源,而不是“匹配我正在使用的任意主机”。
    • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true 会启用 Host 标头来源后备模式,但这是一种危险的安全模式。
    json5
    {  gateway: {    controlUi: {      allowedOrigins: ["http://localhost:5173"],    },  },}

    远程访问设置详情:远程访问

    相关内容

    Was this useful?
    On this page

    On this page