> Discover all available pages from the documentation index: https://mastra.zisheng.pro/ja/llms.txt # Astro プロジェクトに Mastra を統合する このガイドでは、Mastra を使用して Tool を呼び出す AI Agent を構築し、ルートから Agent を直接 import して呼び出すことで Astro に接続します。 [AI SDK UI](https://ai-sdk.dev/docs/ai-sdk-ui/overview) と [AI Elements](https://ai-sdk.dev/elements) を使用して、美しくインタラクティブなチャット体験を作成します。 > **注記:** このガイドでは Astro を React および完全なサーバーサイドレンダリング(SSR)と組み合わせる方法を示しますが、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/ja/models) の API キーが必要です。特に希望がなければ、[OpenAI](https://mastra.zisheng.pro/ja/models/providers/openai) を使用してください。 - Node.js `v22.13.0` 以降をインストールしてください ## 新しい Astro アプリを作成する(任意) Astro アプリがすでにある場合は、次の手順に進んでください。Astro アプリは次のようにセットアップされている必要があります。 - SSR を使用する(`astro.config.mjs` で `output: "server"` を指定) - [React integration](https://docs.astro.build/en/guides/integrations-guide/react/) を使用する - Tailwind をインストールする [オンデマンドレンダリング](https://docs.astro.build/en/guides/on-demand-rendering/)をサポートするため、このガイドでは [Node.js アダプター](https://docs.astro.build/en/guides/integrations-guide/node/)を使用しますが、サポートされている任意のサーバーアダプターを利用できます。 **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/ja/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 ``` これにより、天気 Agent のサンプルと次のファイルを含む `src/mastra` フォルダーが作成されます。 - `index.ts` - Memory を含む Mastra の設定 - `tools/weather-tool.ts` - 指定した場所の天気を取得する Tool - `agents/weather-agent.ts`- Tool を使用するプロンプトを備えた天気 Agent 次の手順では、Astro のルートから `weather-agent.ts` を呼び出します。 ## AI SDK UI と AI Elements をインストールする AI SDK UI と Mastra アダプターをインストールします。 **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` ルートはプロンプトを受け取り、Agent のレスポンスを AI SDK 形式でストリーミングします。一方、`GET` ルートは Memory からメッセージ履歴を取得し、クライアントの再読み込み時に 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` エンドポイントに接続し、そこへプロンプトを送信して、レスポンスをチャンク単位でストリーミングします。 レスポンスのテキストは [``](https://ai-sdk.dev/elements/components/message#messageresponse-) コンポーネントでレンダリングされ、Tool の呼び出しは [``](https://ai-sdk.dev/elements/components/tool) コンポーネントで表示されます。 ## チャットコンポーネントをレンダリングする 最後に、インデックスページでチャットコンポーネントをレンダリングします。`src/pages/index.astro` を編集します。 ```html --- import Chat from '@/components/chat'; --- Astro ``` `Chat` コンポーネントを import し、クライアント側で実行されるように `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/ja/docs/agents/overview) について詳しく学ぶ - Agent に独自の [Tool](https://mastra.zisheng.pro/ja/docs/agents/using-tools) を追加する - Agent に人間のような [Memory](https://mastra.zisheng.pro/ja/docs/memory/overview) を追加する 準備ができたら、Mastra と AI SDK UI の統合方法や、Agent を任意の場所へデプロイする方法について詳しく学びましょう。 - Mastra を [AI SDK UI](https://mastra.zisheng.pro/ja/guides/build-your-ui/ai-sdk-ui) と統合する - Agent を[任意の場所](https://mastra.zisheng.pro/ja/docs/deployment/overview)にデプロイする