本节摘要:全书最后一节。我们把九站导览重新串成一条完整航线:①总控台(多仓库拆分史 + 多后端架构 + ingress 单端口)→ ②对话舱(WebSocket 事件流消费 + tool visualizers + 确认模式)→ ③接入坞(backend-registry 四类后端 + agent-server-adapter 统一接口)→ ④ACP 适配口(JSON-RPC over stdio 接入 Claude Code/Codex/Gemini)→ ⑤自动化塔(五类触发器把 agent 变常驻工程团队)→ ⑥插件架(Skills/MCP/Canvas Extensions)→ ⑦协议管线(禁止直接 fetch 的 API 纪律 + OpenAPI → client 生成)→ ⑧工程保障舱(mock-LLM e2e + Stryker + i18n + AGENTS.md)→ ⑨停机坪(五种部署形态)。然后提炼 Agent Canvas 的核心哲学四点:多后端单驾驶舱、ACP 标准化、产品化思维、工程纪律。最后给出读者的下一步行动清单。
内容来源:全书第 1-9 章各站精读内容回顾,源码引用均为前文已逐段拆解过的文件。
⚠️ 注意:本节不再贴大段新代码,只做航线串讲与提炼。每站提到的文件名与行数都出自前八章的精读,可按站回看对应章节。
阅读完本节,你应当能够:
先用一张航线图把九站的关系摆上仪表盘:

