把 Agent 接到浏览器
pi-web-ui 把同一个 agent 引擎搬进网页。核心组件是 ChatPanel:它订阅 AgentSession 的事件流,把 text / thinking / toolCall / toolResult 渲染成网页里的气泡、折叠块和工具卡片。
浏览器 ChatPanel
▲ │ 用户输入
事件 │ ▼
┌───┴────────────┐
│ 传输层 (RPC) │ ← 同 Ch.16 的 RPC 模式
└───┬────────────┘
▼
AgentSession ─▶ agentLoop(和 CLI 完全相同的引擎)和 TUI 共享什么、不同什么
- 共享:引擎、会话、工具、压缩、权限——一切核心逻辑。
- 不同:只有最外层的渲染(DOM vs 终端字符)和传输(RPC / WebSocket vs 进程内)。
ChatPanel 消费事件流(精简)
function ChatPanel({ session }) {
const [blocks, setBlocks] = useState([])
useEffect(() => {
// subscribe(listener) 返回取消订阅函数,直接作为 cleanup
return session.subscribe((ev) => {
if (ev.type === "text_delta") appendText(ev.delta)
if (ev.type === "tool_call") addToolCard(ev)
if (ev.type === "tool_result") resolveToolCard(ev)
})
}, [session])
return <MessageList blocks={blocks} />
}到这里 18 章串成了一条线:Model 给思考,Context 给视野,Agent Loop 给心跳,Tools 给手脚,Session 给记忆,Extensions 给可塑性,五种模式 + TUI / Web UI 给出口。同一个引擎,撑起了整个 pi。