作为一个写了多年 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 后,我的感受是:

迁移过程大约花了半天,主要是重新定义工具和工作流。Mastra 的文档很清晰,迁移指南也有,但有些边缘场景(比如自定义 model provider)的文档还不够完善。

局限性

公平地说,Mastra 也有一些不足:

谁应该用 Mastra?

Mastra 最适合这些人:

26K Star 说明 TypeScript 社区对它的认可。如果你是前端开发者,想构建 Agent 应用,Mastra 是 2026 年最好的选择

🔗 GitHub: mastra-ai/mastra  |  官网: mastra.ai