> 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/inner-workflows.md).

# 内部Workflow

この **内部ワークフロー** ブロック（`roboflow_core/inner_workflow@v1`）を使用すると、あるワークフロー定義を別のワークフロー定義内に埋め込めます。 **コンパイル時**に、エンジンは保存済みワークフローの参照を解決し、 **合成** （ネスト制限とサイクル）を検証し、 **パラメータバインディング**を検証してから、 **インライン展開し、** 子のステップを親に取り込みます。コンパイル後には独立した「ネストされた実行」は存在しません。グラフは、それらのステップを親レベルで記述した場合と同じです。

このページでは、ブロック、コンパイル時パイプライン、制限、および最小限の Python 例について説明します。一般的なコンパイル段階については、 [ワークフロー定義のコンパイル](/workflows/ja/gaido/developer-guide/compiler.md).

{% hint style="info" %}
この機能は Execution Engine に実装されています **v1**。内部ワークフローブロックの `run()` メソッドは実行時には使用されません。ステップはコンパイル中に削除されます。
{% endhint %}

## 内部ワークフローブロック

各内部ワークフローステップは、親の `steps` リスト内にある、次の `type: "roboflow_core/inner_workflow@v1"`.

### 子定義の指定方法

指定する必要があるのは **いずれか**:

* **`workflow_definition`**：完全なネストされたワークフロー JSON オブジェクト（ルートワークフローと同じ形状： `version`, `inputs`, `steps`, `outputs`), **または**
* **`workflow_workspace_id`** および **`workflow_id`**、オプションの **`workflow_version_id`**。これにより、コンパイル時に保存済みワークフロー仕様を読み込みます。

同じステップで **してはなりません** インラインの `workflow_definition` と参照フィールドの両方を設定することはできません。

### `parameter_bindings`

`parameter_bindings` は、その **キー** が **名前** であるオブジェクトです。対象は **子ワークフローの** 内にあるエントリです。 `inputs` 配列。各 **値** は、親の **セレクター** （またはエンジンが変換できる値）です。対象は **親** スコープで、通常は次のとおりです。

* `$inputs.<parent_input_name>` 親ワークフローの入力の場合、または
* `$steps.<parent_step_name>.<output_property>` 先行する親ステップによって生成されたデータの場合。

**ルール：**

* 親からの値を **必要とする** すべての子入力は、 `parameter_bindings`, **に含める必要があります。ただし、** 型が `WorkflowParameter` / `InferenceParameter` で、子定義内に **null ではない** `default_value` を宣言している入力は除きます。これらは省略できます。定義がインライン展開される際に子のデフォルトが適用されます。
* 子入力名ではないキーは、コンパイル時に拒否されます。
* 子ステップは、以下を通じて親データを利用する必要があります。 **`$inputs.<child_input_name>`** ネストされた定義内では、コンパイラがインライン展開中にこれらの参照をバインドされた親セレクター（または挿入されたデフォルト）に置き換えます。

### 親から子出力を参照する

ネストされたワークフローの `outputs` 配列では、 **JsonField** を持つエントリが定義されます。 `name` および `セレクター`。コンパイル後、親は内部ステップを、それらの JsonField にちなんだ名前の出力を持つ論理ブロックとして扱います。 **`name`** 値。

親からは次のように参照します：

```
$steps.<inner_step_name>.<child_output_name>
```

ここで `<child_output_name>` は、子の `name` 内にある JsonField のフィールドであり、 `outputs`必ずしも最後のステップ名ではありません。

## コンパイル時パイプライン（Execution Engine v1）

次の場合、 `compile_workflow_graph` が実行されると、内部ワークフローは以下の処理を通過します。 **これは、メインの「ワークフロー定義の解析」ステップの** 前に行われます：

1. **参照解決（正規化）**\
   以下を使用するすべてのステップ： `workflow_workspace_id` / `workflow_id` （およびオプションの `workflow_version_id`）は、インラインの `workflow_definition`に解決されます。これはネストされた定義内でも再帰的に行われます。
   * デフォルトのリゾルバーは Roboflow API と **`workflows_core.api_key`** をワークフロー初期化パラメータで使用します（ワークスペースが `"local"` である場合、またはカスタムリゾルバーを指定する場合を除く）。
   * 初期化パラメータでオーバーライドします： **`workflows_core.inner_workflow_spec_resolver`**：呼び出し可能な `(workspace_id, workflow_id, workflow_version_id, init_parameters) -> dict` で、子ワークフロー JSON を返します。
