生命不息,折腾不止。做 Agent 前花十分钟搞清三大框架各自的定位,能帮你省下后面无数个抓狂的夜晚。

一、先别急着装:这三个其实不是一个层面的东西

很多人一张嘴就问「LangGraph、Claude Code、微软 MAF 到底哪个更强」,这问题本身问岔了。它们三个虽然都叫「Agent 框架」,但站在栈的不同位置上:

  • LangGraph:一个编排运行时(orchestration runtime)。它不在乎你的模型是谁,只管把你的工作流画成「有向图」——节点是步骤、边是走向——然后帮你管状态、管持久化、管中断恢复。
  • Microsoft Agent Framework(MAF):微软的统一全家桶,AutoGen 和 Semantic Kernel 的继任者。它把「自主 Agent」和「确定性 Workflow」分成两层,想要生产级的编排、可观测、安全护栏走它就对了,Azure 生态尤其顺。
  • Claude Code / Claude Agent SDK:这俩其实是同一台发动机——Anthropic 把 Claude Code 的 agent loop、内置工具、权限系统打包成了库。一个面向终端(CLI),一个面向代码(SDK)。它更偏「给 Claude 装上手脚真去干活」,而不是画图编排。

一句话先记牢:LangGraph 和 MAF 是「搭系统」的,Claude Agent SDK 是「雇一个能干活的 Claude」的。 这一层定位决定了你后面选型的整个逻辑。

(下文每家都配一个能跑的最小例子,代码均来自官方文档,具体版本差异请以官方文档为准。)

二、LangGraph:状态图 + 人工审批,长任务的老法师

LangGraph 是 LangChain 团队出的低层编排框架。核心理念就仨词:状态(State)、节点(Node)、边(Edge)。

先把环境装起来:

1
pip install langgraph

下面是一个「先问人工要不要继续、再往下走」的审批流最小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.types import interrupt, Command

# 1. 先声明「状态契约」:整个图共享什么样的数据
class State(TypedDict):
task: str
go: bool # 人工拍板的结论

# 2. 一个节点,走到这里就 pause,等人拍板
def ask_node(state: State):
decision = interrupt({"question": f"这活儿「{state['task']}」干不干?"})
return {"go": bool(decision)}

def work_node(state: State):
return {"task": f"{state['task']}(已执行)"}

builder = StateGraph(State)
builder.add_node("ask", ask_node)
builder.add_node("work", work_node)
builder.add_edge(START, "ask")
builder.add_edge("ask", "work") # 简化版;真实场景用条件边按 go 值分流
builder.add_edge("work", END)

# 3. 编译时必须挂 checkpointer,否则 interrupt 不生效
graph = builder.compile(checkpointer=InMemorySaver())

config = {"configurable": {"thread_id": "run-1"}}

# 第一次跑,跑到 interrupt 就停下来等人
graph.invoke({"task": "给服务器打补丁", "go": False}, config)

# 人看完后,用 Command(resume=...) 把决定塞回去,图从断点原地继续
graph.invoke(Command(resume=True), config)

有几个点务必记牢:

  1. 状态是显式的。TypedDict(或 Pydantic 模型)一写,整个图里流动的数据长什么样就一目了然,别人接你的代码不用猜。
  2. checkpoint 是灵魂。checkpointer 挂 InMemorySaver 只能本地玩,生产环境要换成 SQLite / PostgreSQL / Redis,这样图跑到一半断了也能接着跑。
  3. interrupt() 就是「人在回路」的本体。在节点里调一下,执行就停下来等你;拿到 Command(resume=...) 后从原节点继续往下走。
  4. 条件边(add_conditional_edges)管分流。上面例子我偷懒连了直线,真实场景里「拒绝走 cancel、同意走 proceed」就靠它写个路由函数搞定。

适合谁:工作流明确、要多步、要过人工审批、要能恢复的场景——内容审核、数据清洗流水线、多步写作/评审这类。学习曲线是「前重后轻」:状态 schema、reducer、checkpointer、条件边这四五个概念头一回有点绕,一旦吃透就一通百通。

三、MAF:Agent 与 Workflow 分层,微软生态的当家花旦

MAF 全称 Microsoft Agent Framework,是微软把 AutoGen 和 Semantic Kernel 收编、2025 年 10 月官宣、2026 年 4 月 Python 和 .NET 双双 1.0 GA 的统一框架。招牌设计是把两件事分开:

  • Agent:自主的、让 LLM 自己拿主意的单元;
  • Workflow:确定性的执行路径,你规定它先干啥后干啥、怎么分流。

装一把(Python 3.10+):

1
pip install agent-framework azure-identity

最小 Agent(接微软 Foundry,用 az login 免明文密钥):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import asyncio
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

async def main():
agent = Agent(
client=FoundryChatClient(credential=AzureCliCredential()),
name="Haiku",
instructions="你是个爱写俳句的助手。",
)
print(await agent.run("写一首关于 Agent 框架的俳句。"))

asyncio.run(main())

