前 4 节读了三个截然不同的 codebase。这一节把"差异"剥掉,露出"不变量"——所有 agent harness 都绕不开的 6 条内核模式。它们既是章 5 的总结,也是章 6 你自己写 harness 的设计 checklist。
建议先读《拓展点 / Tools / Middleware / Subagent / Sandbox》;如果你是跳读,至少先看本章索引与本页 TL;DR。
进阶理解层,把抽象落实到真实代码与状态机。
前 4 节读了三个截然不同的 codebase。这一节把" 差异 "剥掉,露出" 不变量 "——所有 agent harness 都 绕不开 的 6 条内核模式。它们既是 章 5 的总结 ,也是 章 6 你自己写 harness 的设计 checklist。
先追 entry / state / extension points,再看 API 名字。
课程主线:源码 + 官方 docs + 版本上下文。
| 维度 | LangChain create_agent | OpenAI Agents SDK | HuggingFace smolagents |
|---|---|---|---|
| 01 入口 | create_agent(...) · 返回 CompiledStateGraph · 13+ 参数 · graph builder |
Runner.run(...) · async classmethod · delegate 给 AgentRunner · TraceCtx 包裹 |
MultiStepAgent.run(task) · 同步 generator wrapper · 内部 _run_stream while |
| 02 状态 | AgentState TypedDict · messages: Annotated[list, add_messages] · 字段级 reducer |
RunState dataclass + RunContextWrapper · in-place 修改 · generated_items: list[RunItem] |
AgentMemory · list[TaskStep | ActionStep | PlanningStep] · 自包含线性日志 |
| 03 工具 | @tool · type hint 推 schema · 异常吃掉为 ToolMessage |
@function_tool · Pydantic auto · RunContextWrapper 注入 first arg |
@tool 或 Tool 子类 · docstring Args + 显式 inputs · 抛 AgentError |
| 04 Middleware | 4 注入点 (before_model / after_model / before_tool / after_tool) · 能短路 loop |
5 hook (on_agent_start...) + 独立 Guardrail 链 · 异步 · 拒绝抛异常 |
step_callbacks: 1 个注入点(每 step 后)· 不能短路(除非 raise) |
| 05 Backend | 原生 checkpointer (InMemory / SQLite / Postgres / Redis) + Store (跨 thread) · 开箱崩溃 resume | Session (SQLite/in-memory) + OpenAI Responses API server-side · 无 checkpoint 协议 |
无内置 backend · agent 实例自己持有 memory · 崩溃从头跑 |
| 06 Subagent | 子图 (subgraph) · 默认隔离 state · 可当 tool 用 | handoff · 共享 state · NextStepHandoff 一等公民 · 单向切 | managed_agents · 子 agent 自动包装成 tool · 强制隔离 |
| 07 Permission | middleware before_tool 可拦 + interrupt_before 可暂停 |
InputGuardrail / OutputGuardrail · 可异步, 可 LLM-as-judge |
step_callbacks 内 raise · 颗粒度粗 |
| 08 Interrupt | 原生 (interrupt_before=["tools"] + resume) · checkpoint-aware |
无标准 interrupt; RunResultStreaming 之间 |