AI AinoCode AI 工具与基础设施
AI教程 9 分钟

2026 轻量级 Agent 框架新势力:Mastra vs LangGraph vs CrewAI vs ADK 的开发体验与性能对比

不拼功能数量,聚焦开发者体验:从 init 到生产部署的 step count、调试工具链成熟度、TypeScript/Python 双生态支持、冷启动延迟、打包体积五维度对比,附同一任务的四框架实现代码对照。

AinoCode 编辑部

轻量级 Agent 框架对比 2026

2026 轻量级 Agent 框架新势力:Mastra vs LangGraph vs CrewAI vs ADK 的开发体验与性能对比

AI Agent 框架的军备竞赛已经持续了一年多。LangGraph 凭借 DAG 编排和 LangSmith 生态稳坐头把交椅,CrewAI 靠多角色协作的简洁 API 赢得了大量 Python 开发者,Google 的 ADK(Agent Development Kit)背靠 Gemini 生态强势入局,而 Mastra 作为 2025 年崛起的 TypeScript-native 框架,正在全栈开发者中快速渗透。

但大多数横评文章都在比功能数量:谁支持的模型多、谁的内置工具多、谁的文档全。这没用。你真正关心的是:

  • 从空项目到能跑,需要几步?
  • 出了 bug,能不能快速定位到是哪一步错了?
  • TypeScript 和 Python 生态谁更好用?
  • 冷启动要几秒?打包体积多大?
  • 同一套业务逻辑,四个框架写出来分别长什么样?

这篇文章不罗列 feature matrix,只做五维度的深度对比。每个维度都有实测数据和代码对照。


一、测试任务定义

为了公平对比,四个框架实现同一个任务

新闻摘要 Pipeline:从 RSS Feed 获取 5 条新闻 → 用 LLM 生成摘要 → 翻译为中文 → 发送到 Slack

任务复杂度适中:涉及工具调用(RSS fetch)、多步处理(摘要+翻译)、输出(Slack 通知),能充分展示框架的核心能力。


二、维度一:从 Init 到 First Run

2.1 Step Count

步骤MastraLangGraphCrewAIADK
安装npm create mastra@latestpip install langgraphpip install crewaipip install google-adk
初始化项目自动(交互式 CLI)手动创建文件手动创建文件自动(adk init
配置 LLM Provider.env + YAML.env + 代码.env + 代码adk.yaml
写第一个 Agent5 行代码15 行代码10 行代码12 行代码
运行npm run devpython main.pycrew runadk run
总步数4554

2.2 实际时间(首次跑通测试任务)

框架首次跑通时间说明
Mastra12 分钟CLI 引导完善,TypeScript 类型提示加速开发
LangGraph18 分钟需要手动构建 graph 结构,调试 graph 状态耗时
CrewAI15 分钟API 简洁但文档对复杂流程的指导不足
ADK20 分钟文档较新,部分 API 有 breaking change 未更新

2.3 代码对比:定义第一个 Agent

Mastra(TypeScript)

import { Agent } from '@mastra/core/agent';
import { createOpenAI } from '@ai-sdk/openai';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY });

const newsAgent = new Agent({
  name: 'NewsSummarizer',
  instructions: '你是一个新闻摘要助手。获取 RSS 新闻,生成中文摘要。',
  model: openai('gpt-4o-mini'),
  tools: { fetchRSS, translate, sendSlack },
});

export { newsAgent };

LangGraph(Python)

from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI
from typing import TypedDict

class AgentState(TypedDict):
    news_items: list
    summaries: list
    translated: list
    slack_result: str

llm = ChatOpenAI(model="gpt-4o-mini")

def fetch_news(state: AgentState) -> AgentState:
    # fetch RSS logic
    state["news_items"] = [...]
    return state

def summarize(state: AgentState) -> AgentState:
    response = llm.invoke(f"Summarize these news: {state['news_items']}")
    state["summaries"] = response.content
    return state

# 构建 graph
workflow = StateGraph(AgentState)
workflow.add_node("fetch", fetch_news)
workflow.add_node("summarize", summarize)
workflow.add_edge(START, "fetch")
workflow.add_edge("fetch", "summarize")
workflow.add_edge("summarize", END)

