作为一个写了多年 TypeScript 的前端开发者,我在用 LangChain.js 构建 Agent 时,最大的痛苦不是逻辑复杂,而是类型系统的缺失。每次调用 agent.call(),返回值都是 any。每次定义工具,输入输出的类型都是手动断言。每次写工作流,步骤之间的数据传递全靠祈祷。直到我遇到了 Mastra——一个 TypeScript 原生的 AI Agent 框架,26K Star,专为前端开发者设计。
为什么 TypeScript 需要自己的 Agent 框架?
这个问题很关键。Python 有 LangChain(72K Star)、CrewAI(25K Star)、AutoGen(38K Star),生态已经很成熟了。为什么 TypeScript 还需要自己的框架?
答案很简单:前端和后端的 Agent 应用场景不同。Python 的 Agent 框架擅长数据处理、模型训练、批量推理。但如果你要构建一个在 Next.js 里运行的 Agent 应用——一个需要实时流式响应、需要在浏览器端渲染、需要跟 React 状态管理集成的应用——Python 框架就力不从心了。
更关键的是类型安全。TypeScript 的类型系统不仅仅是"代码补全",它是编译时的正确性保证。当你的 Agent 定义了 10 个工具,每个工具有不同的输入输出,如果类型不匹配,编译器会在你运行之前就告诉你。这在生产环境中是救命的。
核心架构:五大模块,浑然一体
Mastra 的架构围绕五个核心概念构建:
1. Agents — 智能体
Agent 是 Mastra 的核心抽象。一个 Agent 有模型、系统提示、工具集、记忆等属性。但跟其他框架不同的是,Mastra 的 Agent 定义是完全类型安全的:
import { Agent } from '@mastra/core/agent';
import { openai } from '@ai-sdk/openai';
const assistant = new Agent({
name: 'customer-support',
model: openai('gpt-4o'),
instructions: '你是一个专业的客户服务助手。',
tools: {
searchKnowledge: searchKnowledgeTool,
createTicket: createTicketTool,
getOrderStatus: getOrderStatusTool,
},
});
// 类型安全的调用 — 返回值有完整的类型推断
const response = await assistant.generate(
'我的订单 #12345 什么时候发货?'
);
console.log(response.text); // TypeScript 知道这里一定是 string
2. Workflows — 工作流
这是 Mastra 最强大的功能之一。工作流让你把多个步骤串联起来,每个步骤之间的数据传递是类型安全的:
import { Workflow, Step } from '@mastra/core/workflows';
const researchWorkflow = new Workflow({
name: 'content-research',
triggerSchema: z.object({
topic: z.string(),
depth: z.enum(['quick', 'thorough']),
}),
})
.step('search', {
execute: async ({ context }) => {
const results = await searchWeb(context.trigger.topic);
return { sources: results }; // 返回类型自动推断
},
})
.step('analyze', {
execute: async ({ context }) => {
// context.steps.search.sources 是类型安全的
const analysis = await llm.analyze(context.steps.search.sources);
return { summary: analysis };
},
})
.step('write', {
execute: async ({ context }) => {
// context.steps.analyze.summary 是类型安全的
const article = await llm.write(context.steps.analyze.summary);
return { content: article };
},
})
.commit();
3. Tools — 工具调用
Mastra 的工具定义使用 Zod schema,天然类型安全:
import { createTool } from '@mastra/core/tools';
import { z } from 'zod';
const weatherTool = createTool({
id: 'get-weather',
description: '获取指定城市的天气信息',
inputSchema: z.object({
city: z.string().describe('城市名称'),
unit: z.enum(['celsius', 'fahrenheit']).default('celsius'),
}),
outputSchema: z.object({
temperature: z.number(),
condition: z.string(),
humidity: z.number(),
}),
execute: async ({ context }) => {
const data = await fetchWeather(context.city, context.unit);
return {
temperature: data.temp,
condition: data.condition,
humidity: data.humidity,
};
},
});
4. Memory — 记忆系统
Mastra 内置了记忆系统,支持短期记忆(对话历史)和长期记忆(用户偏好、知识积累):
import { Memory } from '@mastra/memory';
const memory = new Memory({
// 短期记忆:最近 20 条对话
lastMessages: 20,
// 长期记忆:基于语义搜索
semanticRecall: {
topK: 5,
messageRange: 2,
},
// 工作记忆:结构化的用户偏好
workingMemory: {
enabled: true,
template: `
<user>
<name></name>
<preferences></preferences>
<context></context>
</user>
`,
},
});
5. MCP — Model Context Protocol
Mastra 原生支持 Anthropic 的 MCP 协议,可以无缝接入 MCP 服务器提供的工具:
import { MCPClient } from '@mastra/mcp';
const mcp = new MCPClient({
servers: {
filesystem: {
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-filesystem', '/path'],
},
github: {
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-github'],
env: { GITHUB_TOKEN: process.env.GITHUB_TOKEN },
},
},
});
// 自动发现并注册 MCP 工具
const mcpTools = await mcp.getTools();
const agent = new Agent({
name: 'dev-assistant',
model: openai('gpt-4o'),
tools: { ...mcpTools },
});
跟 Vercel AI SDK / LangChain.js 的对比
Vercel AI SDK vs Mastra
Vercel AI SDK(约 15K Star)是一个很好的 AI 工具库,但它更偏向于UI 层的集成——streaming、useChat hook、RSC 等。它没有内置的工作流编排、记忆系统、MCP 支持。Mastra 的定位是全栈 Agent 框架,从 Agent 定义到工作流编排到部署,一条龙。如果你只需要在 Next.js 里调用 LLM,Vercel AI SDK 够用;如果你要构建复杂的 Agent 应用,Mastra 更合适。
LangChain.js vs Mastra
LangChain.js 是 Python LangChain 的移植版,它的问题很明显:不是 TypeScript 原生的。类型推断差、API 设计受 Python 风格影响、跟 Next.js 生态集成不好。Mastra 从头开始用 TypeScript 设计,Zod schema、类型推断、模块化架构都是 TypeScript 风格的。如果你是 TypeScript 开发者,Mastra 的开发体验好一个量级。
Next.js 集成:一等公民
Mastra 跟 Next.js 的集成做到了"一等公民"级别:
// app/api/chat/route.ts
import { mastra } from '@/mastra';
export async function POST(req: Request) {
const { message } = await req.json();
const agent = mastra.getAgent('customer-support');
const stream = await agent.stream(message);
return stream.toDataStreamResponse();
}
// app/page.tsx (客户端)
'use client';
import { useChat } from 'ai/react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit } = useChat({
api: '/api/chat',
});
return (
<div>
{messages.map(m => (
<div key={m.id}>{m.content}</div>
))}
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleInputChange} />
</form>
</div>
);
}
注意:Mastra 的 stream 可以直接转换为 Vercel AI SDK 的 data stream 格式,两者可以共存,不是非此即彼的关系。
实际使用体验:我迁移了一个 LangChain.js 项目
我有一个用 LangChain.js 写的客服 Agent,功能包括:多轮对话、工具调用(查询订单、创建工单)、RAG 检索知识库。迁移到 Mastra 后,我的感受是:
- 代码量减少约 30%:主要是类型声明和工具定义的代码
- 类型安全提升巨大:编译器帮我发现了 3 个潜在的类型错误
- 开发体验改善:IDE 的代码补全从"猜"变成了"知道"
- 调试更容易:Mastra 的日志和 tracing 比 LangChain.js 清晰很多
- 工作流编排:之前用 Chain 实现的复杂流程,现在用 Workflow 更直观
迁移过程大约花了半天,主要是重新定义工具和工作流。Mastra 的文档很清晰,迁移指南也有,但有些边缘场景(比如自定义 model provider)的文档还不够完善。
局限性
公平地说,Mastra 也有一些不足:
- 模型支持:虽然支持主流 provider,但一些小众模型的适配不如 LangChain.js 完善
- 社区规模:26K Star vs LangChain 的 72K Star,社区资源和第三方集成少一些
- Python 互操作:如果你的团队同时用 Python 和 TypeScript,Mastra 没有 Python SDK
- 学习曲线:对于习惯了 LangChain 的开发者,Mastra 的抽象方式需要适应
谁应该用 Mastra?
Mastra 最适合这些人:
- TypeScript 全栈开发者:尤其是 Next.js 用户,想要类型安全的 Agent 开发体验
- 前端团队:不想学 Python,想在自己的技术栈里构建 AI 应用
- 需要工作流编排的项目:Mastra 的 Workflow 比 LangChain.js 的 Chain 好用太多
- 追求代码质量的团队:类型安全不是锦上添花,是生产环境的必需品
26K Star 说明 TypeScript 社区对它的认可。如果你是前端开发者,想构建 Agent 应用,Mastra 是 2026 年最好的选择。