Skip to content

プラグインシステムの概要

N.E.K.O. のプラグインシステムは、プロセス隔離非同期 IPC に基づいた Python ベースのプラグインフレームワークです。シンプルな機能から複雑なプロトコルブリッジまで、さまざまなユースケースに対応する 3 つの開発パラダイム — PluginExtensionAdapter — をサポートしています。

アーキテクチャ

┌────────────────────────────────────────────────────┐
│              Main Process (Host)                   │
│  ┌──────────────────────────────────────────────┐  │
│  │   Plugin Host (core/)                        │  │
│  │   - プラグインライフサイクル管理              │  │
│  │   - バスシステム(メモリ、イベント、メッセージ)│  │
│  │   - Extension インジェクション               │  │
│  │   - ZMQ IPC トランスポート                   │  │
│  └──────────────────────────────────────────────┘  │
│  ┌──────────────────────────────────────────────┐  │
│  │   Plugin Server (server/)                    │  │
│  │   - HTTP API エンドポイント (FastAPI)         │  │
│  │   - プラグインレジストリ                      │  │
│  │   - メッセージキュー                          │  │
│  └──────────────────────────────────────────────┘  │
└────────────────────┬───────────────────────────────┘
                     │ ZMQ IPC
      ┌──────────────┼──────────────┬────────────────┐
      ▼              ▼              ▼                ▼
  Plugin A       Plugin B      Extension C      Adapter D
  (プロセス)     (プロセス)    (インジェクト)    (プロセス)

3 つの開発パラダイム

パラダイムインポート元ユースケース実行方法
Pluginplugin.sdk.plugin独立した機能(検索、リマインダーなど)別プロセス
Extensionplugin.sdk.extension既存プラグインへのルート/フックの追加ホストプラグインプロセスにインジェクト
Adapterplugin.sdk.adapter外部プロトコル(MCP、NoneBot)を内部プラグイン呼び出しにブリッジゲートウェイパイプライン付き別プロセス

どれを使うべきか?

  • 「新しいスタンドアロン機能を追加したい」Plugin を使用
  • 「既存プラグインに追加コマンドを拡張したい」Extension を使用
  • 「MCP/NoneBot/外部プロトコルの呼び出しを受け付けてプラグインにルーティングしたい」Adapter を使用

99% の開発者は Plugin だけで十分です。まずはそこから始めましょう。

主な機能

  • プロセス隔離 — 各プラグインは別プロセスで実行され、クラッシュしてもホストに影響しません
  • 非同期サポート — 同期・非同期の両方のエントリーポイントに対応
  • Result 型 — 型安全なエラーハンドリングのための Ok/Err(通常フローで例外を使用しない)
  • フックシステム — AOP のための @before_entry@after_entry@around_entry@replace_entry
  • プラグイン間呼び出し — プラグイン間通信のための self.plugins.call_entry("other_plugin:entry_id")
  • メモリクライアント — ホストメモリシステムにアクセスするための self.memory
  • システム情報 — ホストシステムのメタデータを照会するための self.system_info
  • プラグインストア — 永続的なキーバリューストレージのための PluginStore
  • バスシステム — イベントの pub/sub のための self.bus
  • 動的エントリー — 実行時にエントリーポイントを登録/解除
  • 静的 UI — プラグインディレクトリから Web UI を配信
  • ライフサイクルフックstartupshutdownreloadfreezeunfreezeconfig_change
  • タイマータスク@timer_interval による定期実行
  • メッセージハンドラー — ホストシステムからのメッセージに反応

プラグインディレクトリ構造

plugin/plugins/
└── my_plugin/
    ├── __init__.py      # プラグインコード(エントリーポイント)
    ├── plugin.toml      # プラグイン設定
    ├── config.json      # オプション:カスタム設定
    ├── data/            # オプション:ランタイムデータディレクトリ
    └── static/          # オプション:Web UI ファイル

クイックリンク

MIT ライセンスの下で公開。