同一个"搜网回答问题"的 agent,6 个主流 SDK 的写法完全不一样——并排对照看,设计哲学差异立现。
建议先读《全景图:agent 生态分 5 层》;如果你是跳读,至少先看本章索引与本页 TL;DR。
生态地图与预读材料,帮助你给后续概念找现实落点。
同一个"搜网回答问题"的 agent,6 个主流 SDK 的写法完全不一样——并排对照看,设计哲学差异立现。
先分层,再看厂商;先看抽象位置,再看 marketing 叙事。
生态预读:优先官方文档,其次稳定实现观察。
| SDK | 所属层 | 设计哲学(一句话) |
|---|---|---|
| 手撸 OpenAI loop | L1 + L2 | "循环我自己写"——把所有结构都摊在阳光下,最适合学习 / 小任务。 |
| OpenAI Agents SDK | L3 | "循环你别管"——隐藏 loop,对外只暴露 Runner.run(agent, input),加 handoff / guardrail 等 OAI 风格原语。 |
| Anthropic Messages SDK | L1 + L2 | "我只给最干净的协议"——messages.create 一次只跑一轮,循环由你自己组织(设计上很像手撸 OAI,但 tool_use block 模型更工整)。 |
| LangGraph create_react_agent | L3 | "把 loop 画成图"——状态机式表达;可中断、可恢复、可分支、可时间旅行。是 long-horizon agent 的工程主流之一。 |
| smolagents | L4 | "让 LLM 直接写 Python 当 action"——CodeAgent 风格,动作空间被表达得极紧凑。 |
| Deep Agents | L4 | "开箱即用的 long-horizon 模板"——基于 LangGraph,预装 planner(write_todos)+ VFS + subagent 三件套。 |
任务统一为:给一个问题,agent 调用 search_web 工具找资料,最后给出答案。点击下面的 Tab 切换:
# 把整个 ReAct loop 摊在阳光下:状态、终止、错误、回灌都肉眼可见
import json
from openai import OpenAI
client = OpenAI()
def search_web(query: str) -> str:
return f"<假装搜到的关于 {query} 的结果>"
TOOLS = [{
"type": "function",
"function": {
"name": "search_web",
"description": "Search the web. Use for factual questions.",
"parameters": {"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]},
},
}]
def run_agent(user_msg, max_steps=8):
messages = [{"role": "user", "content": user_msg}]
for _ in range(max_steps):
resp = client.chat.completions.create(
model="gpt-4o", messages=messages, tools=TOOLS,
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls: # —— 终止:LLM 不再要 tool
return msg.content
for call in msg.tool_calls: # —— 派发并回灌
args = json.loads(call.function.arguments)
result = search_web(**args)
messages.append({"role": "tool",
"tool_call_id": call.id,
"content": result})
raise RuntimeError("max_steps exceeded")
print(run_agent("GPT-5 的最新定价是多少?"))
看点:30 行就跑通一个 agent。所有"魔法"都在你眼前——messages 怎么追加、终止怎么判定、错误怎么回灌,肉眼可见。代价是所有"高级能力"都得自己加(HITL / checkpoint / 中断 / 多 agent)。