toAISdkStream()
Converts Mastra streams (agent, network, or workflow) to AI SDK-compatible streams. Use this function when you need to manually transform Mastra streams for use with AI SDK's createUIMessageStream() and createUIMessageStreamResponse().
This is useful when building custom streaming endpoints outside Mastra's provided route helpers such as chatRoute() or workflowRoute().
toAISdkStream() keeps the existing AI SDK v5/default behavior. If your app is typed against AI SDK v6, pass version: 'v6' in the options object.
Structured output in UI streamsStructured output in UI streams的直接链接
When the source agent stream includes a final structured output object, toAISdkStream() emits it as a custom AI SDK UI data part:
{
"type": "data-structured-output",
"data": {
"object": {}
}
}
The object field contains your full structured output value. This maps Mastra's final structured output chunk into the AI SDK UI stream. Partial structured output chunks aren't emitted.
Usage exampleUsage example的直接链接
Next.js App Router example:
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,
})
}
Pass messages to originalMessages in createUIMessageStream() to avoid duplicated assistant messages in the UI. See Troubleshooting: Repeated Assistant Messages for details.
ParametersParameters的直接链接
The first parameter is the Mastra stream to convert. It can be one of:
MastraModelOutput- An agent stream fromagent.stream()MastraAgentNetworkStream- A network stream fromagent.network()MastraWorkflowStreamorWorkflowRunOutput- A workflow stream
The second parameter is an options object:
version?:
'v5' for the existing default behavior. Pass 'v6' when your app is typed against AI SDK v6 response helpers. Pass 'v7' when your app is typed against AI SDK v7.from:
lastMessageId?:
sendStart?:
sendFinish?:
sendReasoning?:
sendSources?:
includeSubAgentMetadata?:
data-tool-agent and data-tool-agent-step parts when the agent delegates to sub-agents. handleChatStream() and chatRoute() enable this by default.includeTextStreamParts?:
messageMetadata?:
traceId (undefined when tracing is disabled), so you can return it as metadata, for example ({ part, traceId }) => (part.type === 'start' ? { traceId } : undefined).onError?:
ExamplesExamples的直接链接
Converting a workflow streamConverting a workflow stream的直接链接
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,
})
}
Converting a network streamConverting a network stream的直接链接
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,
})
}
Converting an agent stream with reasoning enabledConverting an agent stream with reasoning enabled的直接链接
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,
})
}
Converting an agent stream for AI SDK v6Converting an agent stream for AI SDK v6的直接链接
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,
})
}
Using messageMetadatausing-messagemetadata的直接链接
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,
})
}
Client-side stream transformationClient-side stream transformation的直接链接
If you're using the Mastra client SDK (@mastra/client-js) on the client side and want to convert streams to AI SDK format:
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)
}