各站一句话与代表源码速查:
| 站 | 一句话核心 | 代表源码 |
|---|---|---|
| ① 总控台 | 多仓库各司其职,ingress 单端口收拢一切 | AGENTS.md 仓库地图、scripts/static-server.mjs |
| ② 对话舱 | 事件流消费 + 工具可视化 + 人工确认 | 约 1278 行 WebSocket 消费链、tool visualizers |
| ③ 接入坞 | 四类后端一套接口 | backend-registry、约 1638 行 agent-server-adapter |
| ④ ACP 适配口 ★ | 开放协议接入任意 agent | ACP 子进程管理与 JSON-RPC 消息层 |
| ⑤ 自动化塔 | 触发器把 agent 变常驻员工 | 五类触发器、automation 生命周期 |
| ⑥ 插件架 | 三维扩展体系 | Skills、MCP、Canvas Extensions |
| ⑦ 协议管线 | 契约驱动,禁止直连 | no-direct-agent-server-calls.test.ts、typescript-client |
| ⑧ 工程保障舱 ★ | 五层测试 + 全球化 + AI 协作规范 | mock-llm-server.py、stryker.config.mjs、translation.json、AGENTS.md |
| ⑨ 停机坪 | 五种形态一种产物 | bin/agent-canvas.mjs、docker/Dockerfile、electron-builder 配置 |
下面逐站展开。
航线的起点是历史与全景。OpenHands 从单体 OpenDevin 走来,演化成今天的多仓库体系:本仓库(前端 agent-canvas)、software-agent-sdk(Python SDK + agent-server)、typescript-client(契约镜像)、automation(调度后端)各司其职。AGENTS.md 的分工表把"什么改动落在哪个仓库"写成硬规则——新端点进 SDK、新访问方法进 client、UI 与前端服务留在本仓库。
运行时架构的骨架是 ingress 单端口:static-server 一个进程同时做静态前端服务与反向代理,/api/* 与 /sockets 转 agent-server、/api/automation/* 转 automation、其余走 SPA——浏览器永远只见一个源,没有 CORS、没有多端口配置。这一骨架贯穿全书:第 2 章的 WebSocket、第 8 章的 e2e(单 URL 同吃浏览器与后端断言)、第 9 章的 Docker entrypoint 十余条 --route,全是它的变奏。
产品的心脏是那条约 1278 行的 WebSocket 消费链:订阅 /sockets、把 agent-server 推来的事件流(思考、行动、观察、错误)增量渲染进对话界面,断线后用 events API 分页补拉。tool visualizers 把机器视角的工具调用翻译成人类可读的卡片——终端命令带输出、文件编辑带 diff、浏览器操作带截图;确认模式在危险动作前插一道人工闸门。这一站确立的观点贯穿全书:agent 产品的竞争力一半在模型,一半在"把模型的行为变成人能审阅、能干预的界面"。
backend-registry 管理四类后端(本地 agent-server、云端、外部 URL、ACP),约 1638 行的 agent-server-adapter 把"连哪个后端、用什么凭据、怎么解析 host"统一成一套接口。活动后端是全局状态,切换对业务代码透明——第 7 章的 getAgentServerClientOptions() 正是从这里读配置:接入坞是协议管线的地基。
全书第一个高潮:Agent Client Protocol,JSON-RPC over stdio。agent-server 以子进程方式拉起任何符合 ACP 的 agent(Claude Code、Codex、Gemini CLI、自研脚本),用标准化的 initialize/session/prompt/update 消息对话——进程输入输出一对,协议即接通。这一站的意义是生态级的:Canvas 不绑定自家后端,任何 agent 都能插进这个驾驶舱。第 8 章测试框架里那个 50 行的 mock ACP 服务器,反向证明了协议的开放红利:能接入的东西,就能被替身测试。
五类触发器(定时 cron、间隔、webhook、事件、手动)加 automation 后端的派发与重试,把"人发起的一次对话"升级为"无人值守的工程流程":夜间代码评审、告警响应、例行报告。会话状态机(创建 → 派发 → 运行 → COMPLETED/FAILED)与第 2 章的事件流共用渲染管线——自动化不是新系统,而是对话舱的调度化封装;<RUNTIME_SERVICES> 块把本地服务拓扑注入 agent 系统提示,让它知道自动化 API 就在手边。
Skills 给 agent 技能(它自己会按任务取用的操作手册)、MCP 给工具(标准化的外部能力接入,GitHub/Slack 等数百服务器即插即用)、Canvas Extensions 改 App 本身(运行时安装的界面扩展)。三个维度分别作用在模型侧、工具侧、界面侧——一个扩展体系是否成熟,看它能不能把"改产品"也变成插件。
前端与 agent-server 之间不许有"自由恋爱":CI 守卫测试(no-direct-agent-server-calls.test.ts,80 行)递归扫描 src/ 全部源码,六组正则把裸 axios/fetch 打 /api/、直接构造底层 HttpClient 等违规当场击落,白名单只放三个基础设施文件;所有调用走 @openhands/typescript-client(1.39.0)——它由 software-agent-sdk 的 OpenAPI 契约生成,契约变更 → client 重新生成 → 前端编译期报错。config/defaults.json 钉扎 agent-server 1.44.1 与最低兼容 1.28.0,sdk-version-sync.yml 三通道触发跨仓库自动对表。接口漂移这个前后端协作的千年顽疾,在这里被"测试守卫 + 生成链路 + 版本钉扎"三件套制度性消灭。
全书第二个高潮,保障舱六件套:602 个单测文件(Vitest 4,根 __tests__/ 镜像 src 结构)打底;src/mocks/ 约 3.6K 行 MSW(13 组按服务分文件的 handler)让前端无后端开发;mock-LLM e2e 用 TestLLM 两轮剧本(terminal 工具调用 + 文本收尾)替换大模型,让"浏览器 → ingress → agent-server → 工具执行 → 结果渲染"的全链路回归不花一个 token、每个 PR 都跑,四套 Playwright 配置再覆盖 Docker 镜像与真 LLM 抽样;Stryker 变异测试(diff 级)审计测试本身的有效性;TESTING_MATRIX 用 OS × 安装方式 × Agent 的人工冒烟矩阵守住机器守不住的组合;i18n 2445 键 × 全语言(含简繁中文)100% 翻译加 make-i18n 生成管线;898 行遥测服务(install 事件分级、四层退出开关)与 120KB 的 AGENTS.md 把"AI 参与开发"本身也纪律化。
npm 全局包(bin 脚本用 uvx 编排 Python 栈,一条命令)、Docker 三合一(单镜像单端口 8000,urandom 自动生成密钥并持久化,ingress 十余条路由)、Electron 三平台(afterPack 把 600MB node_modules 削到约 10MB,dmg/exe/deb)、Helm(企业 K8s,StatefulSet 随镜像自动 bump)、Vercel(前端托管)。release-please 按 Conventional Commits 自动发版,20 个 workflows 分工协同。五种形态共享同一份构建产物与 defaults.json——交付的多样性没有破坏工程的一致性。
四点哲学与源码证据速查:
| 哲学 | 含义 | 源码证据 |
|---|---|---|
| 多后端单驾驶舱 | 一个 Canvas 管所有 agent,不分厂商 | backend-registry + getAgentServerClientOptions() 唯一配置出口 |
| ACP 标准化 | 任何 agent 可插进驾驶舱,不绑定自家后端 | JSON-RPC over stdio 协议层 + 50 行 mock ACP 服务器可测 |
| 产品化思维 | 把 agent 能力变 agent 产品,而非 demo | tool visualizers、确认模式、五类触发器、三维插件 |
| 工程纪律 | 约束可执行、文档不过期、贡献者含 AI | CI 守卫测试、mock-LLM e2e、make-i18n 生成、120KB AGENTS.md |
一个 Canvas 管所有 agent,不分厂商。接入坞的四类后端注册表、活动后端的全局解析、getAgentServerClientOptions() 的单一配置出口,共同保证"切后端"是用户级的开关而非代码级的重构。证据落到源码:任何 client 调用都不自带 URL,host 一律从注册表解析(第 3、7 章)。
不绑定自家后端,是比"多后端"更进一步的宣言:用开放协议把 agent 接入变成 commodity。任何说 JSON-RPC over stdio 的 agent 都能插进驾驶舱,Canvas 的价值随之从"我家的模型界面"转移到"所有人的操作中枢"。当模型层持续洗牌,标准化接口是最深的护城河(第 4 章)。
事件流可视化(第 2 章)、确认模式(第 2 章)、自动化调度(第 5 章)、Skills/MCP/Extensions(第 6 章)——这一系列能力的共同方向是:把 agent 的原始能力加工成 agent 产品。原始事件流是机器日志,tool visualizers 让它变成人类可审的叙述;原始工具调用有风险,确认模式给它装上刹车;原始对话需要人在场,自动化让它值守。demo 与产品的分界线,就在这些"第二层加工"里。
API 守卫测试(第 7 章)、mock-LLM e2e(第 8 章)、2445 键全量 i18n(第 8 章)、120KB 的 AGENTS.md(第 8 章)——当仓库的主要贡献者包括 AI agent,纪律不再是风格偏好,而是系统能持续演化的前提。每条纪律都配着强制机制:违规的代码过不了 CI,过期的文档违反元规则,缺译的键编译不过。
💡 驾驶舱要点:四点哲学其实是一个判断的四个推论——模型会变、厂商会变、界面形态会变,但"人类需要安全地指挥与审阅 agent 工作"这件事不变。围绕不变量组织架构(标准化接入、可视化、确认、纪律),把变化的部分(具体模型、具体后端)全部做成可插拔。这是 Agent Canvas 给所有 agent 产品开发者的最重要一课。
合上这本教程,建议按这个顺序把知识变成肌肉记忆:
npm i -g @openhands/agent-canvas 起一个真实栈,用 --info 对照第 7 章的版本钉扎(agent-server 1.44.1/最低兼容 1.28.0),再开浏览器把九站讲过的界面——事件流、确认模式、后端切换、自动化面板——逐一认脸。想省钱就用 npm run dev:mock:MSW 让你在零后端的情况下点遍全部功能(第 8 章第 01 节)。tests/e2e/mock-llm/scripts/mock-acp-server.py 写一个属于你自己的最小 ACP agent——initialize/session/new/session/prompt 四个方法写完,你对协议的理解就落地了。读完这九章,你已经具备:
src/ 下任何一个模块都能定位它的职责边界——服务层看 src/api/、状态看 stores、事件看第 2 章的管线、扩展点看第 6 章的三维体系;遇到没讲过的文件,先查 AGENTS.md 的仓库地图。agent 应用的复杂度,不在任何一行代码里,而在人、agent、工具、流程如何被组织进同一个系统。Agent Canvas 给出了一个完成度极高的答案:它把"指挥 agent"做成了驾驶舱,把"信任 agent"做成了可视化与确认,把"扩展 agent"做成了协议与插件,把"维系这一切"做成了纪律与测试。
九站航程到此结束。愿你亲手造出的驾驶舱,配得上你指挥的每一位 agent。