WebhookSignalProvider
Ajouté dans : @mastra/core@1.39.0
Provider de Signal concret pour la distribution d'événements par envoi push. Achemine les charges utiles des webhooks entrants vers les threads d'Agent abonnés en recherchant une correspondance au moyen d'un extracteur configurable d'identifiant de ressource.
Étend SignalProvider avec une gestion publique des abonnements et une implémentation intégrée de handleWebhook().
Exemple d'utilisationLien direct vers Exemple d'utilisation
Acheminez les événements des webhooks GitHub vers les threads abonnés :
import { WebhookSignalProvider } from '@mastra/core/signals'
const webhookProvider = new WebhookSignalProvider({
extractResourceId: payload => `${payload.repository?.full_name}`,
buildNotification: (payload, subscription) => ({
source: 'github-webhook',
kind: payload.action ?? 'event',
summary: `${payload.action} on ${subscription.externalResourceId}`,
payload,
}),
})
Enregistrez le Provider auprès d'un Agent et abonnez un thread :
import { Agent } from '@mastra/core/agent'
const agent = new Agent({
id: 'agent',
signals: [webhookProvider],
})
// subscribe a thread to a specific repo
webhookProvider.subscribeThread({ threadId: 'thread-1', resourceId: 'user-1' }, 'mastra-ai/mastra')
// handle an incoming webhook
const result = await webhookProvider.handleWebhook({
body: { repository: { full_name: 'mastra-ai/mastra' }, action: 'push' },
headers: {},
})
// result.matched === 1
Paramètres du constructeurLien direct vers Paramètres du constructeur
id?:
name?:
extractResourceId?:
undefined pour ignorer l'événement. Peut renvoyer un tableau afin d'établir une correspondance avec plusieurs ressources.buildNotification?:
MéthodesLien direct vers Méthodes
Gestion des abonnementsLien direct vers Gestion des abonnements
subscribeThread(target, externalResourceId, metadata?)Lien direct vers subscribethreadtarget-externalresourceid-metadata
Abonne un thread aux événements des webhooks d'une ressource externe précise.
webhookProvider.subscribeThread(
{ threadId: 'thread-1', resourceId: 'user-1' },
'mastra-ai/mastra',
{ watchType: 'push' },
)
Renvoie : SignalSubscription
target:
threadId et resourceId.externalResourceId:
metadata?:
unsubscribeThread(target, externalResourceId)Lien direct vers unsubscribethreadtarget-externalresourceid
Désabonne un thread d'une ressource externe précise.
const removed = webhookProvider.unsubscribeThread(
{ threadId: 'thread-1', resourceId: 'user-1' },
'mastra-ai/mastra',
)
Renvoie : boolean
Gestion des webhooksLien direct vers Gestion des webhooks
handleWebhook(request)Lien direct vers handlewebhookrequest
Traite une requête de webhook entrante. Extrait l'identifiant de ressource de la charge utile, recherche les abonnements correspondants, construit une notification pour chacun, puis appelle notify().
const result = await webhookProvider.handleWebhook({
body: { repository: { full_name: 'mastra-ai/mastra' }, action: 'push' },
headers: { 'x-github-event': 'push' },
})
Renvoie : Promise<{ status: number; body: { matched: number } }>
Renvoie { status: 200, body: { matched: N } }, où N correspond au nombre d'abonnements qui ont reçu des notifications. Renvoie matched: 0 lorsqu'aucun identifiant de ressource n'a pu être extrait ou qu'aucun abonnement ne correspond.
request:
body:
headers:
Fabriques de Signals statiquesLien direct vers Fabriques de Signals statiques
WebhookSignalProvider.signals.subscribe(externalResourceId)Lien direct vers webhooksignalprovidersignalssubscribeexternalresourceid
Crée une entrée de Signal réactive qui abonne le thread actuel à une ressource externe.
const signal = WebhookSignalProvider.signals.subscribe('mastra-ai/mastra')
Renvoie : { type: 'reactive'; tagName: string; contents: string; attributes: { resource: string } }
WebhookSignalProvider.signals.unsubscribe(externalResourceId)Lien direct vers webhooksignalprovidersignalsunsubscribeexternalresourceid
Crée une entrée de Signal réactive qui désabonne le thread actuel d'une ressource externe.
const signal = WebhookSignalProvider.signals.unsubscribe('mastra-ai/mastra')
Renvoie : { type: 'reactive'; tagName: string; contents: string; attributes: { resource: string } }