toAISdkStream()
将 Mastra 流(代理、网络或工作流)转换为与 AI SDK 兼容的流。当需要手动转换 Mastra 流以用于 AI SDK 的 createUIMessageStream() 和 createUIMessageStreamResponse() 时,请使用此函数。
🌐 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().
当在 Mastra 提供的路由辅助功能(如 chatRoute() 或 workflowRoute())之外构建自定义流端点时,这很有用。
🌐 This is useful when building custom streaming endpoints outside Mastra's provided route helpers such as chatRoute() or workflowRoute().
使用示例Direct link to 使用示例
🌐 Usage example
Next.js 应用路由示例:
🌐 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,
});
}
在 createUIMessageStream() 中将 messages 传递给 originalMessages,以避免在界面中出现重复的助手消息。详情请参见 故障排除:重复的助手消息 。
🌐 Pass messages to originalMessages in createUIMessageStream() to avoid duplicated assistant messages in the UI. See Troubleshooting: Repeated Assistant Messages for details.
参数Direct link to 参数
🌐 Parameters
第一个参数是要转换的 Mastra 流。它可以是以下之一:
🌐 The first parameter is the Mastra stream to convert. It can be one of:
MastraModelOutput- 来自agent.stream()的代理流MastraAgentNetworkStream- 来自agent.network()的网络流MastraWorkflowStream或WorkflowRunOutput- 一个工作流流
第二个参数是一个选项对象:
🌐 The second parameter is an options object:
from:
lastMessageId?:
sendStart?:
sendFinish?:
sendReasoning?:
sendSources?:
includeTextStreamParts?:
messageMetadata?:
onError?:
示例Direct link to 示例
🌐 Examples
转换工作流流Direct link to 转换工作流流
🌐 Converting 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,
});
}
转换网络流Direct link to 转换网络流
🌐 Converting 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,
});
}
转换启用推断的代理流Direct link to 转换启用推断的代理流
🌐 Converting 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,
});
}
使用消息元数据Direct link to 使用消息元数据
🌐 Using 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,
});
}
客户端流转换Direct link to 客户端流转换
🌐 Client-side stream transformation
如果你在客户端使用 Mastra 客户端 SDK(@mastra/client-js)并且想将流转换为 AI SDK 格式:
🌐 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);
}