"默认 system prompt"、"自动 summarize"、"permission 检查"、"logging"——这些"看不见的好用"全都通过 middleware 注入。它是 harness 真正的发动机。
建议先读《Streaming + Interrupts》;如果你是跳读,至少先看本章索引与本页 TL;DR。
runtime 认知层,用来分清编排、执行、持久化与产品边界。
"默认 system prompt"、"自动 summarize"、"permission 检查"、"logging"——这些"看不见的好用"全都通过 middleware 注入。 它是 harness 真正的发动机 。
先分清谁负责编排、谁负责执行、谁负责产品化,再评估复杂度。
课程主线:稳定 runtime 机制 + 官方实现。
所有写过 web 后端的人都熟悉 HTTP middleware:
request →
[auth] → [rate_limit] → [logging] → [your handler] → [logging] → [compression] → [cache_headers]
↓
response
Agent 的 middleware 模型几乎一比一移植——只是"middleware 串"插在的位置变了:
state →
[before_model] → MODEL CALL → [after_model] → [before_tool] → TOOL CALL → [after_tool] →
↓
next step
每个 middleware 是一个函数:读 state → 可能改 state → 可能短路(直接返回 / 抛 interrupt)→ 让下一段继续。和 HTTP middleware 的"next callback"语义一致。
| Hook | 触发时机 | 可读 / 可写 | 典型用途 |
|---|---|---|---|
| before_model | 模型调用之前 | 读完整 state,可改即将发送的 messages | 注入 planner state、注入用户偏好、auto-summarize 老 message、pr |