WebhookSignalProvider
新增於: @mastra/core@1.39.0
用於 push 型 event 傳遞的具體 Signal Provider。它會使用可設定的 resource ID extractor 比對 payload,將傳入的 webhook payload 路由至已訂閱的 Agent thread。
擴充 SignalProvider,提供公開的 subscription 管理功能與內建的 handleWebhook() 實作。
使用範例「使用範例」的直接連結
將 GitHub webhook event 路由至已訂閱的 thread:
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,
}),
})
向 Agent 註冊,並讓 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
Constructor 參數「Constructor 參數」的直接連結
id?:
name?:
extractResourceId?:
undefined 可略過 event,也可傳回陣列以比對多項資源。buildNotification?:
方法「方法」的直接連結
Subscription 管理「Subscription 管理」的直接連結
subscribeThread(target, externalResourceId, metadata?)「subscribethreadtarget-externalresourceid-metadata」的直接連結
訂閱 thread,使其接收特定外部資源的 webhook event。
webhookProvider.subscribeThread(
{ threadId: 'thread-1', resourceId: 'user-1' },
'mastra-ai/mastra',
{ watchType: 'push' },
)
傳回:SignalSubscription
target:
threadId 與 resourceId。externalResourceId:
metadata?:
unsubscribeThread(target, externalResourceId)「unsubscribethreadtarget-externalresourceid」的直接連結
取消 thread 對特定外部資源的訂閱。
const removed = webhookProvider.unsubscribeThread(
{ threadId: 'thread-1', resourceId: 'user-1' },
'mastra-ai/mastra',
)
傳回:boolean
Webhook 處理「Webhook 處理」的直接連結
handleWebhook(request)「handlewebhookrequest」的直接連結
處理傳入的 webhook request。從 payload 擷取 resource ID、尋找符合的 subscription、為每個 subscription 建立通知,並呼叫 notify()。
const result = await webhookProvider.handleWebhook({
body: { repository: { full_name: 'mastra-ai/mastra' }, action: 'push' },
headers: { 'x-github-event': 'push' },
})
傳回:Promise<{ status: number; body: { matched: number } }>
傳回 { status: 200, body: { matched: N } },其中 N 是收到通知的 subscription 數量。無法擷取 resource ID 或沒有符合的 subscription 時,傳回 matched: 0。
request:
body:
headers:
靜態 Signal factory「靜態 Signal factory」的直接連結
WebhookSignalProvider.signals.subscribe(externalResourceId)「webhooksignalprovidersignalssubscribeexternalresourceid」的直接連結
建立 reactive signal 輸入,讓目前 thread 訂閱外部資源。
const signal = WebhookSignalProvider.signals.subscribe('mastra-ai/mastra')
傳回:{ type: 'reactive'; tagName: string; contents: string; attributes: { resource: string } }
WebhookSignalProvider.signals.unsubscribe(externalResourceId)「webhooksignalprovidersignalsunsubscribeexternalresourceid」的直接連結
建立 reactive signal 輸入,讓目前 thread 取消訂閱外部資源。
const signal = WebhookSignalProvider.signals.unsubscribe('mastra-ai/mastra')
傳回:{ type: 'reactive'; tagName: string; contents: string; attributes: { resource: string } }