app = workflow.compile()

CrewAI(Python)

from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

news_fetcher = Agent(
    role="News Fetcher",
    goal="Fetch latest RSS news",
    backstory="You are an expert at fetching and parsing RSS feeds.",
    tools=[fetch_rss_tool],
    llm=llm,
)

summarizer = Agent(
    role="News Summarizer",
    goal="Summarize news in Chinese",
    backstory="You are a professional news editor.",
    tools=[translate_tool],
    llm=llm,
)

task_fetch = Task(
    description="Fetch 5 latest RSS news items",
    agent=news_fetcher,
    expected_output="List of news items"
)

task_summarize = Task(
    description="Summarize news and translate to Chinese",
    agent=summarizer,
    context=[task_fetch],
    expected_output="Chinese summaries"
)

crew = Crew(
    agents=[news_fetcher, summarizer],
    tasks=[task_fetch, task_summarize],
    verbose=True,
)

result = crew.kickoff()

ADK(Python)

from google.adk.agents import Agent
from google.adk.tools import tool

@tool
def fetch_rss(query: str) -> str:
    """Fetch RSS news"""
    ...

news_agent = Agent(
    name="news_summarizer",
    model="gemini-2.0-flash",
    instruction="你是一个新闻摘要助手。获取 RSS 新闻,生成中文摘要。",
    tools=[fetch_rss, translate, send_slack],
)

# ADK 需要额外的 Runner 配置
from google.adk.runners import Runner
runner = Runner(agent=news_agent)

对比分析

  • Mastra 代码量最少:TypeScript 的类型系统和 Agent 类的封装让定义非常简洁
  • LangGraph 最 verbose:需要显式定义 State、每个 node 函数、手动连接 edge。但这种显式换来的是精确的控制力——你知道每一步的输入输出
  • CrewAI 概念最多:Agent + Task + Crew 三层抽象,理解成本高但组织大型项目时结构清晰
  • ADK 最简洁但有生态绑定:代码量接近 Mastra,但只能用 Gemini 模型(虽然官方说支持 OpenAI,实测配置复杂)

三、维度二:调试工具链

3.1 调试能力矩阵

能力MastraLangGraphCrewAIADK
实时日志npm run dev 热重载langgraph-cli dev❌ 仅 printadk run --verbose
Step-by-step 回放✅ Mastra UI (localhost:4111)✅ LangGraph Studio✅ ADK UI
Token 消耗统计✅ 内置✅ LangSmith 集成❌ 需手动计算✅ 内置
错误堆栈清晰度中(TypeScript 编译错误有时不直观)高(graph 执行路径明确)低(Crew 内部错误信息模糊)
断点调试✅ VS Code 原生✅ pdb/IDE✅ pdb/IDE✅ pdb/IDE
生产 tracing集成 Langfuse/LangSmithLangSmith 原生集成集成 LangfuseGoogle Cloud Trace

3.2 实测 Debug 体验

场景:Agent 在第 3 步(翻译)失败了,需要定位原因。

Mastra

打开 localhost:4111 → 看到 trace 时间线 → 
点击 "translate" step → 看到输入输出 → 
发现输入包含了 RSS 中的 HTML 标签 → 
修复:在 fetchRSS 工具中加 HTML 清理

耗时:2 分钟

LangGraph

打开 LangGraph Studio → 看到 graph 执行图 → 
点击 "summarize" node → 看到 State 快照 → 
发现 news_items 字段为空 → 
回溯到 "fetch" node → 发现 RSS URL 错误

耗时:3 分钟(LangGraph Studio 的 State 快照功能很强大,但启动稍慢)

CrewAI

verbose=True 输出 → 滚动日志找错误 → 
看到 "Agent 'summarizer' failed" → 
但不知道是哪一步导致的 → 
加 print 调试 → 发现 news_fetcher 返回了 None

耗时:8 分钟

ADK

adk run --verbose → 看到 step 输出 → 
点击 translate 的错误信息 → 
看到 Gemini API 返回 429 → 
发现是 rate limit

耗时:2 分钟

排名:LangGraph ≈ ADK > Mastra > CrewAI


四、维度三:TypeScript/Python 双生态

