MastraModelOutput
.stream() 会传回 MastraModelOutput 类别,让你以Stream及 Promise 方式访问模型输出。它支持结构化输出生成、Tool 调用、推理及详细用量追踪。
// MastraModelOutput is returned by agent.stream()
const stream = await agent.stream('Hello world')
有关设定及基本用法,请参阅 .stream() 方法文档。
Stream属性Stream属性的直接链接
这些属性可在模型输出生成时即时访问:
fullStream:
ReadableStream<ChunkType<OUTPUT>>
包含文本、Tool 调用、推理、中继资料及控制chunk等所有chunk类型的完整Stream。可细致访问模型回应的每个部分。
ReadableStream
ChunkType:
ChunkType<OUTPUT>
Stream期间可发出的所有chunk类型
textStream:
ReadableStream<string>
只包含逐步文本内容的Stream。它会滤除所有中继资料、Tool 调用及控制chunk,只提供正在生成的文本。
objectStream:
ReadableStream<Partial<OUTPUT>>
使用输出结构描述时,逐步更新结构化对象的Stream。对象创建期间会发出部分对象,以便即时显示结构化资料生成进度。
ReadableStream
PartialSchemaOutput:
Partial<OUTPUT>
符合指定结构描述的部分完成对象
elementStream:
ReadableStream<OUTPUT extends (infer T)[] ? T : never>
输出结构描述定义阵列类型时,逐一传送阵列元素的Stream。每个元素完成后便会发出,毋须等待整个阵列完成。
以 Promise 为基础的属性以 Promise 为基础的属性的直接链接
Stream完成后,这些属性会解析为最终值:
text:
Promise<string>
模型传回的完整串接文本回应。文本生成完成时解析。
object:
Promise<OUTPUT>
使用输出结构描述时的完整结构化对象回应。解析前会按结构描述验证;验证失败时会拒绝。
Promise
InferSchemaOutput:
OUTPUT
完全符合指定结构描述定义的强类型对象
reasoning:
Promise<string>
支持推理之模型(例如 OpenAI o1 系列)的完整推理文本。不具推理能力的模型会传回空字符串。
reasoningText:
Promise<string | undefined>
访问 reasoning 内容的另一种方式。对于不支持 reasoning 的模型,该值可能为 undefined,而 'reasoning' 会返回空字符串。
toolCalls:
Promise<ToolCallChunk[]>
执行期间所有 Tool 调用chunk的阵列。每个chunk均包含 Tool 中继资料及执行详情。
ToolCallChunk
type:
'tool-call'
chunk类型识别码
runId:
string
执行 run 识别码
from:
ChunkFrom
来源:chunk (AGENT, WORKFLOW, etc.)
payload:
ToolCallPayload
Tool 调用资料,包括 toolCallId、toolName、args 及执行详情
toolResults:
Promise<ToolResultChunk[]>
与 Tool 调用对应之所有 Tool 结果chunk的阵列。包含执行结果及错误资料。
ToolResultChunk
type:
'tool-result'
chunk类型识别码
runId:
string
执行 run 识别码
from:
ChunkFrom
来源:chunk (AGENT, WORKFLOW, etc.)
payload:
ToolResultPayload
Tool 结果资料,包括 toolCallId、toolName、result 及错误状态
usage:
Promise<LanguageModelUsage>
Token 用量统计资料,包括输入 token、输出 token、token 总数及推理 token(适用于推理模型)。
Record
inputTokens:
number
输入提示所耗用的 token
outputTokens:
number
回应中生成的 token
totalTokens:
number
输入与输出 token 的总和
reasoningTokens?:
number
隐藏的推理 token(适用于推理模型)
cachedInputTokens?:
number
缓存命中的输入 token 数目
finishReason:
Promise<string | undefined>
生成停止的原因(例如 'stop'、'length'、'tool_calls'、'content_filter')。如果 Stream 尚未结束,则为 undefined。
enum
stop:
'stop'
模型自然完成
length:
'length'
达到 token 上限
tool_calls:
'tool_calls'
模型调用了 Tool
content_filter:
'content_filter'
内容已被过滤
response:
Promise<Response>
模型 Provider 的回应中继资料及讯息。
Response
id?:
string
模型 Provider 传回的回应 ID
timestamp?:
Date
回应 时间戳记
modelId?:
string
此回应所使用的模型识别码
headers?:
Record<string, string>
模型 Provider 传回的回应标头
messages?:
ResponseMessage[]
回应 messages in model format
uiMessages?:
UIMessage[]
回应 messages in UI format, includes any 中继资料 added by 输出 processors
错误属性错误属性的直接链接
error:
string | Error | { message: string; stack: string; } | undefined
Stream遇到错误时的错误资料。如未发生错误则为 undefined。可以是字符串讯息、Error 对象,或包含堆叠追踪的串行化错误。
方法方法的直接链接
getFullOutput:
() => Promise<FullOutput>
传回包含所有结果的完整输出对象:文本、结构化对象、Tool 调用、用量统计资料、推理及中继资料。只需一个方法即可方便地访问所有Stream结果。
FullOutput
text:
string
完整text 回应
object?:
OUTPUT
如有提供结构描述,则为结构化输出
toolCalls:
ToolCallChunk[]
所有已产生的 Tool 调用chunk
toolResults:
ToolResultChunk[]
所有 Tool 结果chunk
usage:
Record<string, number>
Token 用量统计资料
reasoning?:
string
推理 text(如有)
finishReason?:
string
生成结束的原因
response:
Response
模型 Provider 的回应中继资料及讯息
consumeStream:
(options?: ConsumeStreamOptions) => Promise<void>
手动取用整个Stream而不处理chunk。当你只需要最终 Promise 结果,并希望触发Stream取用时相当实用。
ConsumeStreamOptions
onError?:
(error: Error) => void
处理Stream错误的回呼函数
使用范例使用范例的直接链接
基本文本Stream基本文本Stream的直接链接
const stream = await agent.stream('Write a haiku')
// Stream text as it's generated
for await (const text of stream.textStream) {
process.stdout.write(text)
}
// Or get the complete text
const fullText = await stream.text
console.log(fullText)
结构化输出Stream结构化输出Stream的直接链接
const stream = await agent.stream('Generate user data', {
structuredOutput: {
schema: z.object({
name: z.string(),
age: z.number(),
email: z.string(),
}),
},
})
// Stream partial objects
for await (const partial of stream.objectStream) {
console.log('Progress:', partial) // { name: "John" }, { name: "John", age: 30 }, ...
}
// Get final validated object
const user = await stream.object
console.log('Final:', user) // { name: "John", age: 30, email: "john@example.com" }
### Tool Calls and Results
```typescript
const stream = await agent.stream("What's the weather in NYC?", {
tools: { weather: weatherTool }
});
// Monitor tool calls
const toolCalls = await stream.toolCalls;
const toolResults = await stream.toolResults;
console.log("Tools called:", toolCalls);
console.log("Results:", toolResults);
访问完整输出访问完整输出的直接链接
const stream = await agent.stream('Analyze this data')
const output = await stream.getFullOutput()
console.log({
text: output.text,
usage: output.usage,
reasoning: output.reasoning,
finishReason: output.finishReason,
})
完整 Stream 处理完整 Stream 处理的直接链接
const stream = await agent.stream('Complex task')
for await (const chunk of stream.fullStream) {
switch (chunk.type) {
case 'text-delta':
process.stdout.write(chunk.payload.text)
break
case 'tool-call':
console.log(`Calling ${chunk.payload.toolName}...`)
break
case 'reasoning-delta':
console.log(`Reasoning: ${chunk.payload.text}`)
break
case 'finish':
console.log(`Done! Reason: ${chunk.payload.stepResult.reason}`)
// Access response messages with any metadata added by output processors
const uiMessages = chunk.payload.response?.uiMessages
if (uiMessages) {
console.log('Response messages:', uiMessages)
}
break
}
}
Error handlingError handling的直接链接
const stream = await agent.stream('Analyze this data')
try {
// Option 1: Handle errors in consumeStream
await stream.consumeStream({
onError: error => {
console.error('Stream error:', error)
},
})
const result = await stream.text
} catch (error) {
console.error('Failed to get result:', error)
}
// Option 2: Check error property
const result = await stream.getFullOutput()
if (stream.error) {
console.error('Stream had errors:', stream.error)
}