> Discover all available pages from the documentation index: https://mastra.zisheng.pro/llms.txt # 在 Next.js 项目中集成 Mastra 本指南将介绍如何使用 Mastra 构建一个可调用 Tool 的 AI Agent,然后通过路由直接导入并调用该 Agent,将其连接到 Next.js。 你将使用 [AI SDK UI](https://ai-sdk.dev/docs/ai-sdk-ui/overview) 和 [AI Elements](https://ai-sdk.dev/elements) 创建美观的交互式聊天体验。 ## 开始之前 - 你需要受支持的[模型 Provider](https://mastra.zisheng.pro/models)所提供的 API 密钥。如果没有偏好,请使用 [OpenAI](https://mastra.zisheng.pro/models/providers/openai)。 - 安装 Node.js `v22.13.0` 或更高版本 ## 创建新的 Next.js 应用(可选) 如果已有 Next.js 应用,请跳到下一步。 运行以下命令以[创建新的 Next.js 应用](https://nextjs.org/docs/app/getting-started/installation): **npm**: ```bash npx create-next-app@latest my-nextjs-agent --yes --ts --eslint --tailwind --src-dir --app --turbopack --no-react-compiler --no-import-alias ``` **pnpm**: ```bash pnpm dlx create-next-app@latest my-nextjs-agent --yes --ts --eslint --tailwind --src-dir --app --turbopack --no-react-compiler --no-import-alias ``` **Yarn**: ```bash yarn dlx create-next-app@latest my-nextjs-agent --yes --ts --eslint --tailwind --src-dir --app --turbopack --no-react-compiler --no-import-alias ``` **Bun**: ```bash bun x create-next-app@latest my-nextjs-agent --yes --ts --eslint --tailwind --src-dir --app --turbopack --no-react-compiler --no-import-alias ``` 这会创建名为 `my-nextjs-agent` 的项目,你也可以将其替换为任意名称。 ## 初始化 Mastra 进入 Next.js 项目: ```bash cd my-nextjs-agent ``` 运行 [`mastra init`](https://mastra.zisheng.pro/reference/cli/mastra)。出现提示时,选择 Provider(例如 OpenAI)并输入密钥: **npm**: ```bash npx mastra@latest init ``` **pnpm**: ```bash pnpm dlx mastra@latest init ``` **Yarn**: ```bash yarn dlx mastra@latest init ``` **Bun**: ```bash bun x mastra@latest init ``` 这会创建一个 `src/mastra` 文件夹,其中包含示例天气 Agent 和以下文件: - `index.ts` - Mastra 配置,包括 memory - `tools/weather-tool.ts` - 获取指定位置天气的 Tool - `agents/weather-agent.ts`- 使用该 Tool 的天气 Agent 及其提示词 接下来,你会从 Next.js 路由调用 `weather-agent.ts`。 > **将 Studio 与 Next.js 一起使用:** 如果希望同时运行 [Studio](https://mastra.zisheng.pro/docs/studio/overview) 和 Next.js 应用,并让二者共享同一数据库,请更新 `src/mastra/index.ts` 中的存储 URL,使用绝对路径: > > ```typescript > url: 'file:/absolute/path/to/your/project/mastra.db' > ``` > > 相对路径会根据各进程的工作目录进行解析,而 `next dev` 和 `mastra dev` 的工作目录不同。 ## 安装 AI SDK UI 和 AI Elements 安装 AI SDK UI 和 Mastra adapter: **npm**: ```bash npm install @mastra/ai-sdk@latest @ai-sdk/react ai ``` **pnpm**: ```bash pnpm add @mastra/ai-sdk@latest @ai-sdk/react ai ``` **Yarn**: ```bash yarn add @mastra/ai-sdk@latest @ai-sdk/react ai ``` **Bun**: ```bash bun add @mastra/ai-sdk@latest @ai-sdk/react ai ``` 接下来初始化 AI Elements。出现提示时请选择默认选项: **npm**: ```bash npx ai-elements@latest ``` **pnpm**: ```bash pnpm dlx ai-elements@latest ``` **Yarn**: ```bash yarn dlx ai-elements@latest ``` **Bun**: ```bash bun x ai-elements@latest ``` 这会将完整的 AI Elements UI 组件库下载到 `@/components/ai-elements` 文件夹。 ## 创建聊天路由 创建 `src/app/api/chat/route.ts`: ```ts import { handleChatStream } from '@mastra/ai-sdk' import { toAISdkV5Messages } from '@mastra/ai-sdk/ui' import { createUIMessageStreamResponse } from 'ai' import { mastra } from '@/mastra' import { NextResponse } from 'next/server' const THREAD_ID = 'example-user-id' const RESOURCE_ID = 'weather-chat' export async function POST(req: Request) { const params = await req.json() const stream = await handleChatStream({ mastra, agentId: 'weather-agent', params: { ...params, memory: { ...params.memory, thread: THREAD_ID, resource: RESOURCE_ID, }, }, }) return createUIMessageStreamResponse({ stream }) } export async function GET() { const memory = await mastra.getAgentById('weather-agent').getMemory() let response = null try { response = await memory?.recall({ threadId: THREAD_ID, resourceId: RESOURCE_ID, }) } catch { console.log('No previous messages found.') } const uiMessages = toAISdkV5Messages(response?.messages || []) return NextResponse.json(uiMessages) } ``` `POST` 路由接受提示词,并以 AI SDK 格式流式返回 Agent 响应;`GET` 路由则从 memory 获取消息历史,以便客户端重新加载时恢复 UI 状态。 ## 创建聊天页面 创建 `src/app/chat/page.tsx`: ```tsx 'use client' import '@/app/globals.css' import { useEffect, useState } from 'react' import { DefaultChatTransport, ToolUIPart } from 'ai' import { useChat } from '@ai-sdk/react' import { PromptInput, PromptInputBody, PromptInputTextarea, } from '@/components/ai-elements/prompt-input' import { Conversation, ConversationContent, ConversationScrollButton, } from '@/components/ai-elements/conversation' import { Message, MessageContent, MessageResponse } from '@/components/ai-elements/message' import { Tool, ToolHeader, ToolContent, ToolInput, ToolOutput } from '@/components/ai-elements/tool' function Chat() { const [input, setInput] = useState('') const { messages, setMessages, sendMessage, status } = useChat({ transport: new DefaultChatTransport({ api: '/api/chat', }), }) useEffect(() => { const fetchMessages = async () => { const res = await fetch('/api/chat') const data = await res.json() setMessages([...data]) } fetchMessages() }, [setMessages]) const handleSubmit = async () => { if (!input.trim()) return sendMessage({ text: input }) setInput('') } return (
{messages.map(message => (
{message.parts?.map((part, i) => { if (part.type === 'text') { return ( {part.text} ) } if (part.type?.startsWith('tool-')) { return ( ) } return null })}
))}
setInput(e.target.value)} className="md:leading-10" value={input} placeholder="Type your message..." disabled={status !== 'ready'} />
) } export default Chat ``` 此组件将 [`useChat()`](https://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat) 连接到 `api/chat` 端点,把提示词发送到该端点,并分块流式返回响应。 它使用 [``](https://ai-sdk.dev/elements/components/message#messageresponse-) 组件渲染响应文本,并使用 [``](https://ai-sdk.dev/elements/components/tool) 组件显示所有 Tool 调用。 ## 测试 Agent 1. 使用 `npm run dev` 运行 Next.js 应用 2. 打开聊天页面: 3. 尝试询问天气。如果 API 密钥配置正确,你会收到响应 ## 后续步骤 恭喜你使用 Next.js 构建了 Mastra Agent!🎉 接下来,你可以使用自己的 Tool 和逻辑扩展项目: - 进一步了解 [Agent](https://mastra.zisheng.pro/docs/agents/overview) - 为 Agent 添加自己的 [Tool](https://mastra.zisheng.pro/docs/agents/using-tools) - 为 Agent 添加类似人类的 [memory](https://mastra.zisheng.pro/docs/memory/overview) 准备就绪后,可进一步了解 Mastra 与 AI SDK UI 和 Next.js 的集成方式,以及如何将 Agent 部署到包括 Vercel 在内的任意位置: - 将 Mastra 与 [AI SDK UI](https://mastra.zisheng.pro/guides/build-your-ui/ai-sdk-ui) 集成 - 将 Agent 部署到 [Vercel](https://mastra.zisheng.pro/guides/deployment/vercel) - 将 Agent [部署到任意位置](https://mastra.zisheng.pro/docs/deployment/overview)