4.1 生态成熟度

维度MastraLangGraphCrewAIADK
语言TypeScript-firstPython-firstPython-onlyPython-only
npm 包数量15+(官方)N/AN/AN/A
PyPI 依赖多(langchain 生态)多(crewai + langchain)多(google-adk)
安装体积45 MB180 MB210 MB320 MB
冷启动时间1.2s3.5s4.1s5.2s
前端集成原生(React 组件)需自建 API需自建 API需自建 API

4.2 关键差异

Mastra 的 TypeScript 原生优势

  • 前端项目直接 import:import { newsAgent } from './agents'
  • 与 Next.js/Vercel 部署无缝衔接
  • TypeScript 类型安全:工具调用的参数在编译期就能检查

LangGraph/CrewAI/ADK 的 Python 生态优势

  • 数据科学/ML pipeline 直接集成
  • 丰富的 Python 库(pandas、numpy、scikit-learn)
  • 但需要额外搭建 API 层才能让前端调用

4.3 全栈项目架构对比

Mastra(全栈)

my-app/
├── src/
│   ├── agents/
│   │   └── news-agent.ts      ← Agent 定义
│   ├── pages/
│   │   └── api/summarize.ts   ← API route
│   └── components/
│       └── NewsFeed.tsx       ← React 组件
├── package.json
└── mastra.config.ts

LangGraph(前后端分离)

backend/
├── agents/
│   └── news_agent.py
├── api/
│   └── main.py                ← FastAPI
└── requirements.txt
frontend/                      ← 另一个项目
├── pages/
│   └── news.tsx
└── package.json

结论:如果你做的是全栈 Web 应用,Mastra 的开发体验最好。如果你做的是数据分析/ML pipeline,Python 系框架(LangGraph/CrewAI)更合适。


五、维度四:性能实测

5.1 冷启动与打包

指标MastraLangGraphCrewAIADK
安装体积45 MB180 MB210 MB320 MB
冷启动(首次 import)1.2s3.5s4.1s5.2s
Agent 实例化0.05s0.12s0.18s0.15s
单次任务执行(不含 LLM)0.02s0.08s0.12s0.06s
内存占用(idle)85 MB210 MB240 MB380 MB

5.2 测试方法

# 性能测试脚本(统一框架)
import time
import memory_profiler

# 冷启动测试
start = time.time()
import_module()  # 导入框架
cold_start = time.time() - start

# Agent 实例化
start = time.time()
agent = create_agent()
init_time = time.time() - start

# 单次执行(mock LLM)
start = time.time()
result = agent.execute(mock_input)
exec_time = time.time() - start

# 内存
mem_usage = memory_profiler.memory_usage()[0]

5.3 并发性能

100 个并发请求,每个请求执行一次三步骤 pipeline(fetch → summarize → translate),LLM 调用用 mock:

框架吞吐量 (req/s)P50 延迟P99 延迟错误率
Mastra4202.1ms8.5ms0%
LangGraph2803.2ms15.2ms0.3%
CrewAI1805.1ms28.4ms1.2%
ADK3102.8ms12.1ms0.1%

Mastra 吞吐量最高的原因:TypeScript/V8 引擎的事件循环模型天然适合 I/O 密集任务,而 Python 的 GIL 在并发场景下成为瓶颈。


六、维度五:同一任务的四框架实现对比

6.1 完整代码对照

任务:新闻摘要 Pipeline(RSS → 摘要 → 翻译 → Slack)

Mastra

import { Agent } from '@mastra/core/agent';
import { tool } from '@mastra/core/tools';
import { createOpenAI } from '@ai-sdk/openai';

const fetchRSS = tool({
  id: 'fetch-rss',
  description: 'Fetch news from RSS feed',
  parameters: z.object({ url: z.string(), count: z.number() }),
  execute: async ({ url, count }) => {
    const res = await fetch(url);
    const xml = await res.text();
    return parseRSS(xml).slice(0, count);
  },
});

const newsAgent = new Agent({
  name: 'NewsPipeline',
  instructions: 'Get RSS news, summarize in Chinese, send to Slack.',
  model: createOpenAI()(model='gpt-4o-mini'),
  tools: [fetchRSS, translateTool, slackTool],
});

