Aller au contenu principal

Memory.summarizeThread()

La méthode .summarizeThread() résume en une seule fois la conversation d’un fil. Elle charge les messages du fil depuis le stockage et les synthétise à l’aide du même mécanisme Observer que celui d’Observational Memory, mais sous la forme d’un appel autonome, sans qu’Observational Memory soit associé à un Agent.

Les messages sont chargés page par page, en commençant par les plus récents, dans les limites définies par lastMessages et maxInputTokens. Ainsi, le résumé d’un long fil ne nécessite pas de lire tout son historique depuis le stockage.

Aucune donnée n’est réécrite dans la mémoire. Le résumé et les valeurs extraites vous sont renvoyés, ainsi qu’au hook onExtracted de chaque extracteur. Vous décidez donc où les stocker, par exemple dans votre propre base de données.

Utilisez cette méthode à la fin d’une session lorsque vous souhaitez obtenir un résumé ou une extraction structurée de l’ensemble de la conversation, par exemple au terme d’un appel vocal. Pour des messages dont vous disposez déjà, sans avoir à les charger depuis un fil, utilisez plutôt la fonction autonome summarizeConversation(). Elle accepte les mêmes options, avec messages à la place de threadId.

Exemple d’utilisation
Lien direct vers Exemple d’utilisation

const result = await memory.summarizeThread({
model: 'openai/gpt-5-mini',
threadId: 'thread-123',
instructions: 'Summarize this voicemail call for the business owner.',
})

Paramètres
Lien direct vers Paramètres

threadId:

string
Identifiant unique du fil à résumer.

model:

string | LanguageModel | DynamicModel
Modèle qui effectue le résumé, par exemple une chaîne de routeur comme '__GATEWAY_OPENAI_MODEL_MINI__'.

resourceId?:

string
ID de la ressource propriétaire du fil. Si cet ID est fourni, il permet de valider la propriété du fil. Il est également transmis aux contextes des extracteurs.

lastMessages?:

number
Résume uniquement les N derniers messages du fil. Par défaut, l’ensemble du fil est chargé, dans la limite de maxInputTokens.

maxInputTokens?:

number
= 1000000
Arrête de charger les anciens messages dès que les messages collectés dépassent ce nombre estimé de tokens. Le message le plus récent est toujours inclus.

instructions?:

string
Instructions supplémentaires ajoutées au prompt système du modèle de résumé, par exemple les éléments à privilégier ou le destinataire du résumé.

extract?:

Extractor[]
Extracteurs à exécuter sur la conversation. Les extracteurs dotés d’un schéma Zod sont exécutés lors d’un appel ultérieur avec sortie structurée ; les extracteurs sans schéma sont exécutés directement. Le hook onExtracted de chaque extracteur est déclenché avec la valeur extraite.

requestContext?:

RequestContext
Contexte de requête transmis au modèle de résumé et aux hooks des extracteurs.

abortSignal?:

AbortSignal
Signal permettant d’annuler l’appel de résumé.

Valeur renvoyée
Lien direct vers Valeur renvoyée

summary:

string
Observations synthétisées à partir de la conversation, présentées sous forme de liste à puces dense.

extracted:

Record<string, unknown>
Valeurs produites par les extracteurs de extract, indexées par le slug de l’extracteur.

extractionFailures:

{ slug: string; error: string }[]
Extracteurs qui n’ont pas réussi à produire une valeur valide, accompagnés de la raison. Présent uniquement lorsqu’au moins un extracteur a échoué.

usage:

{ inputTokens?: number; outputTokens?: number; totalTokens?: number }
Utilisation des tokens par l’appel de résumé.

Exemple d’utilisation avancée
Lien direct vers Exemple d’utilisation avancée

L’exemple suivant résume un appel vocal terminé et stocke un enregistrement structuré dans la propre base de données de l’application :

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],
})
}