关键词:ACP 协议|状态同步|响应式 UI|多端一致性|WebSocket|会话复用
在多渠道 AI 系统中,一个常见陷阱是:不同客户端体验割裂。用户在 WhatsApp 上能执行的操作,在 Web UI 中却不可用;CLI 输出的工具调用日志,在网页上却看不到——这不仅降低效率,更破坏信任。
OpenClaw 的核心原则之一是:无论用户从哪个入口接入,AI 的能力、上下文与行为必须完全一致。为此,其 Web UI 并非独立前端,而是 ACP(Agent Communication Protocol)。
本文将详解 OpenClaw Web UI 的三大支柱:

OpenClaw 的解法是:彻底解耦“通信”与“呈现”。
ACP(Agent Communication Protocol)是一个基于 JSON-RPC 2.0 的双向事件协议,定义了智能体与客户端之间的标准化消息格式。
method 和结构化 params{
"jsonrpc": "2.0",
"method": "chat.sendMessage",
"params": {
"sessionKey": "wa:+1234567890",
"content": "重启数据库"
}
}{
"jsonrpc": "2.0",
"method": "tool.call.request",
"params": {
"toolId": "bash_exec",
"args": { "cmd": "kubectl rollout restart deployment/db" },
"requiresApproval": true,
"host": "gateway"
}
}{
"jsonrpc": "2.0",
"method": "tool.call.approve",
"params": { "requestId": "req_abc123" }
}所有渠道使用同一套消息语义,后端无需区分来源。
OpenClaw Web UI 采用 SvelteKit + Vite 构建,但其核心不是框架,而是状态驱动架构。

每个 sessionKey 对应一棵响应式状态树:
// stores/sessionStore.ts
const sessionState = writable({
messages: [],
activeTools: new Map(), // 当前待审批/运行的工具
backgroundTasks: [], // 后台任务列表
managedProcesses: [], // 受管进程状态
inputDisabled: false // 是否等待 AI 响应
});tool.call.request、process.log)直接更新此树$sessionState 自动响应变化message.role 渲染用户/AI/工具消息tool.call.request,含“批准/拒绝”按钮managedProcesses 状态(运行/崩溃/日志)UI 是状态的投影,而非消息的直译。
sessionKey(如 wa:+1234567890)sessions/xxx.jsonl)chat.sendMessage/command 快捷指令(如 /task list),各端行为一致/think ...)在 Web 显示为折叠区块,在 CLI 显示为灰色文本,在 WhatsApp 显示为“AI 正在思考...”kubectl 日志)在所有端以等宽字体+滚动容器呈现体验一致,形式自适应。
process.log)在前端做 100ms 节流合并即使在网络波动下,体验依然流畅。
Web UI 不享有额外权限:
gateway 命令)仍需审批tool.call.approve,与 WhatsApp 行为一致allowedPaths 或 elevatedWhitelistWeb 只是另一个客户端,不是后门。
OpenClaw Web UI 内置开发者工具:
sessionKey<!-- DevTools.svelte -->
{#if devMode}
<div class="acp-inspector">
{#each acpLog as msg}
<pre>{JSON.stringify(msg, null, 2)}</pre>
{/each}
</div>
{/if}让前端开发者也能理解 AI 的“内心活动”。

OpenClaw 的 Web UI 架构证明:多端体验的一致性并非技术难题,而是设计选择。通过 ACP 协议将“通信”标准化,通过状态树将“呈现”解耦,系统得以在任意渠道提供同等能力、同等上下文、同等控制权的体验。
这不仅是工程优雅,更是对用户时间与认知的尊重——无论你在哪里,AI 都记得你是谁,做过什么,需要什么。
在下一篇中,我们将探讨 OpenClaw 的部署模型:如何从单机运行到 Kubernetes 集群。
下一篇预告: 第 15 篇:部署模型演进 —— 从单机 Docker 到 Kubernetes Operator