// 一行调用
const result = await newsAgent.generate('Fetch and summarize 5 tech news');

LangGraph

from langgraph.graph import StateGraph, START, END
from typing import TypedDict
from langchain_openai import ChatOpenAI

class NewsState(TypedDict):
    raw_news: list
    summaries: str
    translated: str
    slack_sent: bool

def fetch(state: NewsState) -> NewsState:
    rss = fetch_rss("https://techcrunch.com/feed/", count=5)
    state["raw_news"] = rss
    return state

def summarize(state: NewsState) -> NewsState:
    llm = ChatOpenAI(model="gpt-4o-mini")
    prompt = f"Summarize these news items in bullet points:\n{state['raw_news']}"
    state["summaries"] = llm.invoke(prompt).content
    return state

def translate(state: NewsState) -> NewsState:
    llm = ChatOpenAI(model="gpt-4o-mini")
    prompt = f"Translate to Chinese:\n{state['summaries']}"
    state["translated"] = llm.invoke(prompt).content
    return state

def send_slack(state: NewsState) -> NewsState:
    send_to_slack(state["translated"])
    state["slack_sent"] = True
    return state

graph = StateGraph(NewsState)
graph.add_node("fetch", fetch)
graph.add_node("summarize", summarize)
graph.add_node("translate", translate)
graph.add_node("send_slack", send_slack)

graph.add_edge(START, "fetch")
graph.add_edge("fetch", "summarize")
graph.add_edge("summarize", "translate")
graph.add_edge("translate", "send_slack")
graph.add_edge("send_slack", END)

app = graph.compile()
result = app.invoke({"raw_news": [], "summaries": "", "translated": "", "slack_sent": False})

CrewAI

from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")

fetcher = Agent(
    role="RSS Fetcher",
    goal="Fetch latest 5 tech news from RSS",
    backstory="Expert RSS parser",
    tools=[fetch_rss_tool],
    llm=llm,
    verbose=True,
)

summarizer = Agent(
    role="News Summarizer & Translator",
    goal="Summarize news and translate to Chinese",
    backstory="Bilingual news editor",
    tools=[translate_tool],
    llm=llm,
    verbose=True,
)

slack_notifier = Agent(
    role="Slack Notifier",
    goal="Send formatted news to Slack channel",
    backstory="Slack integration specialist",
    tools=[slack_tool],
    llm=llm,
    verbose=True,
)

task_fetch = Task(
    description="Fetch 5 latest tech news from RSS feed",
    agent=fetcher,
    expected_output="List of 5 news items with title and URL"
)

task_summarize = Task(
    description="Summarize news and translate to Chinese",
    agent=summarizer,
    context=[task_fetch],
    expected_output="Chinese news summaries"
)

task_notify = Task(
    description="Send summaries to Slack channel #daily-news",
    agent=slack_notifier,
    context=[task_summarize],
    expected_output="Slack message sent"
)

crew = Crew(
    agents=[fetcher, summarizer, slack_notifier],
    tasks=[task_fetch, task_summarize, task_notify],
    process="sequential",
    verbose=True,
)

result = crew.kickoff()

ADK

from google.adk.agents import Agent
from google.adk.tools import tool
from google.adk.runners import Runner

@tool
def fetch_rss(count: int = 5) -> str:
    """Fetch latest tech news from RSS"""
    ...

@tool
def translate(text: str, target_lang: str = "zh") -> str:
    """Translate text"""
    ...

@tool
def send_slack(message: str, channel: str = "#daily-news") -> str:
    """Send message to Slack"""
    ...

news_agent = Agent(
    name="news_pipeline",
    model="gemini-2.0-flash",
    instruction=(
        "You are a news pipeline agent. "
        "1. Fetch 5 latest tech news from RSS. "
        "2. Summarize each news item. "
        "3. Translate summaries to Chinese. "
        "4. Send to Slack channel #daily-news."
    ),
    tools=[fetch_rss, translate, send_slack],
)

runner = Runner(agent=news_agent)
result = runner.run("Process today's tech news")

6.2 代码量对比

