数据截至 (上游 commit dad6f5196773)
四个执行面:同一条指令流跑在浏览器、服务端、云沙箱和本地 CLI 上
30 秒导读: 前面几章讲的是 agent「怎么想、怎么调模型、怎么用工具」。这一章只回答一个很物理的问题——这次运行到底发生在哪台机器上。LobeHub 把同一套 agent 语义搬到了四个截然不同的执行面上,每个面对「状态存哪、事件怎么广播、断线怎么接」给出的答案都不一样。
1. 这是什么(零基础也能懂)
一句话定义: 「执行面」(execution plane)= agent 循环真正跑起来的那个进程 + 那台机器。
同一句「帮我把这 个仓库的测试跑通」,在 LobeHub 里可能落在四个完全不同的地方。
| 执行面 | 代码里的名字 | 循环跑在哪 | 典型场景 |
|---|---|---|---|
| 浏览器执行面 | runtimeType: 'client' | 你的浏览器标签页 / Electron 渲染进程 | 默认聊天,关掉页面就停 |
| 服务端执行面 | runtimeType: 'gateway' 的服务器一侧 | LobeHub 服务器进程(或队列 worker) | 云端长任务,关页面照跑 |
| 云沙箱面 | executionTarget: 'sandbox' | 一次性云容器里的 CLI 进程 | 网页版跑 Claude Code |
| 本地 CLI 面 | runtimeType: 'hetero' | 你本机上 claude / codex 子进程 | 桌面端跑外部 CLI agent |
为什么需要四个? 因为三种诉求互相冲突:
- 要快、要能碰你的文件 → 只能在本机跑。
- 要关掉页面还继续跑、手机上能看进度 → 只能在服务端跑。
- 网页版没有本地文件系统,但又想用 Claude Code → 只能开个云容器跑。
一句话直觉: 把 LobeHub 想成一个调度台。用户按下回车时,调度台先查一张「这活儿该派给谁」的表(路由决策),再把活儿丢进对应的车间(执行面)。四个车间的产出规格是统一的——都吐 AgentStreamEvent——所以聊天界面这一端根本不用知道活儿在哪儿干的。
本章不讲多 agent 之间怎么编排、怎么互相调用(那是 第 6 章),只讲运行时选址与传输