コンポーネント: イベントリスナー
このコンポーネントはパイプラインの処理を拡張します。メッセージ受信やメンバー参加などの Bot イベントを処理する場合は、イベントプロセッサーを参照してください。
LangBotのパイプラインは実行時にイベントを生成し、プラグインがフックして処理できるようにします。各プラグインは1つのイベントリスナー(components/event_listener/default.yaml)のみを持つことができますが、その中で任意の数のイベントを登録できます。
イベントリスナーコンポーネントの追加
プラグインディレクトリでコマンドlbp comp EventListenerを実行します。イベントリスナーコンポーネントの作成には設定は必要ありません。
➜ HelloPlugin > lbp comp EventListener
Generating component EventListener...
Component EventListener generated successfully.
組件 EventListener 生成成功。これにより、components/event_listener/ディレクトリにdefault.yamlとdefault.pyファイルが生成されます。.yamlファイルはイベントリスナーの基本情報を定義し、.pyファイルはイベントリスナーハンドラです:
➜ HelloPlugin > tree
...
├── components
│ ├── __init__.py
│ └── event_listener
│ ├── __init__.py
│ ├── default.py
│ └── default.yaml
...マニフェストファイル: イベントリスナー
各プラグインは1つのイベントリスナーのみを持つことができるため、マニフェストファイルでの変更は必要ありません。
プラグイン処理
以下のコードがデフォルトで生成されます(components/event_listener/default.py)。DefaultEventListenerクラスのinitializeメソッドでイベント処理ロジックを登録して実装する必要があります。
# Auto generated by LangBot Plugin SDK.
# Please refer to https://langbot.app/docs/en/plugin/dev/tutor.html for more details.
from __future__ import annotations
from langbot_plugin.api.definition.components.common.event_listener import EventListener
from langbot_plugin.api.entities import events, context
class DefaultEventListener(EventListener):
async def initialize(self):
await super().initialize()
"Fill with your code here"特定のイベントのリスナーを追加:
...
class DefaultEventListener(EventListener):
async def initialize(self):
await super().initialize()
@self.handler(events.PersonMessageReceived)
async def handler(event_context: context.EventContext):
print("Hello LangBot Plugin!")
print(event_context)
await event_context.reply(
platform_message.MessageChain([
platform_message.Plain(text=f"Hello from Nahida Plugin!"),
])
)このコードは、PersonMessageReceived(プライベートチャットからのメッセージを受信)イベントのリスナーを登録し、イベントがトリガーされたときにイベントコンテキスト(EventContext)情報を出力し、イベントコンテキストAPIを呼び出してメッセージで返信します。
EventContextはこのイベントトリガーの共通コンテキスト情報を保存し、EventContext.eventはPersonMessageReceived(または他の対応するイベントタイプ)のオブジェクトで、イベントの詳細情報を保存します。
# EventContext定義の概要
class EventContext(pydantic.BaseModel):
"""イベントコンテキスト、このイベント実行の情報を保存"""
...
event: pydantic.SerializeAsAny[BaseEventModel]
"""イベントオブジェクト、具体的な型はハンドラ登録時に指定された型、events.pyで見つけることができます"""
...イベント登録
イベント登録は@self.handlerデコレータを通じて実装され、デコレータのパラメータはイベントタイプです。監視可能なすべてのイベントはlangbot_plugin.api.entities.builtin.eventsで定義されています。
1 つの installation、複数の用途
同じイベントリスナーは複数の Workspace、複数のイベントから同時に呼び出されます:
- イベント単位の状態(カウンタ、直近のイベント、会話マップなど)をインスタンスに蓄積しないでください。同時実行のコールバックが互いを上書きします。
- コールバックは現在の
EventContextからのみデータを取得し、コンテキストやそのフィールドを呼び出しをまたいで再利用しないでください。 - 呼び出しをまたいで保持するデータは Host ストレージに置き、キーに installation の識別子とイベントに関連する識別子(Workspace、会話など)を含めてください。
- installation 単位でプロセス内状態を保持する場合は、
on_installation_revoked(binding)で解放してください。
完全な仕様は認証プラグインと共有実行を参照してください。
次のステップ
イベントリスナーの基本情報を学びました。次は:
- パイプラインイベントでイベントの種類とフィールドを確認します。
- 完全な
EventContextAPI リファレンスを確認します。 - LangBot APIを確認します。