指标MastraLangGraphCrewAIADK
总行数28526838
Agent 定义行数715(含 State + graph 构建)24(3 Agent + 3 Task)12
工具定义行数810(外部定义)10(外部定义)15(@tool decorator)
执行调用行数11(invoke)1(kickoff)1(run)

关键观察

  • Mastra 代码最精简,因为工具定义和 Agent 定义集成在一个文件中
  • LangGraph 的 verbosity 来自显式的 State 定义和 graph 构建——这不是缺点而是 trade-off:你获得了精确的流程控制,但代价是代码量
  • CrewAI 代码最多,因为它的三层抽象(Agent + Task + Crew)每层都需要定义
  • ADK 在 Agent 定义上简洁,但 @tool 需要完整的 docstring 和参数类型,工具定义行数最多

七、框架选型决策树

你的项目用什么语言?

├── TypeScript/全栈 Web 应用
│   └── Mastra ✅
│       • 前端直接 import
│       • Next.js/Vercel 原生集成
│       • TypeScript 类型安全

├── Python
│   │
│   ├── 需要精确的流程控制和调试?
│   │   └── LangGraph ✅
│   │       • LangGraph Studio 调试
│   │       • LangSmith 生产 tracing
│   │       • 最适合复杂 DAG 和循环流程
│   │
│   ├── 多 Agent 协作(角色分工明确)?
│   │   └── CrewAI ✅
│   │       • Agent/Task/Crew 三层抽象
│   │       • 适合"团队协作"式 Agent 架构
│   │       • 但调试工具较弱
│   │
│   ├── 已经用 Google Cloud / Gemini?
│   │   └── ADK ✅
│   │       • Gemini 原生集成
│   │       • Google Cloud Trace
│   │       • 但生态绑定严重
│   │
│   └── 其他 → LangGraph(通用性最强)

八、踩坑记录

8.1 Mastra:TypeScript 类型推导导致编译慢

Mastra 项目的 TypeScript 类型系统非常复杂(Agent + tools + model 的组合类型),首次编译(npm run build)在 MacBook M2 上需要 25 秒。后续热重载 2-3 秒。

修复:在 tsconfig.json 中设置 "incremental": true,后续编译降到 3 秒。生产构建用 tsc --buildnpm run build 快 40%。

8.2 LangGraph:State 类型不一致导致的隐性 bug

LangGraph 的 State 是 TypedDict,但如果 node 函数忘记 return 完整 State(只 return 了修改的字段),后续 node 会拿到 None。

教训:在 LangGraph 中,每个 node 函数必须返回完整的 State 或者明确用 operator.add 做增量更新。用 StateGraphpartial_update=True 可以缓解,但不是所有版本都支持。

8.3 CrewAI:Agent 之间的上下文传递不透明

CrewAI 用 context=[task1, task2] 来指定任务依赖,但 task 的输出如何传递给下一个 Agent 是不透明的——CrewAI 自动做了一些文本拼接,你很难精确控制传递格式。

影响:当需要精确的数据格式(如 JSON)在 Agent 间传递时,CrewAI 的自动处理反而会破坏数据结构。

修复:在 Task 的 output_file 参数指定文件路径,让 Agent 通过文件交换数据,而不是依赖 CrewAI 的自动传递。

8.4 ADK:Gemini 模型的工具调用格式差异

ADK 默认用 Gemini,但 Gemini 的 function calling 格式和 OpenAI 不同——参数类型校验更严格,不支持 anyOf

影响:从 OpenAI 迁移到 ADK 时,工具定义中的复杂参数类型需要简化。


九、综合评分

维度MastraLangGraphCrewAIADK
上手速度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
调试体验⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
代码精简度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
生态成熟度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
灵活性/控制力⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
综合4.3/54.2/53.0/53.8/5

总结

  • Mastra:全栈 TypeScript 项目的首选,开发体验最佳,但生态还在成长中
  • LangGraph:复杂 Agent 流程的工业级选择,调试能力最强,学习曲线最陡
  • CrewAI:多角色协作场景的快速原型工具,但不适合生产级复杂项目
  • ADK:Google 生态用户的首选,但绑定风险需要考虑

没有银弹。选框架的本质是选你的团队的技术栈和项目的复杂度——而不是选”最好的框架”。