Memory.summarizeThread()
.summarizeThread() 方法可一次性汇总 thread 的对话。它从存储中加载 thread 消息,并使用支持 Observational Memory 的同一套 Observer 机制进行提炼;这是一次独立调用,无需将 Observational Memory 附加到 Agent。
消息从最新一条开始逐页加载,并受 lastMessages 和 maxInputTokens 限制,因此汇总较长的 thread 时不会从存储中读取其全部历史记录。
任何内容都不会写回 memory。摘要和提取的值会返回给你(也会传给每个 extractor 的 onExtracted hook),因此你可以自行决定它们的去向,例如自己的数据库。
当会话结束且你希望获取整个对话的摘要或结构化提取结果时(例如语音通话挂断时),请使用此方法。对于你已持有的消息(无需从 thread 加载),请改用独立的 summarizeConversation() 函数。它接受相同的选项,只是用 messages 代替 threadId。
使用示例使用示例的直接链接
const result = await memory.summarizeThread({
model: 'openai/gpt-5-mini',
threadId: 'thread-123',
instructions: 'Summarize this voicemail call for the business owner.',
})
参数参数的直接链接
threadId:
string
要汇总的 thread 的唯一标识符。
model:
string | LanguageModel | DynamicModel
执行汇总的模型,例如
'__GATEWAY_OPENAI_MODEL_MINI__' 这样的 router 字符串。resourceId?:
string
拥有该 thread 的 resource ID。如果提供,则验证 thread 所有权。该值也会传给 Extractor 上下文。
lastMessages?:
number
仅汇总 thread 的最后 N 条消息。默认加载整个 thread,但受
maxInputTokens 限制。maxInputTokens?:
number
= 1000000
当收集的消息超过此估算 token 数量时,停止加载更早的消息。最新消息始终会包含在内。
instructions?:
string
附加到 summarizer system prompt 的额外指导,例如应关注的内容或摘要的目标读者。
extract?:
Extractor[]
要在对话上运行的 Extractor。带 Zod schema 的 Extractor 会通过后续结构化输出调用运行;不带 schema 的 Extractor 会以内联方式提取。每个 Extractor 的
onExtracted hook 都会收到提取的值。requestContext?:
RequestContext
转发给 summarizer 模型和 Extractor hook 的请求上下文。
abortSignal?:
AbortSignal
用于取消汇总调用的信号。
返回值返回值的直接链接
summary:
string
从对话中提炼出的观察结果,以信息密集的项目符号形式呈现。
extracted:
Record<string, unknown>
extract 中的 Extractor 生成的值,以 Extractor slug 为键。extractionFailures:
{ slug: string; error: string }[]
未能生成有效值的 Extractor 及失败原因。仅在至少一个 Extractor 失败时存在。
usage:
{ inputTokens?: number; outputTokens?: number; totalTokens?: number }
汇总调用的 token 用量。
扩展使用示例扩展使用示例的直接链接
以下示例汇总已结束的语音通话,并在应用自己的数据库中存储结构化记录:
src/call-summary.ts
import { Extractor } from '@mastra/memory'
import { z } from 'zod'
import { memory } from './mastra/memory'
import { callRecords } from './db'
const callSummary = new Extractor({
name: 'call-summary',
instructions: 'Return a concise summary of the call.',
schema: z.object({
summary: z.string(),
sentiment: z.enum(['positive', 'neutral', 'negative']),
requestedServices: z.array(z.string()),
}),
metadataKeyPath: false, // don't persist into memory metadata — the hook owns storage
onExtracted: async ({ current, threadId, resourceId }) => {
await callRecords.upsert({ callId: threadId, callerId: resourceId, record: current })
},
})
export async function onCallEnd(threadId: string, resourceId: string) {
await memory.summarizeThread({
model: 'openai/gpt-5-mini',
threadId,
resourceId,
instructions: 'Summarize this voicemail call for the business owner.',
extract: [callSummary],
})
}