メインコンテンツへ移動

toAISdkStream()

Mastra のストリーム(Agent、network、Workflow)を AI SDK 互換ストリームに変換します。Mastra のストリームを手動で変換し、AI SDK の createUIMessageStream() および createUIMessageStreamResponse() で使用する必要がある場合に、この関数を使用します。

これは、chatRoute()workflowRoute() など、Mastra が提供するルートヘルパーを使用せずにカスタムストリーミングエンドポイントを構築する場合に役立ちます。

toAISdkStream() では、既存の AI SDK v5 のデフォルト動作が維持されます。アプリが AI SDK v6 に対して型付けされている場合は、オプションオブジェクトで version: 'v6' を渡してください。

UI ストリームの構造化出力
UI ストリームの構造化出力への直接リンク

ソースとなる Agent ストリームに最終的な構造化出力オブジェクトが含まれている場合、toAISdkStream() はそれをカスタム AI SDK UI データパーツとして出力します。

{
"type": "data-structured-output",
"data": {
"object": {}
}
}

object フィールドには、構造化出力の完全な値が格納されます。これにより、Mastra の最終構造化出力チャンクが AI SDK UI ストリームにマッピングされます。部分的な構造化出力チャンクは出力されません。

使用例
使用例への直接リンク

Next.js App Router の例:

app/api/chat/route.ts
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()originalMessagesmessages を渡します。詳しくは、トラブルシューティング:アシスタントメッセージの繰り返しを参照してください。

パラメーター
パラメーターへの直接リンク

第 1 パラメーターは、変換する Mastra ストリームです。次のいずれかを指定できます。

  • MastraModelOutput - agent.stream() からの Agent ストリーム
  • MastraAgentNetworkStream - agent.network() からのネットワークストリーム
  • MastraWorkflowStream または WorkflowRunOutput - Workflow ストリーム

第 2 パラメーターはオプションオブジェクトです。

version?:

'v5' | 'v6'
= 'v5'
出力する AI SDK ストリームコントラクトを選択します。既存のデフォルト動作を使用するには、省略するか 'v5' を渡します。アプリが AI SDK v6 のレスポンスヘルパーに対して型付けされている場合は、'v6' を渡します。

from:

'agent' | 'network' | 'workflow'
= 'agent'
変換する Mastra ストリームの種類。

lastMessageId?:

string
(Agent のみ)会話内の最後のメッセージの ID。

sendStart?:

boolean
= true
(Agent のみ)ストリームで開始イベントを送信するかどうか。

sendFinish?:

boolean
= true
(Agent のみ)ストリームで終了イベントを送信するかどうか。

sendReasoning?:

boolean
= false
(Agent のみ)ストリームに reasoning-delta チャンクを含めるかどうか。拡張思考をサポートするモデルから推論コンテンツをストリーミングするには、true に設定します。

sendSources?:

boolean
= false
(Agent のみ)出力にソースの引用を含めるかどうか。

includeTextStreamParts?:

boolean
= true
(Workflow のみ)出力にテキストストリームパーツを含めるかどうか。

messageMetadata?:

(options: { part: UIMessageStreamPart }) => Record<string, unknown> | undefined
(Agent のみ)現在のストリームパーツを受け取り、開始チャンクと終了チャンクに付加するメタデータを返す関数。

onError?:

(error: unknown) => string
(Agent のみ)ストリーム変換中のエラーを処理する関数。エラーを受け取り、その文字列表現を返す必要があります。

例への直接リンク

Workflow ストリームを変換する
Workflow ストリームを変換するへの直接リンク

app/api/workflow/route.ts
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,
})
}

ネットワークストリームを変換する
ネットワークストリームを変換するへの直接リンク

app/api/network/route.ts
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 ストリームを変換する
推論を有効にして Agent ストリームを変換するへの直接リンク

app/api/reasoning/route.ts
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 ストリームを変換する
AI SDK v6 向けに Agent ストリームを変換するへの直接リンク

app/api/chat-v6/route.ts
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 を使用する
using-messagemetadataへの直接リンク

app/api/chat-with-metadata/route.ts
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 形式に変換する場合:

client-stream-to-ai-sdk.ts
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<ChunkType>
const chunkStream = new ReadableStream<ChunkType>({
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)
}