> Discover all available pages from the documentation index: https://mastra.zisheng.pro/zh-HK/llms.txt # 在 Astro 項目中整合 Mastra 在本指南中,你會使用 Mastra 建立一個可呼叫 Tool 的 AI Agent,然後在路由中直接匯入並呼叫該 Agent,將它連接至 Astro。 你會使用 [AI SDK UI](https://ai-sdk.dev/docs/ai-sdk-ui/overview) 和 [AI Elements](https://ai-sdk.dev/elements),建立美觀且具互動性的聊天體驗。 > **備註:** 本指南會示範如何配合 React 和完整伺服器端算繪(SSR)使用 Astro,但 Astro 與 Mastra 的配搭方式還有很多。你可以針對個別檔案[選用 SSR](https://docs.astro.build/en/guides/on-demand-rendering/#enabling-on-demand-rendering),亦可使用 Svelte、Vue、Solid 或 Preact 等其他框架。你可以使用 Astro 建立聊天介面,並[以 Astro 原生方式](https://docs.astro.build/en/recipes/call-endpoints/)呼叫端點。 ## 開始之前 - 你需要一個受支援 [Provider](https://mastra.zisheng.pro/zh-HK/models) 的 API 金鑰。如沒有偏好,可使用 [OpenAI](https://mastra.zisheng.pro/zh-HK/models/providers/openai)。 - 安裝 Node.js `v22.13.0` 或更新版本 ## 建立新的 Astro 應用程式(可選) 如果你已有 Astro 應用程式,可跳至下一步。你的 Astro 應用程式應按以下方式設定: - 使用 SSR(在 `astro.config.mjs` 中設定 `output: "server"`) - 使用 [React 整合](https://docs.astro.build/en/guides/integrations-guide/react/) - 已安裝 Tailwind 為支援[按需算繪](https://docs.astro.build/en/guides/on-demand-rendering/),本指南會使用 [Node.js adapter](https://docs.astro.build/en/guides/integrations-guide/node/),但任何受支援的伺服器 adapter 均可使用。 **npm**: ```bash npm create astro@latest mastra-astro -- --add node --add react --add tailwind --install --skip-houston --template minimal --git ``` **pnpm**: ```bash pnpm create astro mastra-astro --add node --add react --add tailwind --install --skip-houston --template minimal --git ``` **Yarn**: ```bash yarn create astro mastra-astro --add node --add react --add tailwind --install --skip-houston --template minimal --git ``` **Bun**: ```bash bunx create-astro mastra-astro --add node --add react --add tailwind --install --skip-houston --template minimal --git ``` 這會建立名為 `mastra-astro` 的項目,你亦可換成任何想用的名稱。 使用 `cd` 進入項目,然後編輯 `astro.config.mjs` 檔案,將 [`output` 設定](https://docs.astro.build/en/reference/configuration-reference/#output)設為 `"server"`: ```js // @ts-check import { defineConfig } from 'astro/config' import node from '@astrojs/node' import react from '@astrojs/react' import tailwindcss from '@tailwindcss/vite' // https://astro.build/config export default defineConfig({ output: 'server', adapter: node({ mode: 'standalone', }), integrations: [react()], vite: { plugins: [tailwindcss()], }, }) ``` 編輯 `tsconfig.json` 以解析路徑: ```jsonc { "compilerOptions": { // ... "baseUrl": ".", "paths": { "@/*": ["./src/*"], }, // ... }, } ``` ## 初始化 Mastra 執行 [`mastra init`](https://mastra.zisheng.pro/zh-HK/reference/cli/mastra)。出現提示時,選擇一個 Provider(例如 OpenAI)並輸入 API 金鑰: **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 設定,包括記憶 - `tools/weather-tool.ts` - 用來擷取指定地點天氣的 Tool - `agents/weather-agent.ts`- 天氣 Agent,其 prompt 會使用該 Tool 在接下來的步驟中,你會從 Astro 路由呼叫 `weather-agent.ts`。 ## 安裝 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/pages/api/chat.ts`: ```ts import type { APIRoute } from 'astro' import { handleChatStream } from '@mastra/ai-sdk' import { toAISdkV5Messages } from '@mastra/ai-sdk/ui' import { createUIMessageStreamResponse } from 'ai' import { mastra } from '@/mastra' const THREAD_ID = 'example-user-id' const RESOURCE_ID = 'weather-chat' export const POST: APIRoute = async ({ request }) => { const params = await request.json() const stream = await handleChatStream({ mastra, agentId: 'weather-agent', params: { ...params, memory: { ...params.memory, thread: THREAD_ID, resource: RESOURCE_ID, }, }, }) return createUIMessageStreamResponse({ stream }) } export const GET: APIRoute = async () => { 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 Response.json(uiMessages) } ``` `POST` 路由會接收 prompt,並以 AI SDK 格式串流傳回 Agent 的回應;`GET` 路由則會從記憶擷取訊息記錄,讓客戶端重新載入時可還原 UI 狀態。 ## 建立聊天元件 建立 `src/components/chat.tsx`: ```tsx import '@/styles/global.css' import { useEffect, useState } from 'react' import { DefaultChatTransport, type 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` 端點,把 prompt 傳送至該端點,並以分段串流方式接收回應。 它會使用 [``](https://ai-sdk.dev/elements/components/message#messageresponse-) 元件算繪回應文字,並透過 [``](https://ai-sdk.dev/elements/components/tool) 元件顯示所有 Tool 呼叫。 ## 算繪聊天元件 最後一步是在首頁算繪聊天元件。編輯 `src/pages/index.astro`: ```html --- import Chat from '@/components/chat'; --- Astro ``` 匯入 `Chat` 元件,並使用 `client:load` [指令](https://docs.astro.build/en/reference/directives-reference/#client-directives)將它加入 body,使其在客戶端執行。 ## 測試你的 Agent 1. 使用 `npm run dev` 執行 Astro 應用程式 2. 在 開啟聊天介面 3. 嘗試查詢天氣。如果 API 金鑰設定正確,你便會收到回應 ## 下一步 恭喜你使用 Astro 建立了 Mastra Agent!🎉 接下來,你可以使用自己的 Tool 和邏輯擴充項目: - 進一步了解 [Agent](https://mastra.zisheng.pro/zh-HK/docs/agents/overview) - 為 Agent 加入專屬 [Tool](https://mastra.zisheng.pro/zh-HK/docs/agents/using-tools) - 為 Agent 加入仿如人類的[記憶](https://mastra.zisheng.pro/zh-HK/docs/memory/overview) 準備好後,你可以進一步了解 Mastra 如何與 AI SDK UI 整合,以及如何將 Agent 部署至任何地方: - 將 Mastra 與 [AI SDK UI](https://mastra.zisheng.pro/zh-HK/guides/build-your-ui/ai-sdk-ui) 整合 - 將 Agent 部署至[任何地方](https://mastra.zisheng.pro/zh-HK/docs/deployment/overview)