> Discover all available pages from the documentation index: https://mastra.zisheng.pro/ja/llms.txt # toAISdkStream() Mastra のストリーム(Agent、network、Workflow)を AI SDK 互換ストリームに変換します。Mastra のストリームを手動で変換し、AI SDK の `createUIMessageStream()` および `createUIMessageStreamResponse()` で使用する必要がある場合に、この関数を使用します。 これは、[`chatRoute()`](https://mastra.zisheng.pro/ja/reference/ai-sdk/chat-route) や [`workflowRoute()`](https://mastra.zisheng.pro/ja/reference/ai-sdk/workflow-route) など、Mastra が提供するルートヘルパーを使用せずにカスタムストリーミングエンドポイントを構築する場合に役立ちます。 `toAISdkStream()` では、既存の AI SDK v5 のデフォルト動作が維持されます。アプリが AI SDK v6 に対して型付けされている場合は、オプションオブジェクトで `version: 'v6'` を渡してください。 ## UI ストリームの構造化出力 ソースとなる Agent ストリームに最終的な構造化出力オブジェクトが含まれている場合、`toAISdkStream()` はそれをカスタム AI SDK UI データパーツとして出力します。 ```json { "type": "data-structured-output", "data": { "object": {} } } ``` `object` フィールドには、構造化出力の完全な値が格納されます。これにより、Mastra の最終構造化出力チャンクが AI SDK UI ストリームにマッピングされます。部分的な構造化出力チャンクは出力されません。 ## 使用例 Next.js App Router の例: ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { messages } = await req.json() const myAgent = mastra.getAgent('weatherAgent') const stream = await myAgent.stream(messages) const uiMessageStream = createUIMessageStream({ originalMessages: messages, execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'agent' })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` > **ヒント:** UI でアシスタントメッセージが重複しないようにするには、`createUIMessageStream()` の `originalMessages` に `messages` を渡します。詳しくは、[トラブルシューティング:アシスタントメッセージの繰り返し](https://ai-sdk.dev/docs/troubleshooting/repeated-assistant-messages)を参照してください。 ## パラメーター 第 1 パラメーターは、変換する Mastra ストリームです。次のいずれかを指定できます。 - `MastraModelOutput` - `agent.stream()` からの Agent ストリーム - `MastraAgentNetworkStream` - `agent.network()` からのネットワークストリーム - `MastraWorkflowStream` または `WorkflowRunOutput` - Workflow ストリーム 第 2 パラメーターはオプションオブジェクトです。 **version** (`'v5' | 'v6'`): 出力する AI SDK ストリームコントラクトを選択します。既存のデフォルト動作を使用するには、省略するか 'v5' を渡します。アプリが AI SDK v6 のレスポンスヘルパーに対して型付けされている場合は、'v6' を渡します。 (Default: `'v5'`) **from** (`'agent' | 'network' | 'workflow'`): 変換する Mastra ストリームの種類。 (Default: `'agent'`) **lastMessageId** (`string`): (Agent のみ)会話内の最後のメッセージの ID。 **sendStart** (`boolean`): (Agent のみ)ストリームで開始イベントを送信するかどうか。 (Default: `true`) **sendFinish** (`boolean`): (Agent のみ)ストリームで終了イベントを送信するかどうか。 (Default: `true`) **sendReasoning** (`boolean`): (Agent のみ)ストリームに reasoning-delta チャンクを含めるかどうか。拡張思考をサポートするモデルから推論コンテンツをストリーミングするには、true に設定します。 (Default: `false`) **sendSources** (`boolean`): (Agent のみ)出力にソースの引用を含めるかどうか。 (Default: `false`) **includeTextStreamParts** (`boolean`): (Workflow のみ)出力にテキストストリームパーツを含めるかどうか。 (Default: `true`) **messageMetadata** (`(options: { part: UIMessageStreamPart }) => Record | undefined`): (Agent のみ)現在のストリームパーツを受け取り、開始チャンクと終了チャンクに付加するメタデータを返す関数。 **onError** (`(error: unknown) => string`): (Agent のみ)ストリーム変換中のエラーを処理する関数。エラーを受け取り、その文字列表現を返す必要があります。 ## 例 ### Workflow ストリームを変換する ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { input } = await req.json() const workflow = mastra.getWorkflow('myWorkflow') const run = workflow.createRun() const stream = await run.stream({ inputData: input }) const uiMessageStream = createUIMessageStream({ execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'workflow' })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` ### ネットワークストリームを変換する ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { messages } = await req.json() const routingAgent = mastra.getAgent('routingAgent') const stream = await routingAgent.network(messages) const uiMessageStream = createUIMessageStream({ execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'network' })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` ### 推論を有効にして Agent ストリームを変換する ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { messages } = await req.json() const reasoningAgent = mastra.getAgent('reasoningAgent') const stream = await reasoningAgent.stream(messages, { providerOptions: { openai: { reasoningEffort: 'high' }, }, }) const uiMessageStream = createUIMessageStream({ originalMessages: messages, execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'agent', sendReasoning: true, })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` ### AI SDK v6 向けに Agent ストリームを変換する ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { messages } = await req.json() const myAgent = mastra.getAgent('weatherAgent') const stream = await myAgent.stream(messages) const uiMessageStream = createUIMessageStream({ originalMessages: messages, execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'agent', version: 'v6', })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` ### `messageMetadata` を使用する ```typescript import { mastra } from '../../mastra' import { createUIMessageStream, createUIMessageStreamResponse } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' export async function POST(req: Request) { const { messages } = await req.json() const myAgent = mastra.getAgent('weatherAgent') const stream = await myAgent.stream(messages) const uiMessageStream = createUIMessageStream({ originalMessages: messages, execute: async ({ writer }) => { for await (const part of toAISdkStream(stream, { from: 'agent', messageMetadata: ({ part }) => ({ timestamp: Date.now(), partType: part.type, }), })) { await writer.write(part) } }, }) return createUIMessageStreamResponse({ stream: uiMessageStream, }) } ``` ### クライアント側でストリームを変換する クライアント側で Mastra クライアント SDK(`@mastra/client-js`)を使用していて、ストリームを AI SDK 形式に変換する場合: ```typescript import { MastraClient } from '@mastra/client-js' import { createUIMessageStream } from 'ai' import { toAISdkStream } from '@mastra/ai-sdk' import type { ChunkType, MastraModelOutput } from '@mastra/core/stream' const client = new MastraClient({ baseUrl: 'http://localhost:4111', }) const agent = client.getAgent('weatherAgent') const response = await agent.stream('What is the weather in Tokyo?') // Convert the client SDK stream to a ReadableStream const chunkStream = new ReadableStream({ async start(controller) { await response.processDataStream({ onChunk: async chunk => { controller.enqueue(chunk) }, }) controller.close() }, }) // Transform to AI SDK format const uiMessageStream = createUIMessageStream({ execute: async ({ writer }) => { for await (const part of toAISdkStream(chunkStream as unknown as MastraModelOutput, { from: 'agent', })) { await writer.write(part) } }, }) for await (const part of uiMessageStream) { console.log(part) } ```