2. **合成の検証**\
   エンジンは次のものを構築します： **合成グラフ**：親ワークフローのフィンガープリントから子定義のフィンガープリントへの、各 `inner_workflow` ステップごとに 1 本のエッジ。その後、次を確認します：
   * グラフが **非巡回** であること（A → B → … → A がない）、
   * **ネストの深さ** がルートから **`WORKFLOWS_MAX_INNER_WORKFLOW_DEPTH`**,
   * 以内であること、 **総数** （エッジ）である内部ワークフローステップが **`WORKFLOWS_MAX_INNER_WORKFLOW_COUNT`**&#x4EE5;内であること。\
     「 [制限と環境変数](#limits-and-environment-variables) 」を以下で参照してください。
3. **インライン展開**\
   各 `inner_workflow` ステップは通常のステップに展開されます。子ステップ名は次の形式になります： **`{inner_step_name}__{child_step_name}`** （衝突処理あり）。セレクターは書き換えられ（`$inputs` / `$steps` は子内で使用され、親からの以下への参照： `$steps.<inner_step_name>…`）、その後、内部ステップは削除されます。残りのコンパイル処理（解析、ワークフロー仕様の検証、実行グラフの構築、ステップの初期化）では、フラットなワークフローのみが扱われます。
4. **解析と検証**\
   フラット化された JSON はブロックマニフェストを使用して解析され、 `validate_workflow_specification` が実行され、他のワークフローと同様に実行グラフが構築されます。

## 例（Python）

以下のパターンは、 `examples/workflows/inner_workflows/main.py` にあるこのリポジトリの例に一致します。ID で保存済みワークフローを解決し、親画像を子が期待する入力名にバインドしてから、下流の親ステップで子出力を利用します。

```python
import json
import os

from inference.core.managers.base import ModelManager
from inference.core.registries.roboflow import RoboflowModelRegistry
from inference.core.workflows.core_steps.common.entities import StepExecutionMode
from inference.core.workflows.execution_engine.core import ExecutionEngine
from inference.models.utils import ROBOFLOW_MODEL_TYPES

WORKFLOW_DEFINITION = {
    "version": "1.0",
    "inputs": [
        {"type": "WorkflowImage", "name": "image"},
    ],
    "steps": [
        {
            "type": "roboflow_core/inner_workflow@v1",
            "name": "inner",
            "workflow_workspace_id": "your-workspace",
            "workflow_id": "your-workflow-id",
            "workflow_version_id": "optional-version-id",
            "parameter_bindings": {
                "image": "$inputs.image",
            },
        },
        {
            "type": "roboflow_core/roboflow_classification_model@v2",
            "name": "classification",
            "images": "$steps.inner.dynamic_crop_output",
            "model_id": "resnet50",
        },
    ],
    "outputs": [
        {
            "type": "JsonField",
            "name": "predictions",
            "selector": "$steps.classification.predictions",
        },
    ],
}

if __name__ == "__main__":
    model_registry = RoboflowModelRegistry(ROBOFLOW_MODEL_TYPES)
    model_manager = ModelManager(model_registry=model_registry)

    execution_engine = ExecutionEngine.init(
        workflow_definition=WORKFLOW_DEFINITION,
        init_parameters={
            "workflows_core.model_manager": model_manager,
            "workflows_core.api_key": os.getenv("ROBOFLOW_API_KEY"),
            "workflows_core.step_execution_mode": StepExecutionMode.LOCAL,
        },
    )

    result = execution_engine.run(
        runtime_parameters={
            "image": {
                "type": "file",
                "value": "/path/to/your/image.jpg",
            },
        },
    )

    print(json.dumps(result, indent=2, default=str))
```

ワークスペース、ワークフロー、バージョン、モデル、出力セレクター、および画像パスを、保存済みワークフローと親グラフに一致する値へ置き換えてください。重要な要件は、 **`parameter_bindings`** キーが **子** ワークフローの `inputs[].name` フィールドと一致することです。

## 制限と環境変数

| 変数                                   | デフォルト | 意味                                                                                  |
| ------------------------------------ | ----- | ----------------------------------------------------------------------------------- |
| `WORKFLOWS_MAX_INNER_WORKFLOW_DEPTH` | `4`   | 最大 **深さ** は、ルートワークフローから見た合成グラフの深さです。直接の各 `inner_workflow` 子は、パスに沿って 1 レベルとして数えられます。 |
| `WORKFLOWS_MAX_INNER_WORKFLOW_COUNT` | `32`  | 最大 **数** の `inner_workflow` ネストされた定義全体にわたるステップ数（各内部ステップは合成グラフ内の 1 エッジです）。           |

**サイクル：** 合成グラフは **DAG**でなければなりません。各ワークフローのステップごとの実行グラフが非巡回であっても、ネストされた参照のサイクル（たとえば、ワークフロー A が B を埋め込み、B が A を埋め込む）は作成できません。

違反すると、コンパイル時エラー（`InnerWorkflowNestingDepthError`, `InnerWorkflowTotalCountError`, `InnerWorkflowCompositionCycleError`など）が発生し、深さ、数、またはサイクルへの関与を説明するメッセージが表示されます。

## 関連資料

* [ワークフロー定義](/workflows/ja/gaido/developer-guide/definitions.md) - JSON の形状、入力、ステップ、出力
* [コンパイラ](/workflows/ja/gaido/developer-guide/compiler.md) - 全体的なコンパイル段階
* [ワークフロー実行](/workflows/ja/gaido/developer-guide/workflow-execution.md) - コンパイル後の実行時動作
