> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/workflows/ja/gaido/developer-guide/block-bundling.md).

# ブロックをプラグインにまとめる

Workflowsエコシステムを効率的に管理するには、ブロックを構築して配布するための標準化された方法が不可欠です。これにより、ユーザーは独自のブロックを作成し、それらをWorkflowプラグインにまとめることができます。Workflowプラグインは本質的には、定義されたインターフェースを実装し、さまざまな方法で構成できるPythonライブラリです。

このページでは必須のインターフェース要件を説明し、 [Workflowsのバージョン管理](/workflows/ja/gaido/developer-guide/versioning.md) ガイドラインに沿ったブロックの構成を提案します。

## プラグインの提案構成

プラグインの構成は次のようにすることを提案します。

```
.
├── requirements.txt   # 要件を記載したファイル
├── setup.py           # 必要なら別のパッケージ作成方法を使ってください
├── {plugin_name}
│   ├── __init__.py    # ローダーを含むメインモジュール
│   ├── kinds.py       # 任意 - カスタムkindの定義
│   ├── {block_name}   # あなたのブロック用パッケージ
│   │   ├── v1.py      # あなたのブロックのバージョン1
│   │   ├── ...        # ... 次のバージョン
│   │   └── v5.py      # あなたのブロックのバージョン5
│   └── {block_name}   # 別のブロック用パッケージ
└── tests              # ブロックのテスト
```

## 必須インターフェース

プラグインは、標準のPythonライブラリに比べて `__init__.py` に対してメインパッケージ内でいくつかの拡張を提供するだけでよいです。

* `load_blocks()` ブロックのクラス一覧を提供する関数（必須）
* `load_kinds()` プラグインが定義するすべてのカスタム [kinds](/workflows/ja/gaido/developer-guide/kinds.md) を返す関数（任意）
* `REGISTERED_INITIALIZERS` ブロックの初期化パラメータ名を既定値、またはその値を生成する引数なし関数に対応付ける辞書を持つモジュールプロパティ - 任意

### `load_blocks()` 関数

この関数は、プラグイン内のすべてのブロックを列挙することを想定しています - 1つのブロックを一度だけ定義することができます。

例:

```python
from typing import List, Type
from inference.core.workflows.prototypes.block import WorkflowBlock

# この例では、プラグイン名が `my_plugin` であり、
# ここでインポートされるブロックを定義したと仮定します
from my_plugin.block_1.v1 import Block1V1
from my_plugin.block_2.v1 import Block2V1

def load_blocks() -> List[Type[WorkflowBlock]]:
    return [
        Block1V1,
        Block2V1,
]
```

### `load_kinds()` 関数

`load_kinds()` この関数は、プラグインが定義するすべてのカスタムkindを返します。ブロックがカスタムkindを必要としない場合もあるため、これは任意です。

例:

```python
from typing import List
from inference.core.workflows.execution_engine.entities.types import Kind

# この例では、プラグイン名が `my_plugin` であり、
# インポートするkindを定義しました
from my_plugin.kinds import MY_KIND

def load_kinds() -> List[Kind]:
    return [MY_KIND]
```

## `REGISTERED_INITIALIZERS` 辞書

ご存じのとおり、 [Workflows Compilerを説明するドキュメント](/workflows/ja/gaido/developer-guide/compiler.md) および [ブロック開発ガイド](/workflows/ja/gaido/developer-guide/create-a-block.md)では、Workflowブロックはコンパイル中に動的に初期化され、コンストラクタ引数を必要とする場合があります。これらの引数は、 `REGISTERED_INITIALIZERS` 辞書に登録された値を既定値として使えます。ブロックの初期化パラメータの既定値を公開するには、初期化パラメータ名とその値（またはその値を生成する関数）を辞書に登録するだけです。すべてのブロックがコンストラクタを必要とするわけではないため、これはプラグインインターフェースの任意の部分です。

例:

```python
import os

def init_my_param() -> str:
    # ここで初期化
    return "some-value"

REGISTERED_INITIALIZERS = {
    "param_1": 37,
    "param_2": init_my_param,
}
```

## のシリアライザとデシリアライザ *Kinds*

カスタムシリアライザとデシリアライザのサポートは、Execution Engineで導入されました `v1.3.0`。このバージョン以降、Execution Engineが任意のものをシリアライズおよびデシリアライズするために使用すべきカスタム関数を指定できます。 [*種類*](/workflows/ja/gaido/developer-guide/kinds.md).

デシリアライザは、ワイヤ経由で送信された入力を、ブロックで使用される内部データ表現にデコードする方法を決定します。一方、シリアライザは、Workflowの結果をワイヤ経由で送信する必要がある場合に有用です。

以下に、任意のkindに対するシリアライザとデシリアライザを追加する方法の例を示します。コードはメイン `__init__.py` に配置してください。

```python
from typing import Any

def serialize_kind(value: Any) -> Any:
  # ここに、次の用途で使うコードを配置します
  # 内部の Workflows データ表現を次へ変換するための 
  # 外部の表現へ（JSON でワイヤ経由で送信できます。使用するのは
  # Python のデフォルト JSON エンコーダです）。
  pass

def deserialize_kind(parameter_name: str, value: Any) -> Any:
  # ここに、デコードに使うコードを配置します 
  # ワイヤ経由で送られたデータを Execution Engine に取り込み
  # そして、それを適切な内部 Workflows データ表現に変換する
  # ブロックが理解できる形式です。
  pass

KINDS_SERIALIZERS = {
    "name_of_the_kind": serialize_kind,
}
KINDS_DESERIALIZERS = {
    "name_of_the_kind": deserialize_kind,
}
```

### ヒントとコツ

* 各シリアライザは、シリアライズする値を受け取り、シリアライズ済みの値（標準のPython JSONエンコーダーが受け付けるもの）を返す関数でなければなりません。
* 各デシリアライザは、2つの引数を受け取る関数でなければなりません。1つはデシリアライズされるWorkflow入力の名前、もう1つはデシリアライズされる値です。この関数の目的は、入力データを期待される内部表現に合わせることです。
* *Kinds* から `roboflow_core` プラグインには、すでに適切なシリアライザとデシリアライザがあります
* でデータがシリアライズされる方法が気に入らない場合は `roboflow_core` プラグイン内で、次のためのシリアライズメソッドを自由に変更してください *kinds*、プラグインに関数を登録して Execution Engine に読み込むだけです。最後に定義された serializer/deserializer が使用されます。

## Workflowsエコシステムでプラグインを有効にする

プラグインを読み込むには、次のことを行う必要があります。

* Workflowsを実行する環境に、プラグインを含むPythonパッケージをインストールする
* という名前の環境変数をエクスポートし、 `WORKFLOWS_PLUGINS` 読み込みたいプラグイン名をカンマ区切りで設定します。
  * 例: 2つのプラグインを読み込むには `plugin_a` と `plugin_b`、次を実行する必要があります `export WORKFLOWS_PLUGINS="plugin_a,plugin_b"`
