신호 제공자
추가된 항목: @mastra/core@1.39.0
신호 제공자를 구축하기 위한 추상 기본 클래스입니다. 신호 제공자는 외부 소스(API, 웹후크, 이벤트 스트림)를 모니터링하고 내장된 구독 레지스트리를 통해 알림 신호를 Agent 스레드에 푸시합니다.
신호 Provider는 기본적으로 프로세서가 아닙니다. Agent 실행을 가로채야 하는 Provider는 getInputProcessors() 또는 getOutputProcessors()에서 프로세서를 반환합니다. Agent가 호출할 수 있는 Tool을 노출하는 Provider는 getTools()에서 해당 Tool을 반환합니다.
즉시 사용 가능한 웹훅 기반 공급자에 대해서는 다음을 참조하세요.WebhookSignalProvider.
사용예사용예에 대한 직접 링크
30초마다 API를 확인하는 폴링 제공자:
import { SignalProvider } from '@mastra/core/signals'
import type { SignalSubscription } from '@mastra/core/signals'
class SlackSignals extends SignalProvider<'slack-signals'> {
readonly id = 'slack-signals'
readonly pollInterval = 30_000
async poll(subscriptions: SignalSubscription[]) {
for (const sub of subscriptions) {
const messages = await fetchSlackMessages(sub.externalResourceId)
if (messages.length > 0) {
await this.notify(
{
source: 'slack',
kind: 'new-messages',
summary: `${messages.length} new messages in ${sub.externalResourceId}`,
},
{ threadId: sub.threadId, resourceId: sub.resourceId },
)
}
}
}
}
Agent에 등록하세요:
import { Agent } from '@mastra/core/agent'
const agent = new Agent({
id: 'agent',
signals: [new SlackSignals()],
})
Agent는 connect(this)를 호출하고 Provider가 반환하는 모든 프로세서 또는 Tool을 등록합니다. 그런 다음 폴링을 시작합니다.
생성자 매개변수생성자 매개변수에 대한 직접 링크
SignalProvider는 추상 클래스입니다. 서브클래스는 인수 없이 super()를 호출합니다.
속성속성에 대한 직접 링크
id:
name?:
pollInterval?:
poll()을 호출합니다. 웹훅 전용 Provider의 경우 undefined 또는 0으로 두세요.isConnected:
connect()가 호출된 후 true를 반환합니다. Agent.__fork() 중 재연결을 건너뛰기 위해 내부적으로 사용됩니다.행동 양식행동 양식에 대한 직접 링크
연결연결에 대한 직접 링크
connect(agent)connectagent에 대한 직접 링크
Agent 생성자에 의해 호출됩니다. 공급자가 Agent에 신호를 다시 보낼 수 있도록 양방향 링크를 설정합니다. 링크가 설정된 후 추가 설정을 실행하려면 재정의하세요. 항상 전화해super.connect(agent).
class MySignals extends SignalProvider<'my-signals'> {
readonly id = 'my-signals'
override connect(agent) {
super.connect(agent)
// additional setup after agent link is established
}
}
__registerMastra(mastra)__registermastramastra에 대한 직접 링크
공급자의 Agent가 Mastra 인스턴스에 등록될 때 호출됩니다. 스토리지 또는 기타 Mastra 서비스에 액세스하려면 재정의하세요. 항상 전화해super.__registerMastra(mastra).
override __registerMastra(mastra) {
super.__registerMastra(mastra)
// this.mastra is now available
}
프로세서 및 Tool 통합프로세서 및 Tool 통합에 대한 직접 링크
getInputProcessors()getinputprocessors에 대한 직접 링크
이 공급자를 Agent에 등록해야 하는 반환 입력 프로세서입니다. 공급자가 Agent 입력 단계(예: 컨텍스트 힌트 삽입 또는 Tool 호출 감지)를 가로채는 경우 재정의합니다.
getInputProcessors() {
return [this]
}
보고:InputProcessorOrWorkflow[]
getOutputProcessors()getoutputprocessors에 대한 직접 링크
이 공급자를 Agent에 등록해야 하는 반환 출력 프로세서입니다. 공급자가 Agent 출력 단계를 가로채는 경우 재정의합니다.
getOutputProcessors() {
return [this]
}
보고:OutputProcessorOrWorkflow[]
getTools()gettools에 대한 직접 링크
이 공급자가 Agent에 노출하는 반환 Tool입니다. 공급자가 구독 또는 구독 취소 명령과 같은 Agent 호출 가능 Tool을 추가하면 재정의됩니다.
getTools() {
return {
subscribe_pr: createTool({ /* ... */ }),
unsubscribe_pr: createTool({ /* ... */ }),
}
}
보고:Record<string, unknown>
구독 추적구독 추적에 대한 직접 링크
subscribe(target, externalResourceId, metadata?)subscribetarget-externalresourceid-metadata에 대한 직접 링크
외부 리소스에 대한 스레드를 구독합니다. 이는 보호된 메서드입니다. 공급자 구현 내에서 호출하세요.
const sub = this.subscribe(
{ threadId: 'thread-1', resourceId: 'user-1' },
'github:mastra-ai/mastra#123',
{ pr: 123 },
)
반환: SignalSubscription: 생성된 구독 또는 메타데이터가 병합된 기존 구독입니다.
target:
threadId와 resourceId를 포함해야 합니다.externalResourceId:
"github:owner/repo#123").metadata?:
unsubscribe(target, externalResourceId)unsubscribetarget-externalresourceid에 대한 직접 링크
구독을 제거합니다.
const removed = this.unsubscribe(
{ threadId: 'thread-1', resourceId: 'user-1' },
'github:mastra-ai/mastra#123',
)
반환: boolean: 제거되었으면 true, 일치하는 구독이 없었으면 false입니다.
getSubscriptions()getsubscriptions에 대한 직접 링크
이 공급자에 대한 모든 활성 구독을 반환합니다.
const allSubs = this.getSubscriptions()
보고:SignalSubscription[]
getSubscriptionsForResource(externalResourceId)getsubscriptionsforresourceexternalresourceid에 대한 직접 링크
특정 외부 리소스에 대한 모든 구독을 반환합니다.
const subs = this.getSubscriptionsForResource('github:mastra-ai/mastra#123')
for (const sub of subs) {
await this.notify(
{ source: 'my-provider', kind: 'update', summary: 'Resource updated' },
{ threadId: sub.threadId, resourceId: sub.resourceId },
)
}
보고:SignalSubscription[]
getSubscriptionsForThread(target)getsubscriptionsforthreadtarget에 대한 직접 링크
특정 스레드에 대한 모든 구독을 반환합니다.
const subs = this.getSubscriptionsForThread({
threadId: 'thread-1',
resourceId: 'user-1',
})
보고:SignalSubscription[]
hasSubscription(target, externalResourceId)hassubscriptiontarget-externalresourceid에 대한 직접 링크
구독이 존재하는지 확인하세요.
if (this.hasSubscription(target, 'github:mastra-ai/mastra#123')) {
// already subscribed
}
보고:boolean
unsubscribeAll(target)unsubscribealltarget에 대한 직접 링크
스레드에 대한 모든 구독을 제거합니다.
const removed = this.unsubscribeAll({
threadId: 'thread-1',
resourceId: 'user-1',
})
반환: number: 제거된 구독 수입니다.
subscriptionCountsubscriptioncount에 대한 직접 링크
이 공급자에 대한 총 활성 구독 수입니다.
if (this.subscriptionCount === 0) {
// nothing to poll
}
보고:number
투표투표에 대한 직접 링크
poll(subscriptions)pollsubscriptions에 대한 직접 링크
모든 활성 구독과 함께 각 폴링 주기마다 호출됩니다. 외부 소스를 확인하고 알림을 내보내려면 재정의하세요. 프레임워크는 폴링 주기가 겹치는 것을 방지합니다. poll() 호출이 pollInterval보다 오래 걸리면 다음 주기를 건너뜁니다.
async poll(subscriptions: SignalSubscription[]) {
for (const sub of subscriptions) {
const events = await checkExternalSource(sub.externalResourceId)
for (const event of events) {
await this.notify(
{ source: 'my-provider', kind: event.type, summary: event.message },
{ threadId: sub.threadId, resourceId: sub.resourceId },
)
}
}
}
startPolling()startpolling에 대한 직접 링크
폴링 타이머를 시작합니다. Agent가 connect()를 호출한 후 사용됩니다. 멱등성을 가지므로 여러 번 호출해도 추가 효과가 없습니다.
provider.startPolling()
stopPolling()stoppolling에 대한 직접 링크
폴링 타이머를 중지합니다.
provider.stopPolling()
웹훅웹훅에 대한 직접 링크
handleWebhook(request)handlewebhookrequest에 대한 직접 링크
들어오는 웹훅 요청을 처리합니다. 페이로드를 구문 분석하고 구독과 일치시킨 다음 알림 신호를 보내도록 재정의하세요. 바로 사용할 수 있는 구현은 WebhookSignalProvider를 참조하세요.
웹훅 요청을 확인한 후 애플리케이션 정의 HTTP 엔드포인트에서 이 메서드를 호출하세요.
async handleWebhook(request) {
const payload = request.body as { repo: string, event: string }
const subs = this.getSubscriptionsForResource(payload.repo)
for (const sub of subs) {
await this.notify(
{ source: 'github', kind: payload.event, summary: `Event on ${payload.repo}` },
{ threadId: sub.threadId, resourceId: sub.resourceId },
)
}
return { status: 200, body: { matched: subs.length } }
}
보고:Promise<{ status?: number; body?: unknown }>
수명주기수명주기에 대한 직접 링크
start()start에 대한 직접 링크
비동기 초기화를 실행하기 위해 connect() 후에 호출됩니다. 설정에 Agent 또는 Mastra 인스턴스가 필요할 때 재정의하세요.
async start() {
await this.loadInitialState()
}
stop()stop에 대한 직접 링크
종료 시 호출됩니다. 기본 구현은 폴링을 중지하고 모든 구독을 지웁니다.
provider.stop()
알림알림에 대한 직접 링크
notify(notification, target)notifynotification-target에 대한 직접 링크
연결된 Agent에게 알림 신호를 보냅니다. 이것은 보호된 편의 포장지입니다.agent.sendNotificationSignal().
await this.notify(
{
source: 'my-provider',
kind: 'pr-updated',
summary: 'PR #123 was updated',
priority: 'high',
payload: { prNumber: 123 },
},
{ threadId: 'thread-1', resourceId: 'user-1' },
)
notification:
source:
kind:
"pr-updated", "new-message").summary:
priority?:
payload?:
target:
threadId와 resourceId를 포함해야 합니다.유형유형에 대한 직접 링크
SignalSubscriptionsignalsubscription에 대한 직접 링크
에서 반환한 구독 객체subscribe().
id:
providerId:
threadId:
resourceId:
externalResourceId:
"github:owner/repo#123").subscribedAt:
metadata:
SignalProviderTargetsignalprovidertarget에 대한 직접 링크
특정 Agent 스레드를 식별합니다.
threadId:
resourceId:
agentId?:
타입 가드타입 가드에 대한 직접 링크
isSignalProvider(obj)issignalproviderobj에 대한 직접 링크
런타임 확인SignalProvider instances.
import { isSignalProvider } from '@mastra/core/signals'
if (isSignalProvider(obj)) {
obj.connect(agent)
}
보고:boolean