
摘要:agent 跑起来后,除了 LLM 在算,还有压缩、校验、审批、脱敏、trace 一大堆事——它们挂在 message / event 的流动路径上,这就是中间件。本文讲清中间件是什么、它在 loop 的六个切面挂在哪、四家框架各自怎么实现、它和跨边界协议怎么分工,最后给出生产级的工程纪律。
《Agent 工程笔记》系列
- Agent Loop 工程笔记
- Agent 状态管理工程笔记
- Agent 消息与事件工程笔记
- Agent 中间件工程笔记(本篇)
- Agent 工具调用工程笔记
- Agent MCP 工程笔记
- Agent Skill 工程笔记
agent 跑起来之后,除了 LLM 在算,还有一大堆事在发生:历史太长要压缩、输出要校验、工具调用前要问人、流式 token 要脱敏、每次请求要记一笔 trace。这些事不属于 LLM,也不属于业务逻辑,它们挂在 message 和 event 的流动路径上,这就是中间件。
前一篇讲了数据层(message 进 state、event 出边界),这一篇讲机制层——中间件站在那条流动路径上做了什么、各家框架怎么落地、它和跨边界协议怎么分。
图1:三层通信模型里,中间件属于机制层。它站在 message / event 的流动路径上做处理,但数据真相在 state、信号在 event 流,中间件只是流经者,不拥有它们。
一、中间件是什么
写过 web 的人对中间件不陌生。Express 或 Koa 里那段 (ctx, next) => {...} 的链:请求进来,经过一串函数,每个函数能看请求、改请求、或者直接返回,再交给下一个。agent 里没有 HTTP 请求,但有一串 message 和 event 在流动——这一串流就是中间件的挂载对象。
所以一句话:agent 中间件是挂在 message / event 流上的拦截与处理函数。它和 web 中间件是同一个思路,只是切面更多——不只是"请求进来、响应出去"两步,还多了流式 delta、工具执行、生命周期、state 合并。
它能干的事逃不出四种,后面所有框架的中间件都是这四种的组合:
- 拦截:把流拦下来,不再往后传。比如限流、鉴权拒绝。
- 转换:改一改再传下去。比如历史压缩、PII 脱敏。注意它改的是流过的内容,不是底层的真相。
- 旁路:只看不动,原样放过,副作用发生在别处。比如 tracing、计量。
- 短路:替掉原来的结果,直接返回,跳过后面的环节。比如命中缓存时跳过 LLM 调用。
图3:拦截、转换、旁路、短路。同一段流上可以串多个中间件,每个只做其中一种或几种。
一个必须划清的边界:中间件存在于 message / event 的流动路径上,但不拥有它们。数据真相在 state 里(可以被重放),信号在 event 流里(驱动 UI 和可观测)。中间件消费或生产它们,但归属权不在中间件。这一点决定了后面很多设计:中间件可以改写流经的 message 副本,但不能把改写后的内容当成 state 里的"原文"。
有个反直觉但重要的点:中间件越多,loop 主干反而越空。这其实是好事——观测、权限、压缩、guardrail、重试这些横切关注点全外挂到流动路径上,主循环就剩"取历史→调 LLM→跑工具"的骨架。上一篇《Agent Loop 工程笔记》里说 harness 该是个哑路由,中间件就是让它能当哑路由的具体手段。
二、它在 loop 里挂在哪几个切面
把一次完整 loop 拆开看,中间件能挂的位置不止 LLM 前后两处。按生命周期排,有六个切面,每个切面的输入不同、能做的事也不同。
275



被折叠的 条评论
为什么被折叠?



