Classe Agent
La classe Agent constitue la base de la création d’Agents IA dans Mastra. Elle fournit des méthodes permettant de générer des réponses et de diffuser des interactions en continu. Elle prend également en charge les fonctionnalités vocales.
Exemples d’utilisationLien direct vers Exemples d’utilisation
Instructions de base sous forme de chaîneLien direct vers Instructions de base sous forme de chaîne
Transmettre les instructions sous forme de chaîne ou de tableau de chaînes est la méthode la plus simple pour configurer un Agent. Cette approche convient aux cas d’utilisation simples qui nécessitent de fournir un prompt sans configuration supplémentaire.
import { Agent } from '@mastra/core/agent'
// String instructions
export const agent = new Agent({
id: 'test-agent',
name: 'Test Agent',
instructions: 'You are a helpful assistant that provides concise answers.',
model: 'openai/gpt-5.6-sol',
})
// System message object
export const agent2 = new Agent({
id: 'test-agent-2',
name: 'Test Agent 2',
instructions: {
role: 'system',
content: 'You are an expert programmer',
},
model: 'openai/gpt-5.6-sol',
})
// Array of system messages
export const agent3 = new Agent({
id: 'test-agent-3',
name: 'Test Agent 3',
instructions: [
{ role: 'system', content: 'You are a helpful assistant' },
{ role: 'system', content: 'You have expertise in TypeScript' },
],
model: 'openai/gpt-5.6-sol',
})
Configurations propres aux ProvidersLien direct vers Configurations propres aux Providers
Chaque Provider de modèle propose également différentes options, notamment la mise en cache des prompts et la configuration du raisonnement. Vous pouvez définir providerOptions au niveau des instructions afin d’appliquer une stratégie de cache différente à chaque instruction système ou prompt.
import { Agent } from '@mastra/core/agent'
export const agent = new Agent({
id: 'core-message-agent',
name: 'Core Message Agent',
instructions: {
role: 'system',
content: 'You are a helpful assistant specialized in technical documentation.',
providerOptions: {
openai: {
reasoningEffort: 'low',
},
},
},
model: 'openai/gpt-5.6-sol',
})
Formats d’instructions mixtesLien direct vers Formats d’instructions mixtes
import { Agent } from '@mastra/core/agent'
// This could be customizable based on the user
const preferredTone = {
role: 'system',
content: 'Always maintain a professional and empathetic tone.',
}
export const agent = new Agent({
id: 'multi-message-agent',
name: 'Multi Message Agent',
instructions: [
{ role: 'system', content: 'You are a customer service representative.' },
preferredTone,
{
role: 'system',
content: 'Escalate complex issues to human agents when needed.',
providerOptions: {
anthropic: { cacheControl: { type: 'ephemeral' } },
},
},
],
model: 'anthropic/claude-sonnet-4-6',
})
Chaînes de modèleLien direct vers Chaînes de modèle
Pour la configuration la plus simple, transmettez model sous forme de chaîne au format provider/model. Séparez le nom du Provider de celui du modèle par une barre oblique. Mastra lit dans l’environnement les identifiants correspondant au Provider ; ce format ne nécessite donc ni package ni import de Provider.
Chaînes et identifiants des Providers courants :
- OpenAI :
openai/gpt-5.6-solutiliseOPENAI_API_KEY. - Anthropic :
anthropic/claude-sonnet-4-6utiliseANTHROPIC_API_KEY. - Google :
google/gemini-2.5-proutiliseGOOGLE_API_KEYouGOOGLE_GENERATIVE_AI_API_KEY.
Consultez les modèles pour découvrir les ID de modèle pris en charge et les variables d’environnement pour obtenir la liste complète des Providers.
Signaux de threadLien direct vers Signaux de thread
Utilisez les signaux d’Agent pour envoyer en temps réel des entrées et du contexte à un thread de mémoire. Les API de message sont destinées aux entrées rédigées par l’utilisateur. sendSignal() est l’API de bas niveau du contexte généré par le système.
Lorsque le thread cible est actif, sendMessage() distribue le message dans la boucle active de l’Agent. Lorsque le thread est inactif, Mastra démarre par défaut un flux dont le message constitue la première entrée.
const subscription = await agent.subscribeToThread({
resourceId: 'user-123',
threadId: 'thread-abc',
})
void (async () => {
for await (const chunk of subscription.stream) {
console.log(chunk)
}
})()
agent.sendMessage('Use the latest customer note too.', {
resourceId: 'user-123',
threadId: 'thread-abc',
ifIdle: {
streamOptions: {
maxSteps: 3,
},
},
})
Utilisez attributes pour identifier différents utilisateurs dans un thread partagé. Les attributs sont rendus au format XML afin que le modèle puisse distinguer les auteurs des messages :
agent.sendMessage(
{
contents: 'Can we simplify the API surface?',
attributes: { name: 'Devin', from: 'slack' },
},
{ resourceId: 'user-123', threadId: 'thread-abc' },
)
Le modèle reçoit le contenu suivant :
<user name="Devin" from="slack">Can we simplify the API surface?</user>
Utilisez ifActive.attributes et ifIdle.attributes lorsque le message doit transporter un contexte différent selon que le thread est actif ou non :
agent.sendMessage(
{
contents: 'Also cover the edge cases.',
attributes: { source: 'chat' },
},
{
resourceId: 'user-123',
threadId: 'thread-abc',
ifActive: { attributes: { delivery: 'while-active' } },
ifIdle: { attributes: { delivery: 'new-message' } },
},
)
Lorsque le thread est actif, le modèle voit :
<user source="chat" delivery="while-active">Also cover the edge cases.</user>
Lorsque le thread est inactif, le modèle voit :
<user source="chat" delivery="new-message">Also cover the edge cases.</user>
L’interface utilisateur voit le contenu du message et peut également lire attributes et metadata dans le message de signal afin de personnaliser le rendu, par exemple en affichant les noms des utilisateurs, leurs avatars ou les badges de leur plateforme.
sendMessage(message, options)Lien direct vers sendmessagemessage-options
Envoie un message utilisateur à une exécution active ou à un thread de mémoire. Utilisez cette méthode lorsque l’Agent actif doit recevoir le message immédiatement.
message:
attributes est présent, Mastra rend le message comme un élément XML <user> incluant les attributs.options?:
runId?:
resourceId?:
threadId pour les messages ciblant un thread.threadId?:
resourceId pour les messages ciblant un thread.ifActive?:
behavior?:
deliver.attributes?:
ifIdle?:
behavior?:
wake.streamOptions?:
ifIdle.behavior vaut wake. Mastra utilise les valeurs resourceId et threadId de premier niveau pour le contexte de mémoire.attributes?:
Définissez ifIdle.behavior sur wake et transmettez ifIdle.streamOptions lorsqu’un thread inactif doit démarrer un nouveau flux avec des options d’exécution personnalisées :
agent.sendMessage('Continue with the next step.', {
resourceId: 'user-123',
threadId: 'thread-abc',
ifIdle: {
behavior: 'wake',
streamOptions: {
maxSteps: 3,
},
},
})
Renvoie { accepted: Promise<SendAgentSignalAccepted>, signal: CreatedAgentSignal, persisted?: Promise<void> }. accepted est résolue au moment de la décision, dès que Mastra détermine le traitement du message : { action: 'wake', runId, output } lorsque ce processus exécute l’Agent (il a démarré l’exécution ou obtenu le bail nécessaire), { action: 'deliver', runId } lorsque le message est transmis à une exécution existante (y compris lorsque ce processus perd une course de réveil interprocessus), ou { action: 'persist' } / { action: 'discard' } lorsqu’aucune exécution n’a eu lieu. runId est l’ID de référence de l’exécution qui a traité le message ; il n’est présent que pour wake et deliver. Pour persist/discard, utilisez result.signal.id afin de corréler le message stocké. accepted est résolue pour le routage (une erreur de génération lors d’une exécution wake remonte par output.consumeStream()) et n’est rejetée que si le message n’a pas pu être routé ni démarré, par exemple en cas d’Agent mal configuré. persisted n’est présent que pour le comportement persist et est résolu lorsque Mastra termine l’écriture du message dans la mémoire. Pour l’action wake, output correspond au flux de l’Agent destiné à être consommé dans le processus.
queueMessage(message, options)Lien direct vers queuemessagemessage-options
Place un message utilisateur dans la file d’attente du prochain tour d’un thread. Si le thread est actif, Mastra attend la fin de l’exécution active, puis démarre une nouvelle exécution avec le message en attente. Si le thread est inactif, Mastra démarre immédiatement une exécution.
agent.queueMessage('Also check whether the tests need updates.', {
resourceId: 'user-123',
threadId: 'thread-abc',
})
queueMessage() accepte la même structure de message et d’options que sendMessage() et renvoie { accepted: Promise<SendAgentSignalAccepted>, signal: CreatedAgentSignal, persisted?: Promise<void> }, avec la même sémantique d’accepted que sendMessage().
sendSignal(signal, options)Lien direct vers sendsignalsignal-options
Envoie un signal à une exécution active ou à un thread de mémoire.
signal:
type correspond à la catégorie sémantique du signal. tagName contrôle le tag XML présenté au modèle. Par exemple, { type: 'notification', tagName: 'github-review' } est rendu sous la forme <github-review>...</github-review>. Les anciennes charges utiles user-message et system-reminder sont toujours acceptées et normalisées. Les valeurs type inconnues sont rejetées ; utilisez tagName pour les tags XML personnalisés.options?:
runId?:
resourceId?:
threadId pour les signaux ciblant un thread.threadId?:
resourceId pour les signaux ciblant un thread.ifActive?:
behavior?:
deliver.attributes?:
ifIdle?:
behavior?:
wake.streamOptions?:
ifIdle.behavior vaut wake. Mastra utilise les valeurs resourceId et threadId de premier niveau pour le contexte de mémoire.attributes?:
Renvoie { accepted: Promise<SendAgentSignalAccepted>, signal: CreatedAgentSignal, persisted?: Promise<void> }. accepted est résolue au moment de la décision, dès que Mastra détermine le traitement du signal : { action: 'wake', runId, output } lorsque ce processus exécute l’Agent (il a démarré l’exécution ou obtenu le bail nécessaire), { action: 'deliver', runId } lorsque le signal est transmis à une exécution existante (y compris lorsque ce processus perd une course de réveil interprocessus), ou { action: 'persist' } / { action: 'discard' } lorsqu’aucune exécution n’a eu lieu. action reflète le behavior retenu parmi ifActive/ifIdle. runId est l’ID de référence de l’exécution qui a traité le signal ; il n’est présent que pour wake et deliver. Pour persist/discard, utilisez result.signal.id afin de corréler le signal stocké. accepted est résolue pour le routage (une erreur de génération lors d’une exécution wake remonte par output.consumeStream()) et n’est rejetée que si le signal n’a pas pu être routé ni démarré, par exemple en cas d’Agent mal configuré. persisted n’est présent que pour le comportement persist et est résolu lorsque Mastra termine l’écriture du signal dans la mémoire. Pour l’action wake, output correspond au flux de l’Agent destiné à être consommé dans le processus.
Dans les handlers serverless, attendez accepted et transmettez la sortie wake à l’équivalent de waitUntil sur votre plateforme, afin que le processus retenu puisse consommer le flux après le renvoi de la réponse HTTP.
const result = agent.sendSignal(signal, { resourceId, threadId })
ctx.waitUntil(
result.accepted.then(async accepted => {
if (accepted.action === 'wake') {
await accepted.output.consumeStream()
}
}),
)
sendStateSignal(state, options)Lien direct vers sendstatesignalstate-options
Envoie à une exécution active ou à un thread de mémoire un contexte d’état nommé et limité au thread. Utilisez cette méthode lorsqu’un producteur externe possède un contexte durable qui évolue au fil du temps, tel que l’état du Browser, l’état d’Editor ou la sortie d’un observateur.
const result = await agent.sendStateSignal(
{
id: 'browser',
mode: 'snapshot',
cacheKey: 'browser:https://example.com:3-tabs',
contents: 'Browser is open. Active tab URL: https://example.com. 3 open tabs.',
value: {
activeUrl: 'https://example.com',
tabCount: 3,
open: true,
},
},
{
resourceId: 'user-123',
threadId: 'thread-abc',
},
)
state:
id:
browser ou editor.cacheKey:
contents:
mode?:
snapshot.value?:
mode: 'snapshot'.delta?:
mode: 'delta'.attributes?:
metadata?:
tagName?:
state.options:
sendSignal().Renvoie { accepted: Promise<SendAgentSignalAccepted>, signal: CreatedAgentSignal, persisted?: Promise<void>, skipped?: false } lorsque Mastra accepte un nouvel état. Renvoie { skipped: true, reason: 'unchanged' } lorsque le même cacheKey et le même mode sont déjà actifs pour le canal d’état. accepted est résolue au moment de la décision, dès que Mastra détermine le traitement du signal : { action: 'wake', runId, output } lorsque ce processus exécute l’Agent (il a démarré l’exécution ou obtenu le bail nécessaire), { action: 'deliver', runId } lorsque le signal est transmis à une exécution existante (y compris lorsque ce processus perd une course de réveil interprocessus), ou { action: 'persist' } / { action: 'discard' } lorsqu’aucune exécution n’a eu lieu. runId est l’ID de référence de l’exécution qui a traité le signal ; il n’est présent que pour wake et deliver. Pour persist/discard, utilisez result.signal.id afin de corréler le signal stocké. Pour l’action wake, output correspond au flux de l’Agent destiné à être consommé dans le processus.
sendNotificationSignal(notification, options)Lien direct vers sendnotificationsignalnotification-options
Crée ou regroupe un enregistrement dans la boîte de réception des notifications et résout la politique de distribution des notifications. Envoie un signal de notification lorsque la décision est immédiate.
const result = await agent.sendNotificationSignal(
{
source: 'github',
kind: 'ci-status',
priority: 'high',
summary: 'CI failed on main: 3 tests failed.',
dedupeKey: 'github:acme/app:main:ci',
},
{
resourceId: 'user-123',
threadId: 'thread-abc',
},
)
notification:
source:
github, slack ou email.kind:
ci-status, mention ou direct-message.summary:
priority?:
medium.payload?:
dedupeKey?:
coalesceKey?:
attributes?:
metadata?:
options:
resourceId:
threadId:
ifIdle?:
streamOptions?:
Renvoie { record: NotificationRecord, decision: NotificationDeliveryDecision, runId?: string, signal?: CreatedAgentSignal, persisted?: Promise<void>, accepted?: Promise<SendAgentSignalAccepted> }. record correspond à l’enregistrement stocké dans la boîte de réception. decision est le résultat de la politique de distribution. signal et runId sont présents lorsque l’entrée émet immédiatement un signal, notamment le résumé immédiat émis pour les notifications actives de priorité élevée. persisted est présent lorsque le signal émis est persisté sans réveiller de thread inactif. accepted est présent lorsqu’un signal est émis et est résolu au moment de la décision, dès que Mastra détermine son traitement : { action: 'wake', runId, output } lorsque ce processus exécute l’Agent (il a démarré l’exécution ou obtenu le bail nécessaire), { action: 'deliver', runId } lorsque le signal est transmis à une exécution existante, ou { action: 'persist' } / { action: 'discard' } lorsqu’aucune exécution n’a eu lieu. Dans le résultat accepté, runId n’est présent que pour wake et deliver. Pour l’action wake, output correspond au flux de l’Agent destiné à être consommé dans le processus.
La distribution par défaut tient compte de la priorité. Les notifications urgent sont distribuées immédiatement. Les notifications high le sont immédiatement lorsque le thread est inactif. Lorsque le thread est actif, Mastra émet immédiatement un résumé et conserve deliverAt pour une distribution complète ultérieure, lorsque le thread sera inactif. Les notifications medium sont distribuées immédiatement lorsque le thread est inactif et regroupées en résumés lorsqu’il est actif. Les notifications low sont regroupées en résumés dans les threads actifs comme inactifs. Les résumés de faible priorité destinés aux threads inactifs parviennent aux abonnés sans réveiller la boucle du modèle. Pour découvrir le flux complet, consultez la section Signaux.
Configurez notifications.deliveryPolicy sur l’Agent lorsque certaines notifications doivent attendre une autre fenêtre de distribution ou un regroupement de résumés :
export const supportAgent = new Agent({
id: 'support-agent',
name: 'Support Agent',
instructions: 'Help the user triage updates.',
model: 'openai/gpt-5.6-sol',
notifications: {
deliveryPolicy: {
priorities: {
urgent: 'deliver',
},
decide: ({ record }) => {
if (record.priority === 'low') {
return {
action: 'summarize',
summaryAt: new Date(Date.now() + 30 * 60 * 1000),
}
}
},
},
},
})
subscribeToThread(options)Lien direct vers subscribetothreadoptions
S’abonne aux chunks bruts du flux d’un thread de mémoire. Utilisez cette méthode avant d’appeler sendMessage(), queueMessage() ou sendSignal(). Elle vous permet d’effectuer le rendu de la sortie du flux et d’observer les échos des signaux, notamment lorsqu’un signal abandonne l’exécution active.
options:
resourceId?:
threadId:
Renvoie un objet AgentThreadSubscription comprenant les membres suivants :
stream:
activeRunId:
null lorsqu’aucune exécution n’est active.abort:
true lorsqu’une exécution a été abandonnée.unsubscribe:
Paramètres du constructeurLien direct vers Paramètres du constructeur
id:
name:
description?:
metadata?:
instructions:
model:
provider/model, une configuration de modèle ou une instance de Provider, ou une fonction qui résout le modèle à l’exécution. Consultez la section Chaînes de modèle pour découvrir les Providers et variables d’environnement courants.agents?:
tools?:
hooks?:
generate() ou stream() remplacent les hooks correspondants définis ici. Consultez la section Hooks des Tools ci-dessous.beforeToolCall?:
{ toolName, input, context, metadata }. Renvoyez { proceed: false, output } pour ignorer l’appel du Tool et utiliser output comme résultat.afterToolCall?:
{ toolName, input, context, metadata, output, error }. Lorsque le Tool lève une erreur, output vaut undefined et error est défini à la place.transform?:
transform propre à chaque Tool dans createTool() pour définir des règles locales au Tool.workflows?:
defaultOptions?:
stream() et generate().defaultGenerateOptionsLegacy?:
generateLegacy().defaultStreamOptionsLegacy?:
streamLegacy().mastra?:
scorers?:
memory?:
notifications?:
deliveryPolicy?:
decide() personnalisée.voice?:
inputProcessors?:
createWorkflow() au moyen de ProcessorStepSchema.outputProcessors?:
maxProcessorRetries?:
requestContextSchema?:
editor?:
Options de mémoire de generate()Lien direct vers generate-memory-options
Transmettez memory lorsque vous appelez agent.generate() afin de choisir le thread de conversation que l’exécution doit lire et dans lequel elle doit écrire. La structure courante est memory: { resource: string, thread: string }, où resource identifie le propriétaire et thread la conversation. Consultez la section Threads et ressources pour découvrir le modèle conceptuel.
const response = await agent.generate('What did we decide about retries?', {
memory: {
resource: 'user-123',
thread: 'support-thread-456',
},
})
Utilisez un objet thread lorsque vous devez créer ou mettre à jour les métadonnées du thread pendant l’appel :
const response = await agent.generate('Continue the support conversation.', {
memory: {
resource: 'user-123',
thread: {
id: 'support-thread-456',
title: 'Billing support',
metadata: { category: 'billing' },
},
},
})
Hooks des ToolsLien direct vers Hooks des Tools
Utilisez hooks pour exécuter une logique autour de chaque appel de Tool effectué par l’Agent, notamment les Tools attribués, les Tools de mémoire, les ensembles de Tools, les Tools clients et les Tools du Workspace.
import { Agent } from '@mastra/core/agent'
export const agent = new Agent({
id: 'support-agent',
name: 'support-agent',
instructions: 'Help users with their questions.',
model: 'openai/gpt-5.6-sol',
hooks: {
beforeToolCall: ({ toolName, input }) => {
console.log(`Running ${toolName}`, input)
},
afterToolCall: ({ toolName, output, error }) => {
console.log(`Finished ${toolName}`, { output, error })
},
},
})
beforeToolCall peut court-circuiter l’appel du Tool en renvoyant { proceed: false, output }. L’Agent ignore l’exécution et utilise output comme résultat du Tool :
const result = await agent.generate('Clean up old records', {
hooks: {
beforeToolCall: ({ toolName }) => {
if (toolName === 'deleteRecord') {
return { proceed: false, output: { blocked: true } }
}
},
},
})
Les metadata du contexte de hook comprennent agentId et agentName. Les hooks propres à l’exécution transmis à generate() ou stream() remplacent les hooks correspondants définis au niveau de l’Agent. Lorsqu’un Workspace définit également tools.hooks, les hooks du Workspace s’exécutent dans le wrapper de hooks de l’Agent.
Remplacements d’EditorLien direct vers Remplacements d’Editor
Lorsque vous enregistrez le MastraEditor, le champ editor contrôle les parties d’un Agent défini dans le code qui peuvent être modifiées au moyen d’Editor. Les champs appartenant au code sont en lecture seule dans Studio et sont retirés des remplacements enregistrés.
editor?:
false pour verrouiller l’Agent. Définissez instructions: true pour autoriser la modification des instructions. Définissez tools: true pour autoriser la modification de l’appartenance et de la description des Tools, ou tools: { description: true } pour n’autoriser que la modification des descriptions.Les valeurs id, name et model de l’Agent proviennent toujours du code et ne peuvent pas être remplacées au moyen d’Editor. Consultez Editor pour découvrir son utilisation.