Sydney Runkle 是 LangChain 的核心贡献者之一。这篇短文的目的不是介绍新功能,是给"agent 怎么造"一个干净到不能再干净的定义。
核心公式
agent = model + harness
harness 是把模型接进现实世界的脚手架。
而 Sydney 给 harness 的工作下了个非常具体的定义:harness 的全部工作,是在 agent loop 的每一步把"对"的上下文送给模型。
两个前提:
- agent 的好坏只取决于送给模型的上下文
- harness 的工作就是按时、按需把上下文送进去
所以造一个有用的 agent,等价于造一个擅长"在对的时候给对上下文"的 harness。
create_agent:极简到底
LangChain 推出了一个新原语 create_agent:传一个 model、tools、system prompt 进去,你就得到一个能跑的 agent。
市面上不缺 harness——DeepAgents、Claude Agent SDK 都已经预装了一整套 opinionated 的 middleware 栈:memory、context management、sandboxing……好处是开箱即用,坏处是它们锁死了抽象层。当你的 agent 需要更细粒度的定制(自定义 prompt、业务逻辑、guardrails),这些大而全的 harness 反而不灵活。
create_agent 反着来——故意做小。它的哲学和 Claude Code 一脉相承:高度可配置的 coding agent harness。
它只做一件事:实现 agent 主循环。其他所有能力都通过 middleware 暴露 出来。
middleware:在 agent loop 里的钩子
middleware 钩进 agent loop 的每一步:
- 模型调用之前 / 之后
- 工具调用之前 / 之后
- agent 启动 / 关闭
每段 middleware 只管一件事,互相自由组合。
Sydney 把 middleware 能干的事分成四类:
1. 确定性逻辑
业务逻辑、策略执行、动态 agent 控制——任何需要在 loop 的某个具体节点触发的事。包括对 agent 本身的运行时控制:根据任务复杂度换模型、调 prompt、压缩消息历史。
所有"不能(或不该)塞进 prompt 的东西"都该在这里。
2. 工具
不是把 tools 直接注册在 agent 上,middleware 接管工具的完整生命周期——setup、teardown、registration,最后递给 agent 一组干净的工具可用。
这在工具有依赖、需要初始化、跑完要清干净的场景下特别有用。而且它让工具配置靠近管理它的逻辑,不散在 agent 定义里。
3. Custom state
如果你的 middleware 需要跨钩子跟踪状态,middleware 可以扩展 agent 的 state 加上自定义属性。在整个执行过程中持续维护计数器、flags、跨钩子共享数据。
4. Stream handlers
middleware 可以拦截和改造 agent 的输出流——过滤事件、注入 metadata、把不同事件类型路由到不同消费者。当栈的不同部分需要对 agent 的不同行为做反应时很有用:UI 消费 token delta、审计日志记 tool call、监控系统追 latency。
middleware 的真正价值
一句话:它把"agent 行为"从"绑死的配置"变成"可组合的代码单元"。
具体两层好处:
- 任何点都能定制——agent loop 里任何一个步骤都可以插入中间件
- 相关逻辑打包成可组合、可分享的代码单元——同一段 middleware 可以在整个组织的所有 agent 上复用,新 agent 自动继承经过验证的行为
LangChain 已经为最常见 pattern 准备了预置 middleware。任何定制需求就只是一个 hook 的距离。
harness 的活儿:按时按需送对上下文
Sydney 用一张映射表把常见能力对应到支持它们的 middleware:
- 长期运行?→ state middleware
- 任务复杂度高?→ routing / model-swap middleware
- 敏感操作?→ guardrail middleware
- 需要可审计?→ log / stream middleware
生产环境的 agent 通常会同时组合几个。
她特别提了一个概念:task-harness fit——harness 匹配任务实际需求的程度。客服 agent 的 harness 跟长跑 coding agent 的 harness 是两个物种。
LangChain 内部造的每个 agent——DeepAgents、Claude Agent SDK 集成、内部 agent——全跑在 create_agent 之上,各自叠不同的 middleware 栈。
核心 takeaway
- 不要再问"用什么模型造 agent"——先问"你的 harness 在第几步、什么时机、把什么上下文送进模型"
- 好的 harness 是个按时按需送对上下文的工程系统,不是 prompt 模板
- middleware 作为原语的价值是让 harness 可演化、可复用——同一段逻辑能在新 agent 上继承
- 最后那句最锋利:最佳 agent 不是用最强模型造的,是用最贴合任务的 harness 造的