要串多步任务,就用 WorkflowBuilder + Executor:Executor 相当于 LangGraph 的「节点」,WorkflowBuilder 把它们用「边」连起来,顺序、并发、交接(handoff)、群聊、Magentic-One 这些编排模式都现成。想加人工审批,用 builder 的 request/response 机制把某一步的输出抛出来等人确认再往下推进。

MAF 的几处硬实力:

  1. 多模型 provider 开箱:文档列了不下六家——微软 Foundry、Azure OpenAI、OpenAI、Anthropic、Amazon Bedrock、Google Gemini,外加本地 Ollama,换 provider 不用大改架构。
  2. 可观测性原生:内置 OpenTelemetry,每一步工具调用、编排动作都能下钻,配 Foundry 后台看板看得很清楚。
  3. 安全护栏:走 Foundry 部署还能叠任务聚焦、PII(敏感个人信息)保护、prompt 注入防御这些「负责任 AI」能力。
  4. MCP 原生支持;A2A(Agent 对 Agent 协议)走独立包 agent-framework-a2a,目前仍是 beta。

适合谁:已经在 Azure/.NET 栈里、或者正从 AutoGen/Semantic Kernel 迁过来的团队,想一步到位拿生产级编排 + 可观测 + 安全护栏。它上手是三者里最「平滑」的——单个 Agent 几行代码就起来,Workflow 还能循序渐进去叠复杂度;但「Agent + 审批 + 长流程」组合起来时,你要在两个抽象层之间穿针引线,这块的坑一般来得比较晚。

四、Claude Agent SDK:把 Claude Code 的发动机塞进你自己代码

Claude Code 要是你在命令行里耍过,那 Agent SDK 就是同一个 agent loop 的「库化版」——读文件、跑命令、改代码、上网搜,全都不需要你自己写工具调度,Claude 自己看着办。

装一把(Python 3.10+ 或 Node 18+):

1
2
pip install claude-agent-sdk   # Python
# npm install @anthropic-ai/claude-agent-sdk # TypeScript

最小例子(让 Claude 自己找 bug 并修掉):

1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions

async def main():
async for msg in query(
prompt="找出 auth.py 里的 bug 并修掉",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Bash"],
),
):
print(msg) # 流式返回,本轮结束时 msg.type == "result"

asyncio.run(main())

它最值钱的是那一打内置工具:Read / Write / Edit / Bash / Glob / Grep / WebSearch / WebFetch / AskUserQuestion,外加一个 Monitor 盯后台进程。靠 allowed_tools 精确限权——只读的 Agent 就别给它 Bash,爆炸半径最小。再配上:

  • 权限模式(permission_mode):auto 让 AI 分类器替你拦危险操作,最适合自动化场景;
  • Hooks:PreToolUse / PostToolUse 在生命周期埋点,做审计日志最省事;
  • 子 Agent(AgentDefinition):把专职小工(代码审查、写测试)定义成对象,主 Agent 一键派活;
  • MCP 服务器:mcp_servers 参数一传,数据库、浏览器这些外部工具直接挂进来。

说到模型接入:Claude 是国外模型,官方那条要绑卡的 ANTHROPIC_API_KEY 对个人折腾不太友好。好在 Agent SDK 认 ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN 这类环境变量——把它们指向支持 Anthropic 协议的中转站(很多中转站同时兼容 OpenAI/Anthropic 协议,比如峰哥一直在用的 ai.aklibk.com),就能做到国内直连、免绑卡、人民币按量付费,这个月跑多少结多少,比直接绑外币卡省心多了(具体接入方式以中转站文档为准)。

适合谁:不画复杂编排图,而是「让 AI 直接在真实机器/代码库上动手」——自动化修 bug、跑 CI、批量处理文件、给自己做开发助手。注意它跟前两家不是竞争关系:你甚至可以直接用 Claude Code 帮你写 LangGraph / MAF 的代码,各干各的活。

五、上手成本与选型:一张表收尾

维度 LangGraph MAF Claude Agent SDK
定位 低层编排运行时 生产级统一框架 单 Agent 动手能力
语言 Python 为主(含 JS) Python / .NET / Go Python / TypeScript
核心抽象 StateGraph(状态图) Agent + Workflow 分层 query() + 内置工具
人工审批 interrupt / resume 原生 request / response 模型 permission_mode / hooks
可观测 配 LangSmith OpenTelemetry 原生 Anthropic 工具链
上手曲线 前重后轻 平滑、坑后置 最轻,几乎零配置

选型一句话总结:

  • 要有状态的多步长任务 + 人工审批,还想自己掌控全局 → LangGraph;
  • 在微软 / Azure 栈,要带着可观测和安全护栏上生产 → MAF;
  • 只想雇一个能真干活的 Claude,读文件、跑命令、改代码 → Claude Agent SDK。

三者并不互斥。我的实际玩法通常是:用 Claude Agent SDK 当「手」,用 LangGraph / MAF 当「调度器」——前者负责具体执行,后者负责流程和状态。架构这层理解对了,选型其实没那么难。

生命不息,折腾不止。下一篇我们直接上手第一个:用 LangGraph 从零搭一个带人工审批(interrupt + checkpointer)的多步 Agent,跑通之后你就彻底明白「状态契约」到底是个啥、它凭什么值这个学习成本。